purebasic.info

PureBasic forum
Текущее время: Пн сен 16, 2019 1:52 am

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




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

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


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

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 890
Благодарил (а): 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
 



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

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 5


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

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