MASM32 >> Painting

Draw Rectangle


參考資訊:
1. win32
2. tutorial
3. examples_win32

繪畫圖形需要透過SelectObject()去選擇Pen、Brush

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 brush:dword
    local ps:PAINTSTRUCT
    
    .if uMsg == WM_PAINT
        invoke BeginPaint, hWnd, addr ps
        mov hdc, eax
    
        invoke CreatePen, PS_SOLID, 3, 0ffh
        mov pen, eax
        invoke CreateSolidBrush, 0ff00h
        mov brush, eax
 
        invoke SelectObject, hdc, pen
        invoke SelectObject, hdc, brush
        invoke Rectangle, hdc, 10, 10, 200, 200
   
        invoke EndPaint, hWnd, addr ps
        invoke DeleteObject, pen
        invoke DeleteObject, brush
        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 41:畫一個長方形,起始點位置是(x=10, y=10),結束點位置是(x=200, y=200)

Makefile

export WINEPREFIX=/home/user/.wine_amd64

TARGET=main
MYWINE=box86 wine
MASM32=/home/user/.wine_amd64/drive_c/masm32

all:
	${MYWINE} ${MASM32}/bin/ml.exe /c /coff /nologo ${TARGET}.asm
	${MYWINE} ${MASM32}/bin/link.exe /SUBSYSTEM:WINDOWS /MERGE:.rdata=.text ${TARGET}.obj

run:
	${MYWINE} ${TARGET}.exe

clean:
	rm -rf ${TARGET}.exe ${TARGET}.obj

編譯、執行

$ make
$ make run


返回上一頁