WIN32汇编语言教程:第04章 第一个窗口程序 · 4.2 分析窗口程序(3)
表4.2 窗口风格的预定义值
预定义值 | 16进制值 | 含 义 |
WS_OVERLAPPED | 00000000h | 普通的重叠式窗口 |
WS_POPUP | 80000000h | 弹出式窗口(没有标题栏) |
WS_CHILD | 40000000h | 子窗口 |
WS_MINIMIZE | 20000000h | 初始状态是最小化的 |
WS_VISIBLE | 10000000h | 初始状态是可见的 |
WS_DISABLED | 08000000h | 初始状态是被禁止的 |
WS_MAXIMIZE | 01000000h | 初始状态是最大化的 |
WS_BORDER | 00800000h | 单线条边框 |
WS_DLGFRAME | 00400000h | 对话框类型的边框 |
WS_VSCROLL | 00200000h | 带垂直滚动条 |
WS_HSCROLL | 00100000h | 带水平滚动条 |
WS_SYSMENU | 00080000h | 带系统菜单(即带标题栏左上角的图标) |
WS_THICKFRAME | 00040000h | 可以拖动调整大小的边框 |
WS_MINIMIZEBOX | 00020000h | 有最小化按钮 |
WS_MAXIMIZEBOX | 00010000h | 有最大化按钮 |
为了容易理解,Windows也为一些定义取了一些别名,同时,由于窗口的风格往往是几种风格的组合,所以Windows也预定义了一些组合值,如表4.3所示。
表4.3 等效的窗口风格预定义值
预定义值 | 等 效 值 |
WS_CHILDWINDOW | WS_CHILD |
WS_TILED | WS_OVERLAPPED |
WS_ICONIC | WS_MINIMIZE |
WS_SIZEBOX | WS_THICKFRAME |
WS_OVERLAPPEDWINDOW | WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or WS_THICKFRAME or WS_MINIMIZEBOX or WS_MAXIMIZEBOX |
WS_TILEDWINDOW | WS_OVERLAPPEDWINDOW |
WS_POPUPWINDOW | WS_POPUP or WS_BORDER or WS_SYSMENU |
dwExStyle是Win32中扩展的,它们是一些以WS_EX_开头的预定义值,主要定义了一些特殊的风格,表4.4给出了一些最常用的特殊风格。
表4.4 窗口扩展风格的预定义值
预定义值 | 16进制值 | 含 义 |
WS_EX_TOPMOST | 00000008h | 总在顶层的窗口 |
WS_EX_ACCEPTFILES | 00000010h | 允许窗口进行鼠标拖放操作 |
WS_EX_TOOLWINDOW | 00000080h | 工具窗口(很窄的标题栏) |
WS_EX_WINDOWEDGE | 00000100h | 立体感的边框 |
WS_EX_CLIENTEDGE | 00000200h | 客户区立体边框 |
预定义值 | 16进制值 | 含 义 |
WS_EX_OVERLAPPEDWINDOW | WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE | |
WS_EX_PALETTEWINDOW | WS_EX_WINDOWEDGE or WS_EX_TOOLWINDOW or WS_EX_TOPMOST |
用预定义的组合值WS_EX_PALETTEWINDOW可以很方便地构成浮在其他窗口前面的工具栏。
下面看几种不同的窗口外形,如图4.5所示,窗口1是WS_OVERLAPPED类型的窗口,只有一个边框,没有控制按钮和图标;窗口2同时指定WS_MAXIMIZEBOX,WS_MINIMIZEBOX和WS_SYSMENU,在窗口1的基础上多了控制按钮和图标;窗口3是WS_POPUPWINDOW风格的,这是一个没有标题和控制按钮的弹出式窗口,常见的软件装入时的版权窗口就是这种风格;前面3个窗口都不能通过拖动边框改变大小,而窗口4指定了WS_THICKFRAME风格,可以改变大小,它的边框显得厚了一点;窗口5的风格是WS_OVERLAPPEDWINDOW,是最常见的属性组合;窗口6在窗口5的基础上指定了WS_EX_CLIENTEDGE,它的客户区显得有立体感;窗口7是个工具栏,指定的是WS_EX_TOOLWINDOW风格,可以看到它的标题栏要小得多;窗口8指定了WS_HSCROLL和WS_VSCROLL风格,窗口中多了垂直和水平滚动条。
图4.5 不同风格的窗口
FirstWindow程序中建立窗口的相关代码是这样的:
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 ...
建立窗口以后,eax中传回来的是窗口句柄,要把它先保存起来,这时候,窗口虽已建立,但还没有在屏幕上显示出来,要用ShowWindow把它显示出来,ShowWindow也可以用在别的地方,主要用来控制窗口的显示状态(显示或隐藏),大小控制(最大化、最小化或原始大小)和是否激活(当前窗口还是背后的窗口),它用窗口句柄做第一个参数,第二个参数则是显示的方式。表4.5给出了显示方式预定义值。
表4.5 ShowWindow函数显示方式的定义
预定义值 | 等 效 值 |
SW_HIDE | 隐藏窗口,大小不变,激活状态不变 |
SW_MAXIMIZE | 最大化窗口,显示状态不变,激活状态不变 |
SW_MINIMIZE | 最小化窗口,显示状态不变,激活状态不变 |
SW_RESTORE | 从最大化或最小化恢复正常大小,显示状态不变,激活状态不变 |
SW_SHOW | 显示并激活窗口,大小状态不变 |
SW_SHOWMAXIMIZED | 显示并激活窗口,以最大化显示 |
SW_SHOWMINIMIZED | 显示并激活窗口,以最小化显示 |
SW_SHOWMINNOACTIVE | 显示窗口并最小化,激活状态不变 |
SW_SHOWNA | 显示窗口,大小状态不变,激活状态不变 |
SW_SHOWNOACTIVATE | 显示并从最大化或最小化恢复正常大小,激活状态不变 |
SW_SHOWNORMAL | 显示并激活窗口,恢复正常大小(初始化时用这个参数) |
窗口显示以后,用UpdateWindow绘制客户区,它实际上就是向窗口发送了一条WM_PAINT消息。到此为止,一个顶层窗口就正常建立并显示了。
CreateWindowEx也可以用来建立子窗口,Windows中有很多预定义的子窗口类,如按钮和文本框的类名分别是“Button”和“Edit”。要建立一个按钮,只要把lpClassName指向 “Button”字符串就可以了。下面举例说明建立一个按钮的方法,代码如下:
.data szButton db 'button',0 szButtonText db '&OK',0 ... invoke CreateWindowEx,NULL,\ offset szButton,offset szButtonText,\ WS_CHILD or WS_VISIBLE,\ 10,10,65,22,\ hWnd,1,hInstance,NULL
在FirstWindow的源程序中加入按钮类的定义字符串szButton和按钮文字字符串szButtonText,然后在窗口过程的WM_CREATE消息中加入建立按钮的代码,执行一下,窗口中就出现了一个按钮,如图4.6所示。建立按钮的时候,lpWindowName参数就是按钮上的文字,风格则一定要指定WS_CHILD,建立的按钮才会在我们的主窗口上,WS_VISIBLE也要同时指定,否则按钮不会显示出来,hMenu参数在这里用做表示子窗口ID,将它设置为1,在建立多个子窗口的时候,ID应该有所区别。源程序可以在所附带光盘的Chapter04\FirstWindow-1目录中找到。
图4.6 用CreateWindowEx建立的按钮
上页:第04章 第一个窗口程序 · 4.2 分析窗口程序(2) 下页:第04章 第一个窗口程序 · 4.2 分析窗口程序(4)