汇编-窗口基本过程

 

.386  
.model flat,stdcall 
option casemap:none
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

include windows.inc 
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc 
includelib kernel32.lib


.data?
hInstance dd ?
hWinMain dd ?

.const
szClassName    db    'MyClass',0
szCaptionMain    db    '窗口标题',0
szText        db    '窗口文本',0

  
 
.code  

;窗口过程-消息处理过程
_ProcWinMain    proc    uses ebx edi esi ,hWnd,uMsg,wParam,lParam
        local    @stPs:PAINTSTRUCT
        local    @stRect:RECT
        local    @hDc

        mov    eax,uMsg
;********************************************************************
        .if    eax ==    WM_PAINT
            invoke    BeginPaint,hWnd,addr @stPs
            mov    @hDc,eax

            invoke    GetClientRect,hWnd,addr @stRect
            invoke    DrawText,@hDc,addr szText,-1,addr @stRect,DT_SINGLELINE or DT_CENTER or DT_VCENTER

            invoke    EndPaint,hWnd,addr @stPs
;********************************************************************
        .elseif    eax ==    WM_CLOSE                   ;如果是WM_CLOSE消息
            invoke    DestroyWindow,hWinMain
            invoke    PostQuitMessage,NULL
;********************************************************************
        .else
            invoke    DefWindowProc,hWnd,uMsg,wParam,lParam
            ret
        .endif
;********************************************************************
        xor    eax,eax
        ret

_ProcWinMain    endp

_WinMain    proc
            local    @stWndClass:WNDCLASSEX
            local    @stMsg:MSG

            invoke    GetModuleHandle,NULL
            mov    hInstance,eax
            invoke    RtlZeroMemory,addr @stWndClass,sizeof @stWndClass

; 注册窗口类
        invoke    LoadCursor,0,IDC_ARROW
        mov    @stWndClass.hCursor,eax
        push    hInstance
        pop    @stWndClass.hInstance
        mov    @stWndClass.cbSize,sizeof WNDCLASSEX
        mov    @stWndClass.style,CS_HREDRAW or CS_VREDRAW
        mov    @stWndClass.lpfnWndProc,offset _ProcWinMain
        mov    @stWndClass.hbrBackground,COLOR_WINDOW + 1
        mov    @stWndClass.lpszClassName,offset szClassName
        invoke    RegisterClassEx,addr @stWndClass

; 建立并显示窗口
        invoke    CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,NULL,hInstance,NULL  ;创建窗口
        mov    hWinMain,eax
        invoke    ShowWindow,hWinMain,SW_SHOWNORMAL    ;显示窗口
        invoke    UpdateWindow,hWinMain                ;刷新窗口客户区

;消息循环
        .while    TRUE                                  ;进入无限的消息获取和处理的循环
            invoke    GetMessage,addr @stMsg,NULL,0,0   ;获取消息
            .break    .if eax    == 0
            invoke    TranslateMessage,addr @stMsg       ;消息转换
            invoke    DispatchMessage,addr @stMsg        ;消息分派
        .endw
        ret

        _WinMain    endp

        start:                              ;程序入口
        call    _WinMain
        invoke    ExitProcess,NULL

        end    start             

 

示例工程下载:

链接:https://pan.baidu.com/s/1jRjcRwAu0Ib_G6kSRgBwzw
提取码:6666

 

 

 

 

 

 

posted @ 2024-02-04 11:00  天子骄龙  阅读(43)  评论(0)    收藏  举报