參考資訊:
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:刪除資源
完成