Доброго дня. Прошу помочь разобраться с перерисовкой графических фигур в окне. Не могу понять каким образом "заставить" программу перерисовать окно после удаления фигуры (DeleteObject) в одном месте окна и создания оной (CreatePolygonRgn) в другом. Перерисовка окна функцией (InvalidateRgn) с параметром "фон стереть" удалят (делает невидимыми) оба региона, старый и новый. Что само по себе разумеется нормально. Однако, если сразу за этим выполнить (InvalidateRgn) с "фон оставить" то ничего абсолютно не происходит. Новы регион остаётся невидимым (не закрашенным). Но, выполнив эту функцию спустя какое то время, регион становится видимым. Я в своем примере например повесил его на отдельную кнопку. Однако нормальным такое положение вещей назвать трудно. Что я делаю не так? УПД Для наглядности происходящего по приходу в окно сообщения WM_PAINT в код добавлена свистелка. Которая например показала что функция UpdateWindow (пробовал как альтернативу InvalidateRgn) почем то обновлять окно вовсе не собирается. Хотя и ошибки не выдаёт. Спойлер: Исходник с моим головняком Код (ASM): format PE GUI 4.0 entry Start include 'win32a.inc' ;------------------------------------------------------------------------------- struct PL ver1 POINT ver2 POINT ver3 POINT ver4 POINT ver5 POINT ver6 POINT ends ;------------------------------------------------------------------------------- section '.text' code readable executable Start: invoke GetModuleHandle, 0 mov [wc.hInstance], eax invoke LoadIcon, 0, IDI_APPLICATION mov [wc.hIcon], eax invoke LoadCursor, 0, IDC_ARROW mov [wc.hCursor], eax invoke RegisterClass, wc test eax, eax jz error invoke CreateWindowEx, 0, _class, _title, WS_VISIBLE + WS_DLGFRAME + WS_SYSMENU,\ 150, 150, 500, 500, NULL, NULL, [wc.hInstance], NULL test eax, eax jz error msg_loop: invoke GetMessage, msg, NULL, 0, 0 cmp eax, 1 jb end_loop jne msg_loop invoke TranslateMessage, msg invoke DispatchMessage, msg jmp msg_loop ;=============================================================================== error: invoke MessageBox, NULL, _error, NULL, MB_ICONERROR + MB_OK end_loop: invoke ExitProcess, [msg.wParam] ;******************************************************************************* proc WindowProc uses ebx esi edi, hwnd, wmsg, wparam, lparam cmp [wmsg],WM_CREATE je .wmcreate cmp [wmsg],WM_COMMAND je .wmcommand cmp [wmsg],WM_DESTROY je .wmdestroy cmp [wmsg], WM_PAINT ; , je .wmpaint jmp .defwndproc ;=============================================================================== .wmpaint: invoke Beep,5000,100 invoke Beep,3000,100 call Hexagon ; нарисовать шестигранник и закрасить jmp .defwndproc ;=============================================================================== .wmcreate: invoke CreateWindowEx,0,clas_but,text_1,WS_VISIBLE+WS_CHILD+ BS_PUSHBUTTON,20,420,100,30,[hwnd],1001,[wc.hInstance],0 invoke CreateWindowEx,0,clas_but,text_2,WS_VISIBLE+WS_CHILD+ BS_PUSHBUTTON,120,420,100,30,[hwnd],1002,[wc.hInstance],0 invoke GetDC, [hwnd] ; извлекает дескриптор дисплейного контекста устройства test eax,eax je error mov [hdc], eax ; сохраняем дескрипто ;------------------------------------------------------------------------------- invoke CreateSolidBrush, [blue] ; создает логическую кисть, которая имеет заданный сплошной тон mov [hBrush], eax ; возвращаемое значение идентифицирует логическую кисть invoke CreateSolidBrush, [black] ; создает логическую кисть, которая имеет заданный сплошной тон mov [hBrush_2], eax ; возвращаемое значение идентифицирует логическую кисть ;------------------------------------------------------------------------------- ; call Hexagon ; нарисовать шестигранник и закрасить jmp .defwndproc ;=============================================================================== .wmcommand: cmp [wparam],1001 ; кнопка смещене je .but1 cmp [wparam],1002 ; кнопка обновить jne .defwndproc jmp .but2 ;------------------------------------------------------------------------------- .but1: add [_X],100 add [_Y],100 ; invoke OffsetRgn,[h_Rgn],100,100 ; cmp eax,ERROR ; je error invoke DeleteObject,[h_Rgn] ; удалить регион cmp eax,0 je error ;------------------------------------------------------------------------------ call Hexagon ; нарисовать шестигранник и закрасить invoke InvalidateRgn,[hwnd],0,1 ; 1 - фон стерть , 0 - фон оставить cmp eax,0 je error invoke InvalidateRgn,[hwnd],0,0 cmp eax,0 je error jmp .defwndproc ;------------------------------------------------------------------------------ .but2: ; invoke UpdateWindow,[hwnd] ; cmp eax,0 ; je error invoke InvalidateRgn,[hwnd],0,0 cmp eax,0 je error jmp .defwndproc ;=============================================================================== .defwndproc: invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam] jmp .finish .wmdestroy: invoke PostQuitMessage,0 xor eax, eax .finish: ret endp ;=============================================================================== proc Hexagon ; шестигранник ; Y mov edi,[_Y] mov [pl.ver1.y],edi ; mov [pl.ver4.y],edi ; add edi,26 ; mov [pl.ver5.y],edi ; mov [pl.ver6.y],edi ; sub edi,52 ; mov [pl.ver2.y],edi ; mov [pl.ver3.y],edi ; ;------------------------------------------------------------------------------- ; X mov esi,[_X] sub esi,30 ; mov [pl.ver1.x],esi ; add esi,15 ; mov [pl.ver2.x],esi ; mov [pl.ver6.x],esi ; add esi,30 ; mov [pl.ver3.x],esi ; mov [pl.ver5.x],esi ; add esi,15 ; mov [pl.ver4.x],esi ; invoke CreatePolygonRgn,pl,6,WINDING ; создать шестигранник cmp eax,0 je error mov [h_Rgn], eax ; дескриптор области invoke FillRgn, [hdc], [h_Rgn], [hBrush] ; 3аполнить область, используя указанную кисть cmp eax,0 je error ret endp ;=============================================================================== section '.data' data readable writeable hdc rd 1 h_Rgn rd 1 hBrush rd 1 clas_but db 'BUTTON',0 text_1 db 'Смещение',0 text_2 db 'Обновить',0 blue dd 0ff0033h ; цвет заливки black dd 0330033h _X dd 50 _Y dd 50 reg_4 dd 0,150,500,150,500,160,0,160 h_reg_4 dd 0 hBrush_2 rd 1 _class TCHAR 'FASMWIN32', 0 _title TCHAR 'Win32 program template', 0 _error TCHAR 'Startup failed.', 0 wc WNDCLASS 0, WindowProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _class msg MSG pl PL ;=============================================================================== section '.idata' import data readable writeable library kernel32, 'KERNEL32.DLL',user32, 'USER32.DLL',gdi32, "gdi32.dll" include 'api\kernel32.inc' include 'api\user32.inc' include 'api\gdi32.inc'
Вопрос закрыт. Решение найдено. Спойлер: Рабочий код Код (ASM): format PE GUI 4.0 entry Start include 'win32a.inc' ;------------------------------------------------------------------------------- struct PL ver1 POINT ver2 POINT ver3 POINT ver4 POINT ver5 POINT ver6 POINT ends ;------------------------------------------------------------------------------- section '.text' code readable executable Start: invoke GetModuleHandle, 0 mov [wc.hInstance], eax invoke LoadIcon, 0, IDI_APPLICATION mov [wc.hIcon], eax invoke LoadCursor, 0, IDC_ARROW mov [wc.hCursor], eax invoke RegisterClass, wc test eax, eax jz error invoke CreateWindowEx, 0, _class, _title, WS_VISIBLE + WS_DLGFRAME + WS_SYSMENU,\ 150, 150, 500, 500, NULL, NULL, [wc.hInstance], NULL test eax, eax jz error msg_loop: invoke GetMessage, msg, NULL, 0, 0 cmp eax, 1 jb end_loop jne msg_loop invoke TranslateMessage, msg invoke DispatchMessage, msg jmp msg_loop ;=============================================================================== error: invoke MessageBox, NULL, _error, NULL, MB_ICONERROR + MB_OK end_loop: invoke ExitProcess, [msg.wParam] ;******************************************************************************* proc WindowProc uses ebx esi edi, hwnd, wmsg, wparam, lparam cmp [wmsg],WM_CREATE je .wmcreate cmp [wmsg],WM_COMMAND je .wmcommand cmp [wmsg],WM_DESTROY je .wmdestroy cmp [wmsg], WM_PAINT ; , je .wmpaint jmp .defwndproc ;=============================================================================== .wmpaint: ; invoke Beep,5000,100 ; invoke Beep,3000,100 invoke BeginPaint,[hwnd],lppaint cmp eax,0 je error ;------------------------------------------------------------------------------- call Polygon_6 ;------------------------------------------------------------------------------- invoke EndPaint,[hwnd],lppaint cmp eax,0 je error jmp .defwndproc ;=============================================================================== .wmcreate: invoke CreateWindowEx,0,clas_but,text_1,WS_VISIBLE+WS_CHILD+ BS_PUSHBUTTON,20,420,100,30,[hwnd],1001,[wc.hInstance],0 ; invoke CreateWindowEx,0,clas_but,text_2,WS_VISIBLE+WS_CHILD+ BS_PUSHBUTTON,120,420,100,30,[hwnd],1002,[wc.hInstance],0 invoke GetDC, [hwnd] ; извлекает дескриптор дисплейного контекста устройства test eax,eax je error mov [hdc], eax ; сохраняем дескрипто ;------------------------------------------------------------------------------- invoke CreateSolidBrush, [blue] ; создает логическую кисть, которая имеет заданный сплошной тон mov [hBrush], eax ; возвращаемое значение идентифицирует логическую кисть invoke CreateSolidBrush, [black] ; создает логическую кисть, которая имеет заданный сплошной тон mov [hBrush_2], eax ; возвращаемое значение идентифицирует логическую кисть jmp .defwndproc ;=============================================================================== .wmcommand: cmp [wparam],1001 ; кнопка смещене je .but1 ; cmp [wparam],1002 ; кнопка обновить ; jne .defwndproc ; jmp .but2 ;------------------------------------------------------------------------------- .but1: add [_X],20 add [_Y],20 invoke DeleteObject,[h_Rgn] ; удалить регион cmp eax,0 je error invoke InvalidateRgn,[hwnd],0,1 cmp eax,0 je error jmp .defwndproc ;.but2: ; invoke InvalidateRgn,[hwnd],0,0 ; cmp eax,0 ; je error ; jmp .defwndproc ;=============================================================================== .defwndproc: invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam] jmp .finish .wmdestroy: invoke PostQuitMessage,0 xor eax, eax .finish: ret endp ;=============================================================================== ;=============================================================================== proc Polygon_6 ; шестигранник ; Y mov edi,[_Y] mov [pl.ver1.y],edi ; mov [pl.ver4.y],edi ; add edi,26 ; mov [pl.ver5.y],edi ; mov [pl.ver6.y],edi ; sub edi,52 ; mov [pl.ver2.y],edi ; mov [pl.ver3.y],edi ; ;------------------------------------------------------------------------------- ; X mov esi,[_X] sub esi,30 ; mov [pl.ver1.x],esi ; add esi,15 ; mov [pl.ver2.x],esi ; mov [pl.ver6.x],esi ; add esi,30 ; mov [pl.ver3.x],esi ; mov [pl.ver5.x],esi ; add esi,15 ; mov [pl.ver4.x],esi ; invoke CreatePolygonRgn,pl,6,WINDING ; функция создает шестигранник mov [h_Rgn], eax ; возвращаемое значение является дескриптор области invoke FillRgn, [hdc], [h_Rgn], [hBrush] ; функция заполняет область, используя указанную кисть ret endp ;=============================================================================== ;=============================================================================== section '.data' data readable writeable hdc rd 1 h_Rgn rd 1 hBrush rd 1 clas_but db 'BUTTON',0 text_1 db 'Смещение',0 text_2 db 'Обновить',0 blue dd 0ff0033h ; цвет заливки black dd 0330033h _X dd 50 _Y dd 50 reg_4 dd 0,150,500,150,500,160,0,160 h_reg_4 dd 0 hBrush_2 rd 1 _class TCHAR 'FASMWIN32', 0 _title TCHAR 'Win32 program template', 0 _error TCHAR 'Startup failed.', 0 wc WNDCLASS 0, WindowProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _class msg MSG pl PL lppaint PAINTSTRUCT ;=============================================================================== section '.idata' import data readable writeable library kernel32, 'KERNEL32.DLL',user32, 'USER32.DLL',gdi32, "gdi32.dll" include 'api\kernel32.inc' include 'api\user32.inc' include 'api\gdi32.inc'
После чистки пришли нотифи, это хорошо. Даже с обьяснением. Но они ведь пришли локально, тоесть мне и тс ? А вот это не правильно. Для других прочих это утеря инфы, мы возвращаемся в тему про подлог.
Поясню для "других". Тема висела без ответа до тех пор пока на другом форуме мне не подсказали как и что. Полученный результат (ответ на свой вопрос) я выложил на данном форуме для тех, кому он мог бы пригодиться и без поиска в гугле. Блекотня от Indy_, не имеет к решению задачи никакого отношения и являла собой обычный флуд. Собственно как и сейчас. И была потерта модератором. За что ему отдельное спасибо.
Полный 30h, Поясняю для особо одарённых. Тут есть по работе ресурса тех задачи, удаление/редактирование сообщений одна из самых важных, ваша тема как пример просто. По самой же теме обсуждать нечего, но если что то не понятно - гото учить матчасть, для начала фундаментальную по синхронизациям. Что в разных потоках освобождать ресурсы и их использовать асинхронно по мойму понятно должно быть каждому, так как это очевидно.)