程式語言 - MASM32 - Painting - Draw Text



參考資訊:
http://www.winprog.org/tutorial/
http://winapi.freetechsecrets.com/win32/
https://github.com/gammasoft71/Examples_Win32

使用TextOut()顯示文字時,只有X、Y參數可以用來設定顯示的位置,當文字長度超過顯示區域時,就需要拆解文字,包含置中顯示也是需要花費額外的計算,如果遇到這些問題,建議使用DrawText()顯示文字,DrawText()提供更多選項使用,包含多行顯示、置中顯示,使用者只需要傳入顯示範圍即可

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, 0ff0000h
        invoke SetBkMode, hdc, TRANSPARENT
        invoke SelectObject, hdc, font
        invoke DrawText, hdc, offset szMsg, dwMsg, addr ps.rcPaint, DT_SINGLELINE or DT_CENTER or DT_VCENTER
        
        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 44:使用DrawText()顯示文字

完成