windows环境下32位汇编语言程序设计-第21章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
● 在CreateDialogParam返回后,应用程序在自己的消息循环中获取对话框消息,所以如果要用非模态对话框做程序的主窗口,消息循环的代码还是要写的;而DialogBoxParam是使用Windows为它内建的消息循环。
● 关闭非模态对话框使用DestroyWindow函数,注意在这里不要用EndDialog函数。
3。 对话框过程
Windows在“对话框管理器”——也就是为对话框内建的窗口过程中处理对话框消息,在处理前会首先调用用户定义的对话框过程,程序可以在这里选择是否自行处理某些消息。读者在理解时可以把“对话框管理器”看成是对话框的DefWindowsProc,凡是自己不想处理的消息都由它来处理。
和窗口过程一样,对话框过程是一个“回调”子程序,它由程序定义,Windows来调用,模态对话框和非模态对话框的对话框过程是一样的。
对话框过程和窗口过程的输入参数是一样的,也是:
DialogProc proc hwndDlg;uMsg;wParam;lParam
在程序里面一般编写对话框过程的分支结构如下:
_ProcDlgMain proc uses ebx edi esi hWnd;wMsg;wParam;lParam
mov eax;wMsg
。if eax WM_CLOSE
;模态对话框用EndDialog关闭
;非模态对话框用DestroyWindow关闭
。elseif eax WM_INITDIALOG
;初始化代码
。elseif eax WM_MAND
;子窗口控件发送的消息
;wParam的低16位为子窗口控件ID
。elseif eax WM_XXXX
;处理其他需要处理的消息
。else
mov eax;FALSE
ret
。endif
mov eax;TRUE
ret
_ProcDlgMain endp
注意对话框过程和普通的窗口过程在使用上有以下区别:
● 窗口过程对应于不同的消息有各种不同含义的返回值,而对话框过程返回BOOL类型的值,返回TRUE表示已经处理了某条消息,返回FALSE表示没有处理。“对话框管理器”代码会根据返回值决定是否继续处理某一条消息(惟一的例外是WM_INITDIALOG消息)。
● 对于不处理的消息,不需要调用DefWindowProc来处理,这事情由“对话框管理器”来做。
“对话框管理器”不会把WM_CREATE消息转发给对话框过程,取而代之,它会以WM_INITDIALOG消息来调用对话框过程,程序可以在这里进行一些初始化的操作,WM_INITDIALOG消息的返回值有点特殊,如果程序想自行设置输入焦点,那么可以用SetFocus函数把输入焦点设置到需要的子窗口控件上,然后返回FALSE;如果返回TRUE的话,那么Windows会自动将输入焦点设置到第一个有WS_TABSTOP的子窗口控件上。
对话框过程在WM_MAND消息中处理子窗口控件发送的命令,当用户在对话框中按下了按钮,输入文字或选择复选框等操作时,子窗口控件会向对话框过程发送WM_MAND消息,wParam是子窗口控件的ID,如例子程序中处理“退出”按钮的消息,在里面用EndDialog函数关闭对话框。
对话框窗口的标题栏上默认没有定义图标,如果要像普通窗口一样显示一个图标,那么可以像例子程序中那样,在WM_INITDIALOG中用WM_SETICON消息来设置。
5。4。4 在对话框中使用子窗口控件
子窗口控件是一些Windows预定义类,它们实际上就是一个个以对话框为父窗口的子窗口。对于程序员来说,在对话框中使用它们的时候并不需要手工去逐一创建,只需要在对话框中定义就可以了,“对话框管理器”会在初始化对话框的时候,根据定义语句自动建立所有的子窗口。
1。 子窗口控件的定义
子窗口控件定义的一般语法是:
CONTROL 文本;ID;类;风格; x; y;宽度;高度';扩展风格'
“文本”指控件的初始化值,“ID”是子窗口向对话框过程发送WM_MAND中用的ID值,“类”可以是按钮(Button)、静态(Static)、编辑(Edit)、滚动条(ScrollBar)、列表框(ListBox)和组合框(boBox),这些类都是Windows系统中已经预定义的,“对话框管理器”在初始化的时候把每一条控件定义语句转换成下面的CreateWindow命令:
invoke CreateWindow,类名,文本,风格;
x,y,宽度,高度,
对话框窗口句柄,ID,hInstance,NULL
正因为如此,所有可以用CreateWindow建立的子窗口都可以在资源中定义,只要知道要使用的类和风格就可以了。所以除了上面这些基本的类之外,对话框中还可以使用一些通用控件,如“日期”(SysDateTimePick32)、“月历”(SysMonthCal32)、“热键”(msctls_hotkey32)和“列表”(SysListView32)等,括号内是它们的类名,只要把定义语句的“类”写成对应的名称就可以了。
基于同一个预定义类的控件根据风格属性的不同,外表可能完全不同,如单选钮、复选框和分组框使用的类都是Button类,文本、图标框、位图框和线条等都是Static类。使用CONTROL语句定义的时候可能不是很直观,所以Rc。exe资源编译器允许使用另一种语法来书写控件定义:
控件名称 '文本;' ID;x;y;宽度;高度';风格'';扩展风格'
这里使用“控件名称”而不是“类”是因为这个名称只是Rc。exe使用的缩写,并不是真正的Windows类的名称,“控件名称”由Rc。exe解释成“类”名,同时为它使用了几种默认的风格,定义语句中风格属性实际上是附加在默认风格上的,表5。4列出了每种控件使用的类和默认属性,除了表中列出的默认属性外,每种控件还被默认定义了WS_CHILD和WS_VISIBLE属性。
表5。4 资源脚本中使用的控件名称
控 件 名 称
说 明
基 于 的 类
默认窗口风格
PUSHBUTTON
按钮
Button
BS_PUSHBUTTON,WS_TABSTOP
DEFPUSHBUTTON
默认按钮
Button
BS_DEFPUSHBUTTON,WS_TABSTOP
CHECKBOX
复选框
Button
BS_CHECKBOX,WS_TABSTOP
AUTOCHECKBOX
自动复选框
Button
BS_AUTOCHECKBOX,WS_TABSTOP
STATE3
3态复选框
Button
BS_3STATE,WS_TABSTOP
AUTO3STATE
自动3态复选框
Button
BS_AUTO3STATE,WS_TABSTOP
RADIOBUTTON
单选钮
Button
BS_RADIOBUTTON,WS_TABSTOP
AUTORADIOBUTTON
自动单选钮
Button
BS_AUTORADIOBUTTON,WS_TABSTOP
控 件 名 称
说 明
基 于 的 类
默认窗口风格
GROUPBOX
分组框
Button
BS_GROUPBOX
SCROLLBAR
滚动条
ScrollBar
SBS_HORZ
CTEXT
居中文本
Static
SS_CENTER,WS_GROUP
LTEXT
左对齐文本
Static
SS_LEFT,WS_GROUP
RTEXT
右对齐文本
Static
SS_RIGHT,WS_GROUP
ICON
图标框
Static
SS_ICON
EDITTEXT
文本编辑
Edit
ES_LEFT,WS_BORDER,WS_TABSTOP
BOBOX
组合框
boBox
CBS_SIMPLE,WS_TABSTOP
LISTBOX
列表框
ListBox
LBS_NOTIFY,WS_BORDER
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第5章 使用资源
5。4 对 话 框(4)
看下面的例子:
GROUPBOX 〃选项〃; …1; 55; 5; 120; 100
PUSHBUTTON 〃退出〃; IDCANCEL; 255; 115; 50; 14
这两条语句和下面的语句编译后产生的二进制资源文件是一模一样的:
CONTROL 〃选项〃; …1; 〃Button〃; BS_GROUPBOX | WS_TABSTOP; 55; 5; 120; 100
CONTROL 〃退出〃; IDCANCEL; 〃Button〃; BS_PUSHBUTTON | WS_TABSTOP; 255; 115; 50; 14
第一种语句的用法比第二种语句不但要直观许多,而且不必书写默认的窗口风格。
当用到的控件没有缩写语法时,那就必须用CONTROL定义了,下面的两句分别定义了一条横线和一个图片框,它们并没有缩写的用法:
CONTROL 〃〃; …1; 〃Static〃; SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE; 60; 65; 110; 1
CONTROL BMP_ID; …1; 〃Static〃; SS_BITMAP | WS_CHILD | WS_VISIBLE; 5; 5; 40; 95
下面以一个例子来演示各种子窗口控件的用法,读者可以在所附光盘的Chapter05Control目录中找到全部的源代码,其中的Control。rc文件如下:
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#include
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#define ICO_MAIN Ox1000 //图标
#define DLG_MAIN 1
#define IDB_1 1
#define IDB_2 2
#define IDC_ONTOP 101
#define IDC_SHOWBMP 102
#define IDC_ALOW 103
#define IDC_MODALFRAME 104
#define IDC_THICKFRAME 105
#define IDC_TITLETEXT 106
#define IDC_CUSTOMTEXT 107
#define IDC_BMP 108
#define IDC_SCROLL 109
#define IDC_VALUE 110
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
ICO_MAIN ICON 〃Main。ico〃
IDB_1 BITMAP 〃Picture1。bmp〃
IDB_2 BITMAP 〃Picture2。bmp〃
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
DLG_MAIN DIALOG 193; 180; 310; 134
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION 〃对话框子窗口控件示例〃
FONT 9; 〃宋体〃
{
GROUPBOX 〃选项〃; …1; 55; 5; 120; 100
AUTOCHECKBOX 〃总在最前面〃; IDC_ONTOP; 65; 20; 100; 12
AUTOCHECKBOX 〃显示图片〃; IDC_SHOWBMP; 65; 35; 100; 12
AUTOCHECKBOX 〃允许更换图片〃; IDC_ALOW; 65; 50; 100; 12
CONTROL 〃〃; …1; 〃Static〃; SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE;
60; 65; 110; 1
AUTORADIOBUTTON 〃模态边框(&Modal Frame)〃; IDC_MODALFRAME;
65; 70; 100; 12; WS_TABSTOP
AUTORADIOBUTTON 〃可变边框(&Thick Frame)〃; IDC_THICKFRAME;
65; 85; 100; 12; WS_TABSTOP
GROUPBOX 〃标题栏文字〃; …1; 180; 5; 125; 100; BS_GROUPBOX
BOBOX IDC_TITLETEXT; 190; 20; 105; 70; CBS_DROPDOWNLIST | WS_TABSTOP
LTEXT 〃自定义文字:〃; …1; 190; 40; 105; 10
EDITTEXT IDC_CUSTOMTEXT; 190; 55; 105; 12
LTEXT 〃请在此选择显示在标题栏上面的文字,或者选择“自定义”后自行输入〃;
…1; 191; 73; 105; 26; WS_BORDER
CONTROL 〃〃; …1; 〃Static〃; SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE;
5; 110; 300; 1
DEFPUSHBUTTON 〃更换图片(&C)〃; IDOK; 200; 115; 50; 14
PUSHBUTTON 〃退出(&X)〃; IDCANCEL; 255; 115; 50; 14
CONTROL IDB_1; IDC_BMP; 〃Static〃; SS_BITMAP | WS_CHILD | WS_VISIBLE;
5; 5; 40; 95
SCROLLBAR IDC_SCROLL; 6; 119; 125; 10
LTEXT 〃0〃; IDC_VALUE; 138; 120; 50; 8
}
编译后的Control。exe运行后的界面如图5。6所示。
图5。6中的子窗口控件分别是GROUPBOX①,AUTOCHECBOX②,SS_ETCHEDHORZ风格的Static类③,AUTORADIOBUTTON④,BOBOX⑤,EDITTEXT⑥,WS_BORDER风格LTEXT⑦,DEFPUSHBUTTON⑧,SS_BITMAP风格的Static类⑨和滚动条⑩。
图5。6 子窗口控件使用的例子
程序有这些功能:按下“更换图片”按钮⑧可以切换图片框⑨的图片;在组合框⑤中可以选择更换标题栏的文字,选“自定义”的时候可以激活文本编辑框⑥并输入自定义文字;默认状态下对话框是可以调整大小的,如果将单选钮④切换到“模态边框”,那么大小就无法调整。Control。asm源代码如下:
。386
。model flat; stdcall
option casemap :none
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; Include 文件定义
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
include windows。inc
include user32。inc
includelib user32。lib
include kernel32。inc
includelib kernel32。lib
include gdi32。inc
includelib gdi32。lib
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; Equ 等值定义
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
ICO_MAIN equ 1000h
DLG_MAIN equ 1
IDB_1 equ 1
IDB_2 equ 2
IDC_ONTOP equ 101
IDC_SHOWBMP equ 102
IDC_ALOW equ 103
IDC_MODALFRAME equ 104
IDC_THICKFRAME equ 105
IDC_TITLETEXT equ 106
IDC_CUSTOMTEXT equ 107
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第5章 使用资源
5。4 对 话 框(5)
IDC_BMP equ 108
IDC_SCROLL equ 109
IDC_VALUE equ 110
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 数据段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
。data?
hInstance dd ?
hBmp1 dd ?
hBmp2 dd ?
dwPos dd ?
nst
szText1 db 'Hello; World!';0
szText2 db '嘿,你看到标题栏变了吗?';0
szText3 db '自定义';0
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》