Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Эксперт быдлокодинга
 Аватар для Полный 30h
2095 / 529 / 70
Регистрация: 04.11.2010
Сообщений: 1,314
FASM

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

27.06.2017, 07:37. Показов 2116. Ответов 2
Метки нет (Все метки)

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

УПД Для наглядности происходящего по приходу в окно сообщения WM_PAINT в код добавлена свистелка. Которая например показала что функция UpdateWindow (пробовал как альтернативу InvalidateRgn) почем то обновлять окно вовсе не собирается. Хотя и ошибки не выдаёт.

Assembler
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
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'
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.06.2017, 07:37
Ответы с готовыми решениями:

Рисования в форме графического примитива
Помогите,Создать программу рисования в форме графического примитива с заливкой. Примитив рисуется при нажатии кнопки мыши (событие onDown)...

Программа для графического примитива
Подскажите как написать программу в QBASIC для вот этого: в центре построить окружность, в нее вписать правильный пятиугольник и в его...

Построение графического примитива в методе класса
Простая функция построения примитива не работает в методе пользовательского класса, выдает ошибку. Как с этим бороться? unit Unit1; ...

2
68 / 1 / 1
Регистрация: 28.06.2017
Сообщений: 3
29.06.2017, 00:01
Лучший ответ Сообщение было отмечено Полный 30h как решение

Решение

Поставь:
перед вызовом процедуры рисования шестигранника)
Assembler
1
2
3
4
5
push lppaint
push [hwnd]
call [BeginPaint]
push lppaint
push eax
после процедуры)
Assembler
1
call[EndPaint]
и в секции для данных)
Assembler
1
lppaint PAINTSTRUCT
1
Эксперт быдлокодинга
 Аватар для Полный 30h
2095 / 529 / 70
Регистрация: 04.11.2010
Сообщений: 1,314
29.06.2017, 10:48  [ТС]
OHO, большое спасибо за подсказку. Всё заработало. Заодно, и выявилась пара несуразиц помельче. Полигон стал обновляться как надо.

Рабочий код, если кому понадобится, прилагаю.
Assembler
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
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'
Добавлено через 22 секунды
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2017, 10:48
Помогаю со студенческими работами здесь

Выход графического примитива за пределы области рисования
Доброго времени суток. Может кто нибудь помочь с разбором поставленной задачи. Реализовать конструктор в классе Circle, который выполняет...

Считать из файла параметры графического примитива и изобразить его
Есть файл с вот такими вот данными rectangle:235,231,190,150;line:260,390,78,56; Как считать с файла это условие, чтобы выполнить его...

Экран-заставка: изобразить эмблему, выполненную с использованием любого графического примитива
Составить процедуру формирования экрана-заставки для предварительно разработанной диалоговой программы. Создать исполняемый файл для...

Составить программу для вычисления параметров графического примитива «правильный многоугольник»
Составить программу для вычисления параметров графического примитива «правильный многоугольник»: В параметрах указать координаты центра,...

Как написать простую программу для рисования линии или другого графического примитива
Как написать простую программу для рисования линии или другого графического примитива в geany на с++. Большое спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru