汇编语言如何编写图形化的Windows应用程序

本节将展示如何为 32 位 Microsoft Windows 编写简单的图形化应用程序。该程序创建并显示一个主窗口,显示消息框,并响应鼠标事件。本节内容为简介性质,如果希望了解更多信息,请参阅 Platform SDK 文档

下表列出了编写该程序时需要的各种链接库和头文件。

文件名 说明
WinApp.asm 程序源代码
GraphWin.asm 头文件,包含程序要使用的结构、常量和函数原型
kernel32.lib 本章前面使用的 MS-Windows API 链接库
user32.lib 其他 MS-Windows API 函数

/SUBSYSTEM:WINDOWS 代替了之前章节中使用的 /SUBSYSTEM:CONSOLE。程序从 kernel32.lib 和 user32.lib 这两个标准 MS-Windows 链接库中调用函数。

主窗口

本程序显示一个全屏主窗口。为了让窗口适合本书页面,这里缩小了它的尺寸

必要的结构

结构 POINT 以像素为单位,定义屏幕上一个点的 X 坐标和 Y 坐标。它可以用于定位图形对象、窗口和鼠标点击:

POINT STRUCT
    ptX DWORD ?
    ptY DWORD ?
POINT ENDS

结构 RECT 定义矩形边界。成员 left 为矩形左边的 X 坐标,成员 top为矩形上边的 Y 坐标。成员 right 和 bottom 保存矩形类似的值:

RECT STRUCT
    left DWORD ?
    top DWORD ?
    right DWORD ?
    bottom DWORD ?
RECT ENDS

结构 MSGStruct 定义 MS-Windows 需要的数据:

MSGStruct STRUCT
    msgWnd DWORD ?
    msgMessage DWORD ?
    msgWparam DWORD ?
    msgLparam DWORD ?
    msgTime    DWORD ?
    msgPt POINT <>
MSGStruct ENDS

结构 WNDCLASS 定义窗口类。程序中的每个窗口都必须属于一个类,并且每个程序都必须为其主窗口定义一个窗口类。在主窗口可以显示之前,这个类必须要注册到操作系统:

WNDCLASS STRUC
    style DWORD ?                               ;窗口样式选项
    lpfnWndProc DWORD ?                 ; winProc 函数指针
    cbClsExtra DWORD ?                      ;共享内存
    cbWndExtra DWORD ?                   ;附加字节数
    hlnstance DWORD ?                       ;当前程序句柄
    hlcon DWORD ?                              ;图标句柄
    hCursor DWORD ?                          ;光标句柄
    hbrBackground DWORD ?              ;背景刷句柄
    IpszMenuName DWORD ?             ;菜单名指针
    IpszClassName DWORD ?              ; WinCZLass 名指针
WNDCLASS ENDS

下面对上述参数进行简单小结:
  • style 是不同样式选项的集合,比如 WS_CAPTION 和 WS_BORDER,用于控制窗口外观和行为。
  • lpfnWndProc 是指向函数的指针,该函数接收并处理由用户触发的事件消息。
  • cbClsExtra 指向一个类中所有窗口使用的共享内存。可以为空。
  • cbWndExtra 指定分配给后面窗口实例的附加字节数。
  • hInstance 为当前程序实例的句柄。
  • hIcon 和 hCursor 分别为当前程序中图标资源和光标资源的句柄。
  • hbrBackground 为背景(颜色)刷的句柄。
  • lpszMenuName 指向一个菜单名。
  • lpszClassName 指向一个空字节结束的字符串,该字符串中包含了窗口的类名称。