c++单文档如何在点关闭按钮时出现提示框,必须是在窗口关闭前出现

c++单文档如何在点关闭按钮时出现提示框,必须是在窗口关闭前出现,第1张

WM_CLOSE是标准消息,不是一楼说的命令消息。二楼的答案没错,VS2005用向导做的话鼠标点几下就行了。切换到类视图,选中CMainFrame,右击,选属性,在属性窗口中选择消息(点属性窗口顶上倒数第二个图标),找到WM_CLOSE消息,添加消息处理就行了,代码二楼的一样

对话框默认用的两个按钮的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()--->DestroyWindow() --->OnDestroy() --->PostNcDestroy()

回答楼主的问题:

请注意,上面提到的这些函数统统都是可以重载的,在重载时加入了你自己的代码后,应该调用父类CDialog同名的函数才能正确路由下去,否则就关不了对话框了。

举个例子,重载了关闭的小叉叉

void CAboutDlg::OnClose()

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

DoSomthing(0// 执行自己的判断等等

// CDialog::OnClose()// 把向导生成的父类调用给注释了,这时就关不了对话框了。

}

补充回答,

点叉叉会发送WM_CLOSE消息,如果需要重载的话,应该在对话框的属性窗口中,选择WM_CLOSE消息来添加消息处理函数。

VS的IDE会自动添加如下三段:

1. xxx.h文件,类声明中加入OnClose()函数声明

afx_msg void OnClose()

2. xxx.cpp文件,加入消息映射宏

ON_WM_CLOSE() // 对于Windows标准消息,都是这种简短的格式。

3. xxx.cpp文件,加入函数体

void CMyDlg::OnClose()

{

CDialog::OnClose()

}

上述3处如果都正常的话,叉叉就映射到OnClose()了。

你说的映射到OnCancel()个人觉得有两种可能,

第一、缺ON_WM_CLOSE()宏,却多个一个ON_BN_CLICKED(IDCLOSE, &CMyDlg::OnCancel)宏

第二、在OnClose()中调用了OnCancel()

我试了一下,在调用OnClose后又调用了OnBnClickedCancel,所以是多次delete的问题,应该在delete时这么写

if(pstr != NULL)

{

delete pstr

pstr = NULL

}

(1)点击IDOK按钮退出:先调用OnOK(),然后是OnDestory(),最后是PostNcDestroy()

(2)点击IDCANCEL按钮退出:先调用OnCancel(),然后是OnDestory(),最后是PostNcDestroy()

(3)点击右上角的关闭按钮退出:先OnClose(),然后是OnCancel(),再然后是OnDestory() ,最后是PostNcDestroy()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11412812.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存