參考資訊:
http://www.winprog.org/tutorial/
http://winapi.freetechsecrets.com/win32/
https://github.com/gammasoft71/Examples_Win32
線的起始點位置是位於(x=0, y=0),使用者可以呼叫MoveToEx()設定新的起始點,而使用LineTo()就可以畫出一條直線,新的起始點則是線的結束位置
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[3]:dword local ps:PAINTSTRUCT .if uMsg == WM_PAINT invoke BeginPaint, hWnd, addr ps mov hdc, eax invoke CreatePen, PS_SOLID, 3, 0ffh mov pen[0], eax invoke CreatePen, PS_SOLID, 3, 0ff00h mov pen[4], eax invoke CreatePen, PS_SOLID, 3, 0ff0000h mov pen[8], eax invoke SelectObject, hdc, pen[0] invoke MoveToEx, hdc, 10, 100, NULL invoke LineTo, hdc, 250, 100 invoke SelectObject, hdc, pen[4] invoke MoveToEx, hdc, 10, 150, NULL invoke LineTo, hdc, 250, 150 invoke SelectObject, hdc, pen[8] invoke MoveToEx, hdc, 10, 200, NULL invoke LineTo, hdc, 250, 200 invoke EndPaint, hWnd, addr ps invoke DeleteObject, pen[0] invoke DeleteObject, pen[4] invoke DeleteObject, pen[8] 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~50:產生三支Pen並且畫出三條直線,需要注意的是,同一時間只能選擇一支Pen
完成