MASM32 >> Painting

Create Font


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

在Windows視窗程式設計中,當需要文字輸出顯示在視窗上時,一般都會使用自定義的字型,因為系統預設的字型太小,而自定義的字型,除了可以是粗體或者斜體,還可以設定自定義的長寬尺寸,司徒使用一個簡單例子來說明如何建立自定義的字型

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
szFont      db "Arial",0
szMsg       db "Test",0
dwMsg       equ ($ - szMsg) - 1
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 font:dword
    local ps:PAINTSTRUCT
 
    .if uMsg == WM_PAINT
        invoke BeginPaint, hWnd, addr ps
        mov hdc, eax

        invoke CreateFont, 48, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 
            OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS,
            CLEARTYPE_QUALITY, DEFAULT_PITCH or FF_DONTCARE, offset szFont
        mov font, eax

        invoke SetTextColor, hdc, 0ffh
        invoke SetBkMode, hdc, TRANSPARENT
        invoke SelectObject, hdc, font
        invoke TextOut, hdc, 100, 100, offset szMsg, dwMsg
       
        invoke EndPaint, hWnd, addr ps
        invoke DeleteObject, font
        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 36~39:創造一個大小48、粗體的Arial字型

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


返回上一頁