汇编-窗口基本过程

 

复制代码
.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 @   天子骄龙  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2023-02-04 耳钩式蓝牙耳机
2022-02-04 halcon-rectangle1_domain获取指定矩形区域的图像
2022-02-04 halcon-disp_message文本输出和set_display_font设置字体
2020-02-04 python-opencv-线段与矩形的绘制
点击右上角即可分享
微信分享提示