对话框
对话框其实是含有子窗口的窗口
可以利用ID来取得子窗口代码
GetDlgItem(HWND hDlg,int nID)
如果没有好的Win32函数还产生对话框,那么要调用CreateWindowEx产生一个父窗口,然后再调用来产生子窗
口,而且CreateWindowEx的参数之多!太麻烦了
用对话框设计器设计好的对话框经编译后产生二进制位,含有一个DLGTEMPLATEEX结构,一个可有可无的
FONTINFOEX结构,以及0个多个DLGTITEMTEMPLATEEX结构,但是大部分时间不需要处理这些结构的
如果想将LB_ADDSTRING信息发给Listbox,则要调用SendMessage并先取得listbox的handle
可以使用GetDlgItem(listboxID),然后SendMessage,或使用SendDlgItemMessage直接根据listid来
发送信息,后一种方法更简洁
如果要产生一个对话框,那么必须有内存来放一个DLGTEMPLATEEX结构,一个可有可无的FONTINFOEX结构,以及
0个多个DLGTITEMTEMPLATEEX结构,我们常常使用CreateDialogParam
CreateDialogParam的调用函数
CreateDialogIndirectParam--->CreateWindowEx
用对话框设计器来设计的对话框一般没有指定window class的name 那么系统使用#32770来表示,并且提供了
一个默认的对话框处理函数DefDlgProc和DefWindowProc一样
在父窗口和所有的子窗口都产生后CreateDialogIndirectParam发出WM_INITDIALOG信息给父窗口
对话框类别的窗口函数
每个对话框是一个窗口,那么就应该有一个window class,而这个window class 中的窗口函数和name就应该有
了window class :#32770
窗口函数:DefDlgProc
LRESULT DefDlgProc(
HWND hDlg, // handle to dialog box
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
但是光一个默认的还是不够的,自己也要定义个消息处理函数
BOOL DlgProc(
HWND hDlg, // handle to dialog box
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
注意返回值是BOOL
当父窗口收到窗口信息,先进入DefDlgProc,然后调用我们自己的对话框函数
所有对话框函数都必须传回TRUE或FALSE,表示我们是否已经处理这个信息.处理了就返回TRUE
反之是FALSE
但是有些问题出现了WM_QUERYENDSESSION要求返回0,但是如果这个信息被处理了,那么返回TRUE,而TRUE是
非0,那么该如何呢?
这样只有微软来处理了,她修改DefDlgProc,随后他又提出一种有效的方式来表示消息处理的结构,那就是给
产生出来的对话框增加4个额外的位,使用GetWindowLong/SetWindowLong 传入DWL_MSGRESULT标示,来取代
和设置他们,所以使用方法如下:
SetWindowLong(hwndDlg,DWL_MSGRESULT,lResult);
并且能传回TRUE或FALSE来表示消息是否被处理
为了上述方便,就定义了一个宏SetDlgMsgResult(详细请看WindowsX.h)来处理上述的问题
SetWindowText 送出一个WM_SETTEXT给DefDlgProc
Modeless对话框是使用CreateDialogParamIndirect来产生的
为什么对话框产生后,仍然能在别的地方单击或作别的事能,原来CreateDialogParamIndirect成功后返回原
处继续执行,使得调用线程继续执行,而Modal对话框能,它使调用线程挂起(有自己的消息回路),并等待对
话框的返回
可以为对话框指定键盘接口
使用IsDialogMessage来完成
他的调用如下:
int WINAPI WinMain(...)
{
MSG msg;
//Create the dialog box parent window and all its child window
HWND hwndDlg = CreateDialogParam(...);
.
.
while(GetMessage(&msg,NULL,0,0))
{
if(!IsDialogMessage(hwndDlg,&msg))//添加键盘的支持
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Modal对话框:
DialogBoxParam(...)
Modeless对话框中没有消息循环而Modal对话框中有,所以EndDialog只能用来结束Modal对话框
注意点:自己对话框窗口函数必须返回FALSE!
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)