如何在按下标题栏的“X”按钮时调用已经编写好的函数?

No9 2000-08-31 12:01:00
我编写了一个“基于对话框”的程序,里面添加了对文件的修改,保存,退出模块,当用户
按下退出按钮时,程序会处理并提示用户保存文件,但若按下对话框上退出(即那个“X”按钮)
时,无提示即退出了。
我想知道如何对它进行处理,让它也提示保存数据,调用OnExit()函数〔自编退出处理函数〕?
谢谢!
...全文
433 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmouse 2001-10-17
  • 打赏
  • 举报
回复
gz
No9 2001-10-15
  • 打赏
  • 举报
回复
谢谢大家的帮助!
尤其要谢谢600000发送的代码!
xuyongg老兄与600000老兄方法一样的!
现在开始加分!
ray2_ls 2001-10-13
  • 打赏
  • 举报
回复
up
fpgzs 2001-10-13
  • 打赏
  • 举报
回复
gz
danper 2001-10-13
  • 打赏
  • 举报
回复
同意parttime,而且觉得OnDestroy善后很有必要
xuyongg 2001-10-13
  • 打赏
  • 举报
回复
同意partime,分别重载OnOK()和OnCancel()。点"X"时,是调用OnCancel()。在你自己的关闭按钮的处理函数中调用OnOK()就行了。
600000 2001-10-13
  • 打赏
  • 举报
回复
partime 的意见不错!
我同意他的观点!
虽然其它人有些也能实现,但都有些麻烦——多此一举!
我给你发个例子,希望能够解决你的问题!
600000 2001-10-13
  • 打赏
  • 举报
回复
partime 的意见不错!
我同意他的观点!
虽然其它人有些也能实现,但都有些麻烦——多此一举!
我给你发个例子,希望能够解决你的问题!
flyhigh 2000-11-01
  • 打赏
  • 举报
回复
在类向导的主对话框类中重载WM_CLOSE,在生成的OnClose中定义加入代码如下:
void CMyDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(MessageBox("Quit this program?","Thank you",MB_YESNO) ==IDYES)
CDialog::OnClose();
}
flyhigh 2000-11-01
  • 打赏
  • 举报
回复
在类向导的主对话框类中重载WM_CLOSE,在生成的OnClose中定义如下:
void CMyDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(MessageBox("Do you really want to quit this program?","Thank you",MB_YESNO)==IDYES)
CDialog::OnClose();
}
flyhigh 2000-11-01
  • 打赏
  • 举报
回复
在类向导的主对话框类中重载WM_CLOSE,在生成的OnClose中定义如下:
void CMyDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(MessageBox("Do you really want to quit this program?","Thank you",MB_YESNO) ==IDYES)
CDialog::OnClose();
}
andygood 2000-11-01
  • 打赏
  • 举报
回复

这个问题应该已经解决了。如果你想让按标题栏的“X”按钮时执行特殊的行为,还可以重载OnNcHitTest。在这个函数里,首先调用基类的函数以得到默认的处理。对于X按钮,默认将返回HTCLOSE。你判断,如果是的话就执行你的函数,否则直接返回基类的返回值。
sxbyl 2000-11-01
  • 打赏
  • 举报
回复
用Holly的方法最好。而且这样可以用对话框让用户确定是否真要退出程序,如果用户不想退出,不调用基类的OnCancel即可
NiceFeather 2000-11-01
  • 打赏
  • 举报
回复
重载WM_CLOSE消息函数,在其中加入自己的代码,应该行的,我做过试验!
dzl 2000-09-15
  • 打赏
  • 举报
回复
没有这样复杂吧,难道用OnClose()不行吗?

void CXxxxDlg::OnClose()
{
if (!OnExit()) return;
CDialog::OnClose();
}

bool CXxxxDlg::OnExit()
{
if (MessageBox("关闭程序?","Message",MB_ICONEXCLAMATION|MB_YESNO)==IDYES)
return TRUE;
else
return FALSE;
}
rjren 2000-09-15
  • 打赏
  • 举报
回复
要处理"X"按钮
只需在你的 CDialog子类 CYourDlg 中的OnSysCommand
添加以下代码:
CYourDlg::OnSysCommand(UINT nID, LPARAM lParam){
int nRet;
if ( SC_CLOSE == nID ){
nRet = OnExit();
if (IDCANCEL == nRet ){
return;
}

}

if ((nID & 0xFFF0) == IDM_ABOUTBOX){
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

int CYourDlg::OnExit(){
int nRet;
nRet = AfxMessageBox("Do you want to save the file?", MB_YESNOCANCEL );
if ( IDYES == nRet ){
//Save the file
}else if ( IDNO == nRet ){
//Don't save
}
return nRet;
}
Areslee 2000-09-15
  • 打赏
  • 举报
回复
处理WM_SYSCOMMAND消息。
partime 2000-09-15
  • 打赏
  • 举报
回复
重载YourClass::OnOk或OnCancel分别处理两种关闭方式
重载YourClass::QueryClose实现在决定是否关闭前预处理
重载YourClass::OnClose在关闭前做处理
重载YourClass::OnDestory在关闭后做善后
重载函数OnQueryEndSession(),来响应直接关机时的情况。
zxi666 2000-09-15
  • 打赏
  • 举报
回复
建议您这样来做:
1。在您自己的退出按钮的响应函数中,用:SendMessage(WM_CLOSE,0,0);
2。重载函数OnClose(),在其中调用诸如:MessageBox()和检查是否应该保存结果的东西;
如果您做了以上两点,就可以完成您的预想的功能,包括用Alt+F4来退出的情况。但是,还要注意这些退出情况:
1。如果您没有去掉对话框模版中的“取消”按钮,ID号是(IDCANCEL),那么,您还需要重载OnCancel()函数;
2。这时用ESC键可以直接退出,您需要重载PreTranslateMessage()函数,由pMsg->message和pMsg->wParam来判断是否按下ESC键;
3。重载函数OnQueryEndSession(),来响应直接关机时的情况。
祝您好运!
Holly 2000-09-14
  • 打赏
  • 举报
回复
上贴的OnExit;--->OnExit();

针对X,响应IDCANCEL命令消息OnCancel()
void CMyDialog::OnCancel()
{
CDialog::OnCancel();
OnExit();
}

加载更多回复(3)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧