前言
- 之前说的资源几乎都是被动拿来使用的,除了少数我们发消息过去用来改变这块资源,我们都是接收消息来处理具体的行为。
- 对话框和子控件都属于窗口资源,它们更多的行为表现在与父窗口的通信中,也就是更多的消息交互而不再只是被动的处理。
对话框 DIALOG
- 对话框是一种资源,可以在.rc中创建对话框,并获得其ID资源号,实际使用过程中有两种方法。
- 对话框同时是一种窗口,这个窗口类是系统定义好的,所以它的回调函数也是系统定义好的,我们只需创建(非CreateWindow),并在创建过程中传递一个子回调函数处理对应的消息即可。
- 对话框可以调用DialogBox函数使用,这将和MessageBox一样产生阻塞,函数参数最后一个传递的便是自定义的消息处理子函数,想退出阻塞关闭对话框必须使用EndDialog函数。
- 对话框还可以调用CreateDialog函数,该函数和DialogBox参数一致,也需要传递自定义的消息处理函数,同时还要调用ShowWindow该对话框才能看的见,但该对话框属于非阻塞模式,它不会产生阻塞。调用DestroyWindow关闭该对话框并释放资源,如果这里使用EndDialog是不会释放窗口资源的。
- 以上两种调用方式均会产生WM_INITDIALOG消息,它产生于对话框创建成功和显示之前,和WM_CREATE消息一个意思,但此处不会产生WM_CREATE消息。
- 具体系统默认的回调函数大致如下:
”’
LRESULT CALLBACK VirtualProc(..){
….
if(MyProc(…)){
}
…
}
”’
假设系统定义的对话框其回调函数是VirtualProc,而MyProc则是我们传递的回调函数 系统会在调用它的消息处理函数时判断我们的处理函数,如果返回值是TRUE,则不执行后续默认的处理方式,若MyProc返回值是FALSE,则会按后续默认的处理方式处理消息。
子控件
- 子控件也属于窗口类,并且是系统定义好的窗口类,我们只需在CreateWindow/Ex函数时指定使用哪些子控件即可,并且回调函数也是系统定义好的。
- 子控件更多的意思在于和父窗口的交互,所以它们的消息经常是双向的,除了处理接收的消息外,我们更多的需要调用SendMessage函数来获得子控件的状态,这里先讨论静态框,按钮和编辑框3个子控件。
- 使用函数CreateWindow/Ex创建需要的子控件,窗口类型指明是哪一类子控件,并且在MenuName自己定义该控件ID(需加HMENU类型转换)。
- 子控件和父窗口的消息交互大致如下
父窗口(发送) SendMessage———> 控件窗口
父窗口(处理) <———WM_COMMAND 控件窗口 - WM_COMMAND消息的完整定义如下,按能产生该消息的3类划分
参数类表 | 菜单项 | 加速键 | 子控件 |
---|---|---|---|
WPARAM(LOWORD) | ID | ID | ID |
WPARAM(HIWORD) | 0 | 1 | Notify-Code |
LPARAM | NULL | NULL | 控件窗口句柄 |
静态框 STATIC
静态框分为文字和图像(ICON,BITMAP)两种,它几乎只是在窗口中贴出想要展示的文字或图片。
- 在CreateWindow/Ex中指明类型为STATIC,如果是文字,窗口名即是想显示的字符,如果是图片,需要在窗口名中放入”#$ID”格式字符,其中ID是图标或位图的ID数值,该数值需要从resoure.h头文件中查找。
- 想要接收的WM_COMMAND消息,需设定窗口类型风格SS_NOTIFY(因为静态框比较特别,一般不需产生该消息),这样就可以去该消息的(HIWORD)WPARAM是否是以STN_为首的宏消息信息。
- 可以发送的消息以STM_为首的宏,比如可以发送STM_SETICON改变显示的图标。
按钮 BUTTON
在CreateWindow/Ex指明窗口类为BUTTON就可以创建按钮控件,在风格时可以指明4种的按钮类型:
BS_PUSHBUTTON 典型的下压按钮
BS_GROUPBOX 分组按钮,一般用于控件显示上分组加以区分
BS_CHECKBOX / BS_3STATE 复选按钮,双态和三态的
BS_RADIOBUTTON 单选按钮4中类型的按钮对应不同的作用,最后两种按钮可以指明AUTO风格,这样在点击后会自动切换按钮状态,否则需要手动发送消息BM_SETCHECK来改变你想要的按钮状态(通过BN_CLICKED这个Notify-Code)来判断是否有点击。
- 第四种单选按钮可以在创建时添加WS_GROUP风格为其分组。
编辑框 EDIT
- 在CreateWindow/EX时指定类型为EDIT可以创建编辑框,用于输入文本信息。
- 风格处可以指定文本框风格,ES_MULTILINE(可写多行),ES_AUTOHSROLL,ES_AUTOVSROLL(水平垂直可扩展)等是常用的风格。同时还可添加WS_ HSROLL为其增加滚动条。
- 通常判断WM_COMMAND中Notify-Code是否为EN_CHANGE来判断编辑框有无文本改动。