vc对话框关闭按钮

来源:互联网 发布:网络传播的特点 编辑:程序博客网 时间:2024/06/04 18:29


对话框默认用的两个按钮的ID分别是IDOK和IDCANCEL,这两个都是在winuser.h 中预定义的系统标准控件ID。 
对于标准ID,你不重载时MFC会自动调用父类的相应处理函数。 
比如IDOK映射到CDialog::OnOK()函数,IDCANCEL映射到CDialog::OnCancel()。

在这两个函数的源码如下: 
void CDialog::OnOK() 

if (!UpdateData(TRUE)) 

TRACE(traceAppMsg, 0, "UpdateData failed during dialog termination.\n"); 
// the UpdateData routine will set focus to correct item 
return; 

EndDialog(IDOK); 
}

void CDialog::OnCancel() 

EndDialog(IDCANCEL); 

可以看出点击这两个按钮,都会调用EndDialog()来关闭对话框,只是返回值不同。 
EndDialog()函数调用了DestroyWindow()函数,DestroyWindow()函数又发送了WM_DESTROY消息,该消息的处理函数是OnDestroy(),对话框的生存期最后一个函数是PostNcDestroy()函数。

点那个叉叉呢,首先向对话框发送WM_CLOSE消息,由OnClose()函数处理,它调用DestroyWindow(),其后是和上面一样的路由。 
可以看出点叉叉的时候绕过了OnOK()和OnCancel()。

小结一下: 
1. 点“确定”、“取消”时的关闭路由为 
OnOK()或OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy() 
2. 点“关闭”标题栏按钮的关闭路由为 
OnClose()---> OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()

给你的退出按钮添加标识符IDC_XXX; 
在类向导里面选择Message Maps这个选项,然后在class name里面选择一个类(取决于你需要在哪个类里面实现这个功能),以对话框为例: 
选择C**Dlg类,Object IDs里面找到你的标识符IDC_XXX,在右边的Message里面添加BN_CLICKED消息响应(Add Function->Edit Code)在对应的函数里面添加上代码: 

//想做的事情
OnOK(); 

或者使用:exit(0);

0 0
原创粉丝点击