对话框学习笔记

对话框
对话框其实是含有子窗口的窗口

可以利用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!

BOOL WINAPI XXX_DlgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    
switch(uMsg) 
    
{
    .
                     .
    }

    
return FALSE;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值