參考資訊:
http://www.winprog.org/tutorial/
http://winapi.freetechsecrets.com/win32/
https://github.com/gammasoft71/Examples_Win32
Pen可以想像成是一支畫筆,粗細、顏色都可以設定,DC(Device Context)可以透過SelectObject()選擇畫筆
main.asm
.386
.model flat,stdcall
option casemap:none
include c:\masm32\include\msvcrt.inc
include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\gdi32.inc
include c:\masm32\include\user32.inc
includelib c:\masm32\lib\msvcrt.lib
includelib c:\masm32\lib\gdi32.lib
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
.data
szCaption db "main",0
hWin dd 0
hInstance dd 0
CommandLine dd 0
defWndProc dd 0
.code
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local hdc:dword
local pen:dword
local ps:PAINTSTRUCT
.if uMsg == WM_PAINT
invoke BeginPaint, hWnd, addr ps
mov hdc, eax
invoke CreatePen, PS_SOLID, 10, 0ffh
mov pen, eax
invoke SelectObject, hdc, pen
invoke MoveToEx, hdc, 0, 0, NULL
invoke LineTo, hdc, 100, 100
invoke EndPaint, hWnd, addr ps
invoke DeleteObject, pen
xor eax, eax
ret
.elseif uMsg == WM_CLOSE
invoke DestroyWindow, hWnd
xor eax, eax
ret
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage, 0
xor eax, eax
ret
.endif
invoke CallWindowProc, defWndProc, hWnd, uMsg, wParam, lParam
ret
WndProc endp
WinMain proc hInst:DWORD, hPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
local msg:MSG
invoke CreateWindowEx, WS_EX_LEFT, WC_DIALOG, offset szCaption,
WS_OVERLAPPEDWINDOW or WS_VISIBLE, 0, 0, 300, 300, NULL, NULL, NULL, NULL
mov hWin, eax
invoke SetWindowLong, hWin, GWL_WNDPROC, WndProc
mov defWndProc, eax
@@:
invoke GetMessage, addr msg, NULL, 0, 0
cmp eax, 0
je @f
invoke DispatchMessage, addr msg
jmp @b
@@:
mov eax, msg.wParam
ret
WinMain endp
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
end start
Line 33~34:創造一支Pen,粗細是10,顏色則是紅色
Line 35:選擇要使用的Pen
Line 36~37:畫一條線
Line 40:刪除資源
完成