Перерисовка графического примитива

Тема в разделе "WASM.WIN32", создана пользователем Полный 30h, 21 июн 2017.

Статус темы:
Закрыта.
  1. Полный 30h

    Полный 30h Member

    Публикаций:
    0
    Регистрация:
    7 дек 2016
    Сообщения:
    36
    Адрес:
    Институт Мичурина
    Доброго дня.
    Прошу помочь разобраться с перерисовкой графических фигур в окне. Не могу понять каким образом "заставить" программу перерисовать окно после удаления фигуры (DeleteObject) в одном месте окна и создания оной (CreatePolygonRgn) в другом.
    Перерисовка окна функцией (InvalidateRgn) с параметром "фон стереть" удалят (делает невидимыми) оба региона, старый и новый. Что само по себе разумеется нормально. Однако, если сразу за этим выполнить (InvalidateRgn) с "фон оставить" то ничего абсолютно не происходит. Новы регион остаётся невидимым (не закрашенным). Но, выполнив эту функцию спустя какое то время, регион становится видимым. Я в своем примере например повесил его на отдельную кнопку. Однако нормальным такое положение вещей назвать трудно. Что я делаю не так?

    УПД Для наглядности происходящего по приходу в окно сообщения WM_PAINT в код добавлена свистелка. Которая например показала что функция UpdateWindow (пробовал как альтернативу InvalidateRgn) почем то обновлять окно вовсе не собирается. Хотя и ошибки не выдаёт.
    Код (ASM):
    1.  
    2. format PE GUI 4.0
    3. entry Start
    4. include 'win32a.inc'
    5. ;-------------------------------------------------------------------------------
    6.   struct PL
    7.     ver1 POINT
    8.     ver2 POINT
    9.     ver3 POINT
    10.     ver4 POINT
    11.     ver5 POINT
    12.     ver6 POINT
    13.   ends  
    14. ;-------------------------------------------------------------------------------
    15. section '.text' code readable executable
    16.  
    17. Start:
    18.   invoke GetModuleHandle, 0
    19.   mov [wc.hInstance], eax
    20.   invoke LoadIcon, 0, IDI_APPLICATION
    21.   mov [wc.hIcon], eax
    22.   invoke  LoadCursor, 0, IDC_ARROW                  
    23.   mov [wc.hCursor], eax
    24.   invoke RegisterClass, wc                          
    25.   test eax, eax
    26.   jz error
    27.  
    28.   invoke CreateWindowEx, 0, _class, _title, WS_VISIBLE + WS_DLGFRAME + WS_SYSMENU,\
    29.                          150, 150, 500, 500, NULL, NULL, [wc.hInstance], NULL
    30.   test eax, eax
    31.   jz error
    32.  
    33. msg_loop:
    34.   invoke GetMessage, msg, NULL, 0, 0
    35.   cmp eax, 1
    36.   jb end_loop
    37.   jne msg_loop
    38.   invoke TranslateMessage, msg
    39.   invoke DispatchMessage, msg
    40.   jmp msg_loop
    41. ;===============================================================================
    42. error:
    43.   invoke MessageBox, NULL, _error, NULL, MB_ICONERROR + MB_OK
    44. end_loop:
    45.   invoke ExitProcess, [msg.wParam]
    46. ;*******************************************************************************
    47. proc WindowProc uses ebx esi edi, hwnd, wmsg, wparam, lparam
    48.       cmp [wmsg],WM_CREATE
    49.       je .wmcreate
    50.       cmp [wmsg],WM_COMMAND
    51.       je .wmcommand
    52.       cmp [wmsg],WM_DESTROY
    53.       je .wmdestroy
    54.       cmp [wmsg], WM_PAINT ;  ,
    55.       je .wmpaint
    56.       jmp .defwndproc
    57. ;===============================================================================
    58. .wmpaint:
    59.      invoke Beep,5000,100
    60.      invoke Beep,3000,100    
    61.       call Hexagon    ; нарисовать шестигранник и закрасить    
    62.       jmp .defwndproc
    63. ;===============================================================================
    64. .wmcreate:                                                                            
    65.   invoke CreateWindowEx,0,clas_but,text_1,WS_VISIBLE+WS_CHILD+ BS_PUSHBUTTON,20,420,100,30,[hwnd],1001,[wc.hInstance],0
    66.   invoke CreateWindowEx,0,clas_but,text_2,WS_VISIBLE+WS_CHILD+ BS_PUSHBUTTON,120,420,100,30,[hwnd],1002,[wc.hInstance],0
    67.   invoke GetDC, [hwnd] ; извлекает дескриптор дисплейного контекста устройства
    68.       test eax,eax
    69.       je   error
    70.       mov [hdc], eax    ; сохраняем дескрипто
    71. ;-------------------------------------------------------------------------------
    72.   invoke CreateSolidBrush, [blue]    ; создает логическую кисть, которая имеет заданный сплошной тон
    73.       mov [hBrush], eax                ; возвращаемое значение идентифицирует логическую кисть    
    74.   invoke CreateSolidBrush, [black]    ; создает логическую кисть, которая имеет заданный сплошной тон
    75.       mov [hBrush_2], eax                ; возвращаемое значение идентифицирует логическую кисть          
    76. ;-------------------------------------------------------------------------------
    77. ;      call Hexagon    ; нарисовать шестигранник и закрасить
    78.       jmp .defwndproc
    79. ;===============================================================================
    80. .wmcommand:
    81.       cmp [wparam],1001    ; кнопка смещене
    82.       je  .but1
    83.      cmp [wparam],1002    ; кнопка обновить
    84.       jne .defwndproc
    85.       jmp .but2
    86. ;-------------------------------------------------------------------------------
    87. .but1:  
    88.         add [_X],100
    89.         add [_Y],100
    90. ;   invoke OffsetRgn,[h_Rgn],100,100
    91. ;        cmp eax,ERROR
    92. ;        je error
    93.    invoke DeleteObject,[h_Rgn] ; удалить регион
    94.         cmp eax,0
    95.         je error
    96. ;------------------------------------------------------------------------------
    97.         call Hexagon  ; нарисовать шестигранник и закрасить
    98.     invoke InvalidateRgn,[hwnd],0,1    ;  1 - фон стерть , 0 - фон оставить
    99.         cmp eax,0
    100.         je  error
    101.     invoke InvalidateRgn,[hwnd],0,0
    102.         cmp eax,0
    103.         je  error        
    104.                
    105.         jmp .defwndproc      
    106. ;------------------------------------------------------------------------------
    107. .but2:
    108. ;    invoke UpdateWindow,[hwnd]
    109. ;        cmp eax,0
    110. ;        je  error
    111.  
    112.     invoke InvalidateRgn,[hwnd],0,0
    113.         cmp eax,0
    114.         je  error
    115.        
    116.         jmp .defwndproc      
    117. ;===============================================================================
    118.      
    119. .defwndproc:
    120.     invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
    121.         jmp .finish
    122. .wmdestroy:
    123.     invoke PostQuitMessage,0
    124.         xor eax, eax
    125. .finish:
    126.   ret
    127. endp
    128. ;===============================================================================
    129. proc  Hexagon     ; шестигранник
    130. ; Y
    131.         mov  edi,[_Y]
    132.         mov  [pl.ver1.y],edi  ;
    133.         mov  [pl.ver4.y],edi  ;      
    134.         add  edi,26           ;    
    135.         mov  [pl.ver5.y],edi  ;
    136.         mov  [pl.ver6.y],edi  ;
    137.         sub  edi,52           ;
    138.         mov  [pl.ver2.y],edi  ;
    139.         mov  [pl.ver3.y],edi  ;
    140. ;-------------------------------------------------------------------------------
    141. ; X      
    142.         mov  esi,[_X]
    143.         sub  esi,30           ;
    144.         mov  [pl.ver1.x],esi  ;            
    145.         add  esi,15           ;
    146.         mov  [pl.ver2.x],esi  ;
    147.         mov  [pl.ver6.x],esi  ;        
    148.         add  esi,30           ;  
    149.         mov  [pl.ver3.x],esi  ;
    150.         mov  [pl.ver5.x],esi  ;      
    151.         add  esi,15           ;    
    152.         mov  [pl.ver4.x],esi  ;
    153.   invoke CreatePolygonRgn,pl,6,WINDING ; создать шестигранник
    154.         cmp eax,0
    155.         je error
    156.         mov [h_Rgn], eax              ; дескриптор области  
    157.   invoke FillRgn, [hdc], [h_Rgn], [hBrush] ; 3аполнить область, используя указанную кисть
    158.         cmp eax,0
    159.         je error
    160. ret
    161. endp
    162. ;===============================================================================
    163.  
    164. section '.data' data readable writeable
    165.     hdc rd 1
    166.     h_Rgn rd 1
    167.     hBrush rd 1
    168.     clas_but db 'BUTTON',0
    169.     text_1 db 'Смещение',0
    170.     text_2 db 'Обновить',0      
    171.     blue dd 0ff0033h        ; цвет заливки
    172.     black dd 0330033h
    173.     _X  dd 50
    174.     _Y  dd 50
    175.        
    176.     reg_4 dd 0,150,500,150,500,160,0,160
    177.     h_reg_4  dd 0
    178.     hBrush_2 rd 1
    179.    
    180.              
    181.     _class TCHAR 'FASMWIN32', 0
    182.     _title TCHAR 'Win32 program template', 0
    183.     _error TCHAR 'Startup failed.', 0
    184.     wc WNDCLASS 0, WindowProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _class
    185.     msg MSG
    186.     pl PL
    187. ;===============================================================================
    188. section '.idata' import data readable writeable
    189.   library kernel32, 'KERNEL32.DLL',user32, 'USER32.DLL',gdi32, "gdi32.dll"
    190.   include 'api\kernel32.inc'
    191.   include 'api\user32.inc'
    192.   include 'api\gdi32.inc'
    193.  
     
  2. Полный 30h

    Полный 30h Member

    Публикаций:
    0
    Регистрация:
    7 дек 2016
    Сообщения:
    36
    Адрес:
    Институт Мичурина
    Вопрос закрыт. Решение найдено.
    Код (ASM):
    1. format PE GUI 4.0
    2. entry Start
    3. include 'win32a.inc'
    4. ;-------------------------------------------------------------------------------
    5.   struct PL
    6.     ver1 POINT
    7.     ver2 POINT
    8.     ver3 POINT
    9.     ver4 POINT
    10.     ver5 POINT
    11.     ver6 POINT
    12.   ends
    13. ;-------------------------------------------------------------------------------
    14. section '.text' code readable executable
    15. Start:
    16.   invoke GetModuleHandle, 0
    17.   mov [wc.hInstance], eax
    18.   invoke LoadIcon, 0, IDI_APPLICATION
    19.   mov [wc.hIcon], eax
    20.   invoke  LoadCursor, 0, IDC_ARROW                
    21.   mov [wc.hCursor], eax
    22.   invoke RegisterClass, wc                        
    23.   test eax, eax
    24.   jz error
    25.   invoke CreateWindowEx, 0, _class, _title, WS_VISIBLE + WS_DLGFRAME + WS_SYSMENU,\
    26.                          150, 150, 500, 500, NULL, NULL, [wc.hInstance], NULL
    27.   test eax, eax
    28.   jz error
    29. msg_loop:
    30.   invoke GetMessage, msg, NULL, 0, 0
    31.   cmp eax, 1
    32.   jb end_loop
    33.   jne msg_loop
    34.   invoke TranslateMessage, msg
    35.   invoke DispatchMessage, msg
    36.   jmp msg_loop
    37. ;===============================================================================
    38. error:
    39.   invoke MessageBox, NULL, _error, NULL, MB_ICONERROR + MB_OK
    40. end_loop:
    41.   invoke ExitProcess, [msg.wParam]
    42. ;*******************************************************************************
    43. proc WindowProc uses ebx esi edi, hwnd, wmsg, wparam, lparam
    44.       cmp [wmsg],WM_CREATE
    45.       je .wmcreate
    46.       cmp [wmsg],WM_COMMAND
    47.       je .wmcommand
    48.       cmp [wmsg],WM_DESTROY
    49.       je .wmdestroy
    50.       cmp [wmsg], WM_PAINT ;  ,
    51.       je .wmpaint
    52.       jmp .defwndproc
    53. ;===============================================================================
    54. .wmpaint:
    55. ;     invoke Beep,5000,100
    56. ;     invoke Beep,3000,100
    57.    
    58.   invoke BeginPaint,[hwnd],lppaint  
    59.         cmp eax,0
    60.         je  error          
    61. ;-------------------------------------------------------------------------------
    62.         call Polygon_6
    63. ;-------------------------------------------------------------------------------
    64.   invoke EndPaint,[hwnd],lppaint
    65.         cmp eax,0
    66.         je  error        
    67.         jmp .defwndproc
    68. ;===============================================================================
    69. .wmcreate:                                                                          
    70.   invoke CreateWindowEx,0,clas_but,text_1,WS_VISIBLE+WS_CHILD+ BS_PUSHBUTTON,20,420,100,30,[hwnd],1001,[wc.hInstance],0
    71. ;  invoke CreateWindowEx,0,clas_but,text_2,WS_VISIBLE+WS_CHILD+ BS_PUSHBUTTON,120,420,100,30,[hwnd],1002,[wc.hInstance],0
    72.   invoke GetDC, [hwnd] ; извлекает дескриптор дисплейного контекста устройства
    73.       test eax,eax
    74.       je   error
    75.       mov [hdc], eax    ; сохраняем дескрипто
    76. ;-------------------------------------------------------------------------------
    77.   invoke CreateSolidBrush, [blue]    ; создает логическую кисть, которая имеет заданный сплошной тон
    78.       mov [hBrush], eax                ; возвращаемое значение идентифицирует логическую кисть  
    79.   invoke CreateSolidBrush, [black]    ; создает логическую кисть, которая имеет заданный сплошной тон
    80.       mov [hBrush_2], eax                ; возвращаемое значение идентифицирует логическую кисть        
    81.       jmp .defwndproc
    82. ;===============================================================================
    83. .wmcommand:
    84.       cmp [wparam],1001    ; кнопка смещене
    85.       je  .but1
    86. ;     cmp [wparam],1002    ; кнопка обновить
    87. ;      jne .defwndproc
    88. ;      jmp .but2
    89. ;-------------------------------------------------------------------------------
    90. .but1:
    91.         add [_X],20
    92.         add [_Y],20
    93.    invoke DeleteObject,[h_Rgn] ; удалить регион
    94.         cmp eax,0
    95.         je error
    96.     invoke InvalidateRgn,[hwnd],0,1
    97.         cmp eax,0
    98.         je  error    
    99.         jmp .defwndproc    
    100. ;.but2:
    101. ;    invoke InvalidateRgn,[hwnd],0,0
    102. ;        cmp eax,0
    103. ;        je  error    
    104. ;        jmp .defwndproc    
    105. ;===============================================================================    
    106. .defwndproc:
    107.     invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
    108.         jmp .finish
    109. .wmdestroy:
    110.     invoke PostQuitMessage,0
    111.         xor eax, eax
    112. .finish:
    113.   ret
    114. endp
    115. ;===============================================================================
    116. ;===============================================================================
    117. proc  Polygon_6     ; шестигранник
    118. ; Y
    119.     mov  edi,[_Y]
    120.     mov  [pl.ver1.y],edi  ;
    121.     mov  [pl.ver4.y],edi  ;      
    122.     add  edi,26           ;    
    123.     mov  [pl.ver5.y],edi  ;
    124.     mov  [pl.ver6.y],edi  ;
    125.     sub  edi,52           ;
    126.     mov  [pl.ver2.y],edi  ;
    127.     mov  [pl.ver3.y],edi  ;
    128. ;-------------------------------------------------------------------------------
    129. ; X      
    130.     mov  esi,[_X]
    131.     sub  esi,30           ;
    132.     mov  [pl.ver1.x],esi  ;            
    133.     add  esi,15           ;
    134.     mov  [pl.ver2.x],esi  ;
    135.     mov  [pl.ver6.x],esi  ;        
    136.     add  esi,30           ;  
    137.     mov  [pl.ver3.x],esi  ;
    138.     mov  [pl.ver5.x],esi  ;      
    139.     add  esi,15           ;    
    140.     mov  [pl.ver4.x],esi  ;
    141.   invoke CreatePolygonRgn,pl,6,WINDING ; функция создает шестигранник
    142.     mov [h_Rgn], eax              ;  возвращаемое значение является дескриптор области  
    143.   invoke FillRgn, [hdc], [h_Rgn], [hBrush] ; функция заполняет область, используя указанную кисть
    144. ret
    145. endp    
    146. ;===============================================================================
    147. ;===============================================================================
    148. section '.data' data readable writeable
    149.     hdc rd 1
    150.     h_Rgn rd 1
    151.     hBrush rd 1
    152.     clas_but db 'BUTTON',0
    153.     text_1 db 'Смещение',0
    154.     text_2 db 'Обновить',0    
    155.     blue dd 0ff0033h        ; цвет заливки
    156.     black dd 0330033h
    157.     _X  dd 50
    158.     _Y  dd 50  
    159.     reg_4 dd 0,150,500,150,500,160,0,160
    160.     h_reg_4  dd 0
    161.     hBrush_2 rd 1
    162.  
    163.            
    164.     _class TCHAR 'FASMWIN32', 0
    165.     _title TCHAR 'Win32 program template', 0
    166.     _error TCHAR 'Startup failed.', 0
    167.     wc WNDCLASS 0, WindowProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _class
    168.     msg MSG
    169.     pl PL
    170.     lppaint PAINTSTRUCT
    171. ;===============================================================================
    172. section '.idata' import data readable writeable
    173.   library kernel32, 'KERNEL32.DLL',user32, 'USER32.DLL',gdi32, "gdi32.dll"
    174.   include 'api\kernel32.inc'
    175.   include 'api\user32.inc'
    176.   include 'api\gdi32.inc'
     
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    После чистки пришли нотифи, это хорошо. Даже с обьяснением. Но они ведь пришли локально, тоесть мне и тс ?
    А вот это не правильно. Для других прочих это утеря инфы, мы возвращаемся в тему про подлог.
     
  4. Полный 30h

    Полный 30h Member

    Публикаций:
    0
    Регистрация:
    7 дек 2016
    Сообщения:
    36
    Адрес:
    Институт Мичурина
    Поясню для "других". Тема висела без ответа до тех пор пока на другом форуме мне не подсказали как и что. Полученный результат (ответ на свой вопрос) я выложил на данном форуме для тех, кому он мог бы пригодиться и без поиска в гугле. Блекотня от Indy_, не имеет к решению задачи никакого отношения и являла собой обычный флуд. Собственно как и сейчас. И была потерта модератором. За что ему отдельное спасибо.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Полный 30h,

    Поясняю для особо одарённых. Тут есть по работе ресурса тех задачи, удаление/редактирование сообщений одна из самых важных, ваша тема как пример просто. По самой же теме обсуждать нечего, но если что то не понятно - гото учить матчасть, для начала фундаментальную по синхронизациям. Что в разных потоках освобождать ресурсы и их использовать асинхронно по мойму понятно должно быть каждому, так как это очевидно.)
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Пока нет перехода на личности тему закрываю
     
    Полный 30h нравится это.
Статус темы:
Закрыта.