purebasic.info

PureBasic forum
Текущее время: Вс окт 20, 2019 9:15 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Перерисовка окна в WIn api
СообщениеДобавлено: Пт сен 13, 2019 7:17 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Собственно хочу спросить как правильно перерисовывать окно(картинку предыдущего ресования вывода в окно) в сообщении wm_paint.
PS:Всё же хочу сделать свой класс канваса(точнее несколько вариантов),уже и фон типа придумал и 30 состояний от мышки,теперь думаю событие перерисовки окна при сворачивании перетаскивании. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Сб сен 14, 2019 7:55 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Накидал сейчас некое подобие варианта сохранения.
понятно дело надо к окну привязывать память и немного по другому наверное.
PS:Жду критику. :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 
 
 
Procedure Refresh(hwnd,zadanie.i)
  Static numberkontekstov.i=-1
  Static Dim kontekstokna.i(0)
  Static Dim hwndokna.i(0)
  Protected clientRectt.RECT
  Protected hdcMem.i
  Protected hbmMem.i
  Protected hdcc.i
 
  GetClientRect_(hwnd,@clientRectt);получаем клиентскую область окна
  hdcc=GetDC_(hwnd);получаем контекст окна
If zadanie=1;все окна копируем в память ввиде битмапа
  If numberkontekstov>-1
    numberkontekstov+1
    ReDim kontekstokna(numberkontekstov):ReDim hwndokna(numberkontekstov)
  Else
    numberkontekstov+1
  EndIf
  hdcMem = CreateCompatibleDC_(hdcc);создает контекст устройства памяти (DC), совместимый с указанным устройством
  hbmMem= CreateCompatibleBitmap_(hdcc,clientRectt\right,clientRectt\bottom);создаём объект(шаблон) картинки bitmap
  SelectObject_(hdcMem,hbmMem);в памяти создаётся поле под bitmap
  DeleteObject_(hbmMem);больше шаблон bitmapa не нужен
  BitBlt_(hdcMem, 0, 0,clientRectt\right,clientRectt\bottom, hdcc, 0, 0,#SRCCOPY);копирование картинки из контекста окна в память ввиде поля bitmap
 ;
; BitBlt_(GetDC_(GadgetID(1)), 0, 0,clientRectt\right,clientRectt\bottom, hdcMem, 0, 0,#SRCCOPY);типа теста из памяти копируем в другой гаджет
  Debug numberkontekstov
  Debug hdcMem
  hwndokna(numberkontekstov)=hwnd
  kontekstokna(numberkontekstov)=hdcMem
 
ElseIf zadanie=2;восстанавливаем окна из памяти копируя в контекст окна
   For i=0 To numberkontekstov
     If hwndokna(i)=hwnd
       hdcMem=kontekstokna(i)
       Break
      EndIf
    Next
    Debug numberkontekstov
    Debug hdcMem
   BitBlt_(hdcc, 0, 0,clientRectt\right,clientRectt\bottom, hdcMem, 0, 0,#SRCCOPY);копируем из памяти в контекст окна
   DeleteDC_(hdcMem);удаляем память
   
   numberkontekstov-1
   If numberkontekstov>-1
    ReDim kontekstokna(numberkontekstov):ReDim hwndokna(numberkontekstov)
   EndIf
 EndIf
ReleaseDC_(hwnd,hdcc);освобождаем контекст
EndProcedure
Global rodnoycalbak.i
 
 
Procedure canvas_calbak(hWnd, Msg, wParam, lParam);теперь все сообщения канвасов обрабатываются в своём обработчике
 
  Select Msg
     Case #WM_RBUTTONDOWN
 
     Case #WM_LBUTTONDOWN
       Refresh(GadgetID(0),1)
       ;для теста сотрём картинку
       StartDrawing(CanvasOutput(0))
        Box(0,0,450,500,$655555)
       StopDrawing()
      Case #WM_MOUSEMOVE
       
      Case #WM_LBUTTONUP
        Refresh(GadgetID(0),2);перерисовка из памяти
   
   EndSelect
   ProcedureReturn CallWindowProc_(rodnoycalbak, hWnd, Msg, wParam, lParam);Rezultat
EndProcedure
Procedure.i CanvasGadgett(id,x,y,x1,y1,flagi=0)
  Protected hwnd
  hwnd= CanvasGadget(id,x,y,x1,y1,flagi)
  rodnoycalbak=SetWindowLongPtr_(hwnd, #GWL_WNDPROC,@canvas_calbak())
  ProcedureReturn hwnd
EndProcedure
 
If OpenWindow(0,0,0,1000,500,"Rectangle Selection Demo",#PB_Window_SystemMenu| #PB_Window_SizeGadget | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
  CanvasGadgett(0,0,0,450,500,#PB_Canvas_Clip);нажатая мышь только в окне
  CanvasGadgett(1,500,0,500,500)
 
  StartDrawing(CanvasOutput(0))
 
     DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($00FFFF)
      FrontColor($FF0000)
     
      LinearGradient(0, 0, 200, 200)    
      Circle(100, 100, 100)  
      LinearGradient(350, 100, 250, 100)
      Circle(300, 100, 100)
  StopDrawing()
  Repeat ; event loop
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
EndSelect
  ForEver
EndIf
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Пт сен 20, 2019 6:25 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Что не кто не знает что ли? :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Пт сен 20, 2019 8:06 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11536
Благодарил (а): 4 раз.
Поблагодарили: 473 раз.
Сообщение WM_PAINT отравляет система при необходимости перерисовки. Зачем еще что-то придумывать?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Сб сен 21, 2019 11:06 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Сообщение то отправляет только вот его ообработать нужно соответствующеи образом. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Сб сен 21, 2019 11:38 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11536
Благодарил (а): 4 раз.
Поблагодарили: 473 раз.
http://vsokovikov.narod.ru/New_MSDN_API ... _paint.htm

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Сб сен 21, 2019 1:02 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Не всё так просто.
Выше описанный способ реализовать можно только через обработчик главного окна,так как дочернии не получают
сообщений сворачивания только Wm_paint при разворачивании.
Есть такой,вариант если в классе указано #CS_VREDRAW и #CS_HREDRAW(у главного окна это похоже указано) ,то система сама запоминает (точнее наверное не стирает память окна)при сворачивании и её (картинку)оттуда можно перерисовать через сообщение #WM_NCCALCSIZE в главном окне
Как это сделать правильно? что то заголовок трёт при перерисовки. :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
 
 
 
Procedure Refresh(hwnd,zadanie.i)
  Static numberkontekstov.i=-1
  Static Dim kontekstokna.i(0)
  Static Dim hwndokna.i(0)
  Protected clientRectt.RECT
  Protected hdcMem.i
  Protected hbmMem.i
  Protected hdcc.i
 
  GetClientRect_(hwnd,@clientRectt);получаем клиентскую область окна
  hdcc=GetDC_(hwnd);получаем контекст окна
If zadanie=1;все окна копируем в память ввиде битмапа
  If numberkontekstov>-1
    numberkontekstov+1
    ReDim kontekstokna(numberkontekstov):ReDim hwndokna(numberkontekstov)
  Else
    numberkontekstov+1
  EndIf
  hdcMem = CreateCompatibleDC_(hdcc);создает контекст устройства памяти (DC), совместимый с указанным устройством
  hbmMem= CreateCompatibleBitmap_(hdcc,clientRectt\right,clientRectt\bottom);создаём объект(шаблон) картинки bitmap
 
  SelectObject_(hdcMem,hbmMem);в памяти создаётся поле под bitmap
  DeleteObject_(hbmMem);больше шаблон bitmapa не нужен
  BitBlt_(hdcMem, 0, 0,clientRectt\right,clientRectt\bottom, hdcc, 0, 0,#SRCCOPY);копирование картинки из контекста окна в память ввиде поля bitmap
 ;
 ;BitBlt_(GetDC_(GadgetID(1)), 0, 0,300,300, hdcMem, 0, 0,#SRCCOPY);типа теста из памяти копируем в другой гаджет
  Debug numberkontekstov
  Debug hdcMem
  hwndokna(numberkontekstov)=hwnd
  kontekstokna(numberkontekstov)=hdcMem
 
ElseIf zadanie=2;восстанавливаем окна из памяти копируя в контекст окна
   For i=0 To numberkontekstov
     If hwndokna(i)=hwnd
       hdcMem=kontekstokna(i)
       Break
      EndIf
    Next
    Debug numberkontekstov
    Debug hdcMem
   BitBlt_(hdcc, 0, 0,clientRectt\right,clientRectt\bottom, hdcMem, 0, 0,#SRCCOPY);копируем из памяти в контекст окна
   DeleteDC_(hdcMem);удаляем память
   
   numberkontekstov-1
   If numberkontekstov>-1
    ReDim kontekstokna(numberkontekstov):ReDim hwndokna(numberkontekstov)
   EndIf
 EndIf
ReleaseDC_(hwnd,hdcc);освобождаем контекст
EndProcedure
Global rodnoycalbak.i
Global wincalbak.i
Procedure win_calbak(hWnd, Msg, wParam, lParam);теперь все сообщения канвасов обрабатываются в своём обработчике
Debug "win_calbak"
;Debug hWnd  
Debug Msg;
Select Msg
 
     Case #WM_NCCALCSIZE
       Debug "#WM_NCCALCSIZE"
       Debug wParam
        ;wParam=0
       *NCCALCSIZE_PARAMS.NCCALCSIZE_PARAMS=lParam
       Debug *NCCALCSIZE_PARAMS\lppos\hwndInsertAfter
       Debug *NCCALCSIZE_PARAMS\lppos\flags
       ;*NCCALCSIZE_PARAMS\lppos\flags=2
      ; *NCCALCSIZE_PARAMS\lppos\hwndInsertAfter=-2
        ;
       ;*NCCALCSIZE_PARAMS\lppos\flags =#SWP_SHOWWINDOW|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_NOSIZE; & #SWP_NOCOPYBITS;#SWP_NOREDRAW
       Debug *NCCALCSIZE_PARAMS\lppos\flags
 
       GetWindowRect_(hwnd,*NCCALCSIZE_PARAMS\rgrc[0])
       Debug *NCCALCSIZE_PARAMS\rgrc[0]\left
 
       GetClientRect_(hwnd,*NCCALCSIZE_PARAMS\rgrc[1])
       
       GetClientRect_(hwnd,*NCCALCSIZE_PARAMS\rgrc[2])
 
       *NCCALCSIZE_PARAMS\lppos\hwnd=hwnd
       *NCCALCSIZE_PARAMS\lppos\hwndInsertAfter=0
       *NCCALCSIZE_PARAMS\lppos\flags=#SWP_NOOWNERZORDER|#SWP_NOSENDCHANGING|#SWP_NOSIZE|#SWP_SHOWWINDOW|#SWP_DRAWFRAME
 
       ProcedureReturn #WVR_VALIDRECTS;#WVR_HREDRAW|#WVR_VREDRAW|#WVR_ALIGNLEFT|#WVR_ALIGNTOP|#WVR_REDRAW;
     ;; ProcedureReturn DefWindowProc_(hwnd, message, wparam, lparam)
       
 
   EndSelect
   ProcedureReturn CallWindowProc_(wincalbak, hWnd, Msg, wParam, lParam)
EndProcedure
Procedure canvas_calbak(hWnd, Msg, wParam, lParam);теперь все сообщения канвасов обрабатываются в своём обработчике
  Debug "canvas_calbak"
  Debug Msg
 Select Msg
   Case 133
     ; Debug Msg
     Case #WM_RBUTTONDOWN
 
     Case #WM_LBUTTONDOWN
       ;Refresh(GadgetID(0),1)
       ;для теста сотрём картинку
       ;StartDrawing(CanvasOutput(0))
       ; Box(0,0,450,500,$655555)
      ; StopDrawing()
      Case #WM_MOUSEMOVE
       
      Case #WM_LBUTTONUP
        Refresh(GadgetID(0),2)
      Case #WM_NCCALCSIZE
        Debug "#WM_NCCALCSIZE"
        Debug wParam
   EndSelect
   ProcedureReturn CallWindowProc_(rodnoycalbak, hWnd, Msg, wParam, lParam);Rezultat
EndProcedure
Procedure.i CanvasGadgett(id,x,y,x1,y1,flagi=0)
  Protected hwnd
  hwnd= CanvasGadget(id,x,y,x1,y1,flagi)
  rodnoycalbak=SetWindowLongPtr_(hwnd, #GWL_WNDPROC,@canvas_calbak())
  SetWindowLongPtr_(hwnd,-8,WindowID(0))
  ProcedureReturn hwnd
EndProcedure
 
If OpenWindow(0,0,0,1000,500,"Rectangle Selection Demo",#PB_Window_SystemMenu| #PB_Window_SizeGadget | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
 
 
 
 
 
   
  wincalbak=SetWindowLongPtr_(WindowID(0), #GWL_WNDPROC,@win_calbak())
  CanvasGadgett(0,0,0,450,500,#PB_Canvas_Clip);нажатая мышь только в окне
  CanvasGadgett(1,500,0,500,500)
 
  StartDrawing(CanvasOutput(0))
 
     DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($00FFFF)
      FrontColor($FF0000)
     
      LinearGradient(0, 0, 200, 200)    
      Circle(100, 100, 100)  
      LinearGradient(350, 100, 250, 100)
      Circle(300, 100, 100)
  StopDrawing()
  Repeat ; event loop
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
EndSelect
  ForEver
EndIf
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Ср окт 02, 2019 6:29 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Почти 1000 просмотров и нет никаких вариантов. :?: :roll:
PS:Наверное придётся дальше мыслить в выходные.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Ср окт 02, 2019 8:42 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11536
Благодарил (а): 4 раз.
Поблагодарили: 473 раз.
Сергейчик писал(а):
нет никаких вариантов
Видимо никто не понимает в чем сложность.
В частности непонятно зачем использовать CanvasGadget и что-то придумывать на его основе. Почему не создать окно функцией CreateWindow и не рисовать по нему?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Чт окт 03, 2019 6:16 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Пётр писал(а):
Сергейчик писал(а):
нет никаких вариантов
Видимо никто не понимает в чем сложность.
В частности непонятно зачем использовать CanvasGadget и что-то придумывать на его основе. Почему не создать окно функцией CreateWindow и не рисовать по нему?

Окно для рисования и создаётся CreateWindow а не CanvasGadget(это просто как пример).
А вот главное окно OpenWindow хотелось оставить. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Чт окт 03, 2019 2:58 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
Создал сложный рисунок, получил его в виде растрового изображения, а потом обычным способом перерисовываешь его с вызовом WM_PAINT.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Пн окт 07, 2019 12:21 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
Сергейчик
WM_ACTIVATE при сворачивании и разворачивании, там wParam старшее слово
0 - окно не свёрнуто
32 - окно свёрнуто

WM_NCLBUTTONDOWN - клик на заголовке вполне можно скопировать окно, если будет проблема с WM_ACTIVATE по причине срабатывания после того как будет свёрнуто.

WM_ENTERSIZEMOVE - тоже можно сделать копию в память перед перемещением окна.

Но это если сложная функция рисования и вызывает мерцание при перерисовки.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Вт окт 08, 2019 9:13 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
WM_ACTIVATE,Какое окно если по условию их дочерних несколько?
Или каждому посылается сообщение,или всё же только главному?
С этим WM_NCLBUTTONDOWN тоже будет ерунда.
PS:Тут вижу один из вариантов копировать в память при сворачивании только с сообщения главному окну формы
и проверяя список созданных дочерних окон(с их контекста),и второй иметь постоянные контексты памяти для дочерних окон, где созданные картинки, которые и копировать то по сути ненужно а только вновь отрисовать(вот по этому пути и собираюсь идти к тому же скорость рисования в контекст памяти в два три раза выше чем в контекст окна). :roll:
А #WM_NCCALCSIZE интересен тем что винда толи сама копирует в память при сворачивании толи скорее вероятнее изначально держит контекст главного окна формы совсеми дочерними с отрисованной картинкой(на все окна) в памяти и также перерисовывает при разварачивании перемещении. :?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Ср окт 09, 2019 12:07 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
Сергейчик писал(а):
в два три раза выше чем в контекст окна
потому что обновлять не надо окно за каждым шагом рисования.

Сергейчик писал(а):
Или каждому посылается сообщение,или всё же только главному?
надо ведь тестить. Во первых, первый параметр функции callback - дескриптор окна, вот и проверь меняется ли он взависимости от операцией с окном. А ещё надо тестить тип окна, возможно одни окна не получают другие получают, вот тут я задался этим вопросом, но ответа не получил, осталось только подозрение.

Из справки SetWindowCallback, писал(а):
Для того чтобы в эту процедуру перенаправить события только одного конкретного Окна, можно использовать необязательный параметр '#Window', для передачи в функцию номера этого Окна. В таком случае, на каждое Окно может приходиться по одной процедуре обратного вызова, эти процедуры будут "связаны", каждая со "своим" Окном.


На счёт WM_сообщений, я написал для случая если картинка динамическая, а если стационарная и не меняется, то конечно на старте сделал её копию и при операции перерисовки вставляешь из памяти. Почему тебе надо перерисовывать при разворачивании окна? У тебя точно она затирается? Такая вещь происходит если ты рисуешь на рабочем столе, то любое окно затирает, так как оно является элементом рабочего стола, а если в окне рисуешь то у меня не затирается, кроме как когда задвинул за край экрана.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Перерисовка окна в WIn api
СообщениеДобавлено: Ср окт 09, 2019 6:03 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 909
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
AZJIO писал(а):
Сергейчик писал(а):
в два три раза выше чем в контекст окна
потому что обновлять не надо окно за каждым шагом рисования.

Сергейчик писал(а):
Или каждому посылается сообщение,или всё же только главному?
надо ведь тестить. Во первых, первый параметр функции callback - дескриптор окна, вот и проверь меняется ли он взависимости от операцией с окном. А ещё надо тестить тип окна, возможно одни окна не получают другие получают, вот тут я задался этим вопросом, но ответа не получил, осталось только подозрение.

Из справки SetWindowCallback, писал(а):
Для того чтобы в эту процедуру перенаправить события только одного конкретного Окна, можно использовать необязательный параметр '#Window', для передачи в функцию номера этого Окна. В таком случае, на каждое Окно может приходиться по одной процедуре обратного вызова, эти процедуры будут "связаны", каждая со "своим" Окном.


На счёт WM_сообщений, я написал для случая если картинка динамическая, а если стационарная и не меняется, то конечно на старте сделал её копию и при операции перерисовки вставляешь из памяти. Почему тебе надо перерисовывать при разворачивании окна? У тебя точно она затирается? Такая вещь происходит если ты рисуешь на рабочем столе, то любое окно затирает, так как оно является элементом рабочего стола, а если в окне рисуешь то у меня не затирается, кроме как когда задвинул за край экрана.

Затирается потому что главное окно открывается пуриковским openwindows() про его калбек и пишу что он то да получает сообщения сварачивания и т.д. а вот типа дочерних окон на гаджет что я создаю вин апи получают только wm_paint на перерисовку а перехватывать мне обработчик главного окна нехочется хотя можно но нужно тогда дочернии динамические класть в список что бы знать их hwnd и контекст.
А так типа у каждого дочернего своя память под картинку куда думаю рисовать и соответственно оттуда перерисовать когда нужно.(есть там правда пока ещё несколько заморочек с фоном и другими по оптимизации). :roll:


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB