.data
gl_hdc dd ?
gl_memdc dd ?
hPen dd ?
hBrush dd ?
.code
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg==WM_CREATE
;размеры экрана
invoke GetSystemMetrics,0h
MOV xm,EAX
invoke GetSystemMetrics,0h
MOV ym,EAX
;открыть контекст окна
invoke GetDC,hWnd
MOV gl_hdc,EAX
;создать совместимый с данным окном контекст
invoke CreateCompatibleDC,eax
MOV gl_memdc,EAX
;создать в памяти растровое изображение, совместимое с hdc
invoke CreateCompatibleBitmap,gl_hdc,xm,ym
;выбрать растровое изображение в данном контексте
invoke SelectObject,gl_memdc,eax
invoke CreateSolidBrush,RGBW
;выбрать кисть в данном контексте
invoke SelectObject,gl_memdc,eax
;заполнить данную прямоугольную область
invoke PatBlt,gl_memdc,0h,0h,xm,ym,0F00021h
;создать кисть и перо для рисования
;цвет кисти
invoke CreateSolidBrush,RGBR
MOV hBrush,EAX
invoke CreatePen,PS_DOT,2h,RGBR
MOV hPen,EAX
;удалить контекст
invoke ReleaseDC,hWnd,gl_hdc
MOV EAX, 0
.endif
.if uMsg==WM_LBUTTONDOWN
invoke MoveToEx,gl_memdc,30,100,0h
;линия пером
invoke LineTo,gl_memdc,550,300
;дать команду перерисовать окно
invoke InvalidateRect,hWnd,0h,0h
FIN:
MOV EAX, 0
.endif
.if uMsg==WM_PAINT
invoke BeginPaint,hWnd,offset pnt
MOV gl_hdc,EAX ;сохранить контекст (дескриптор)
;скопировать виртуальное окно на реальное
invoke BitBlt,gl_hdc,0h,0h,xm,ym,gl_memdc,0h,0h,0CC0020h
;---------------- закрыть контекст окна
invoke EndPaint,hWnd,offset pnt
MOV EAX, 0
.endif
.if uMsg==WM_DESTROY
;удалить перо
invoke DeleteDC,hPen
;удалить кисть
invoke DeleteDC,hBrush
;удалить виртуальное окно
invoke DeleteDC,gl_memdc
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax, eax
ret
WndProc endp
end start
Наристовать линию... Графика!
Создаю кисть, а линия почему-то всёравно чёрная и такие параметры, как PS_DASH или PS_DOT, а также толщина не влияют!
Код:
invoke CreatePen,PS_SOLID,4h,RGBR
MOV hPen,EAX
...
...
invoke MoveToEx,gl_memdc,30,100,0h
;линия пером
invoke SelectObject,gl_memdc,hPen
invoke LineTo,gl_memdc,550,300
MOV hPen,EAX
...
...
invoke MoveToEx,gl_memdc,30,100,0h
;линия пером
invoke SelectObject,gl_memdc,hPen
invoke LineTo,gl_memdc,550,300
Код:
.if uMsg==WM_PAINT
invoke BeginPaint,hWnd,offset pnt
MOV gl_hdc,EAX ;сохранить контекст (дескриптор)
;скопировать виртуальное окно на реальное
invoke BitBlt,gl_hdc,0h,0h,xm,ym,gl_memdc,0h,0h,SRCCOPY
invoke EndPaint,hWnd,offset pnt
MOV EAX, 0
.endif
invoke BeginPaint,hWnd,offset pnt
MOV gl_hdc,EAX ;сохранить контекст (дескриптор)
;скопировать виртуальное окно на реальное
invoke BitBlt,gl_hdc,0h,0h,xm,ym,gl_memdc,0h,0h,SRCCOPY
invoke EndPaint,hWnd,offset pnt
MOV EAX, 0
.endif
Код:
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg==WM_CREATE
;размеры экрана
invoke GetSystemMetrics,0h
MOV xm,EAX
invoke GetSystemMetrics,0h
MOV ym,EAX
;открыть контекст окна
invoke GetDC,hWnd
MOV gl_hdc,EAX
;создать совместимый с данным окном контекст
invoke CreateCompatibleDC,eax
MOV gl_memdc,EAX
;создать в памяти растровое изображение, совместимое с hdc
invoke CreateCompatibleBitmap,gl_hdc,xm,ym
;выбрать растровое изображение в данном контексте
invoke SelectObject,gl_memdc,eax
invoke CreateSolidBrush,BACK_COLOR
;выбрать кисть в данном контексте
invoke SelectObject,gl_memdc,eax
;заполнить данную прямоугольную область
invoke PatBlt,gl_memdc,0h,0h,xm,ym,0F00021h
;создать кисть и перо для рисования
;цвет кисти
invoke CreateSolidBrush,RGBR
MOV hBrush,EAX
invoke CreatePen,PS_SOLID,4h,RGBR
MOV hPen,EAX
;удалить контекст
invoke ReleaseDC,hWnd,gl_hdc
MOV EAX, 0
mov yp,100
.endif
.if uMsg==WM_LBUTTONDOWN
invoke MoveToEx,gl_memdc,30,100,0h
;линия пером
invoke SelectObject,gl_memdc,hPen
invoke LineTo,gl_memdc,550,300
comment @
.if xp>=400
mov xp,0h
add yp,1h
.endif
mov ecx,200
LL:
push ecx
invoke SetPixel,gl_memdc,xp,yp,000000FFh
inc xp
pop ecx
loop LL
@
;дать команду перерисовать окно
invoke InvalidateRect,hWnd,0h,0h
FIN:
MOV EAX, 0
.endif
.if uMsg==WM_PAINT
invoke BeginPaint,hWnd,offset pnt
MOV gl_hdc,EAX ;сохранить контекст (дескриптор)
;скопировать виртуальное окно на реальное
invoke BitBlt,gl_hdc,0h,0h,xm,ym,gl_memdc,0h,0h,SRCCOPY
invoke EndPaint,hWnd,offset pnt
MOV EAX, 0
.endif
.if uMsg==WM_DESTROY
;удалить перо
invoke DeleteDC,hPen
;удалить кисть
invoke DeleteDC,hBrush
;удалить виртуальное окно
invoke DeleteDC,gl_memdc
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax, eax
ret
WndProc endp
end start
.if uMsg==WM_CREATE
;размеры экрана
invoke GetSystemMetrics,0h
MOV xm,EAX
invoke GetSystemMetrics,0h
MOV ym,EAX
;открыть контекст окна
invoke GetDC,hWnd
MOV gl_hdc,EAX
;создать совместимый с данным окном контекст
invoke CreateCompatibleDC,eax
MOV gl_memdc,EAX
;создать в памяти растровое изображение, совместимое с hdc
invoke CreateCompatibleBitmap,gl_hdc,xm,ym
;выбрать растровое изображение в данном контексте
invoke SelectObject,gl_memdc,eax
invoke CreateSolidBrush,BACK_COLOR
;выбрать кисть в данном контексте
invoke SelectObject,gl_memdc,eax
;заполнить данную прямоугольную область
invoke PatBlt,gl_memdc,0h,0h,xm,ym,0F00021h
;создать кисть и перо для рисования
;цвет кисти
invoke CreateSolidBrush,RGBR
MOV hBrush,EAX
invoke CreatePen,PS_SOLID,4h,RGBR
MOV hPen,EAX
;удалить контекст
invoke ReleaseDC,hWnd,gl_hdc
MOV EAX, 0
mov yp,100
.endif
.if uMsg==WM_LBUTTONDOWN
invoke MoveToEx,gl_memdc,30,100,0h
;линия пером
invoke SelectObject,gl_memdc,hPen
invoke LineTo,gl_memdc,550,300
comment @
.if xp>=400
mov xp,0h
add yp,1h
.endif
mov ecx,200
LL:
push ecx
invoke SetPixel,gl_memdc,xp,yp,000000FFh
inc xp
pop ecx
loop LL
@
;дать команду перерисовать окно
invoke InvalidateRect,hWnd,0h,0h
FIN:
MOV EAX, 0
.endif
.if uMsg==WM_PAINT
invoke BeginPaint,hWnd,offset pnt
MOV gl_hdc,EAX ;сохранить контекст (дескриптор)
;скопировать виртуальное окно на реальное
invoke BitBlt,gl_hdc,0h,0h,xm,ym,gl_memdc,0h,0h,SRCCOPY
invoke EndPaint,hWnd,offset pnt
MOV EAX, 0
.endif
.if uMsg==WM_DESTROY
;удалить перо
invoke DeleteDC,hPen
;удалить кисть
invoke DeleteDC,hBrush
;удалить виртуальное окно
invoke DeleteDC,gl_memdc
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax, eax
ret
WndProc endp
end start