程式語言 - MASM32 - Painting - Create Pen



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

完成