大家帮我看看,为什么我的这个消息退不出来?

B2China 2004-07-26 01:42:56
for(int i= 0; i<30000;i ++)
{
// 消息循环
::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}

// 如果检测到窗体关闭的消息
if(msg.message == WM_CLOSE)
{ if(MessageBox("你确定要退出吗?",
"确定",MB_YESNO+MB_ICONQUESTION) == IDYES)
return;
}

... // 这里进行内部的计算处理
}

在上面的for循环进行内部计算处理中,我如果关闭窗体,在接着出现的对话框中,我点“否”,程序的界面就不见了,怎么搞的啊?
...全文
135 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
无敌魔仙 2004-07-27
  • 打赏
  • 举报
回复
还是用我的方法吧,到处的关闭消息都可以拦截:

你可以试试处理WM_SYSCOMMAND然后检查是否为关闭消息--SC_CLOSE,然后 弹出用户选择框,如果用户选择关闭,那么你就 再PostQuitMessage给主窗口,就可以达到你的效果的
B2China 2004-07-26
  • 打赏
  • 举报
回复

我现在窗体的“关闭”按钮可以正常实现按钮发出的关闭消息的捕捉
void CProcessDataDlg::OnBtnExit()
{
if(IDNO == MessageBox("是否退出?","确定",MB_YESNO + MB_ICONQUESTION))
return;

RedrawWindow();
PostMessage(WM_CLOSE,0,0);
}


for循环的消息捕捉:
for(int i=0;i<30000;i++)
{
::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
Sleep(100);
if(msg.message == WM_CANCEL)
return;
if(msg.message == WM_CLOSE)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
return;
}

ProcessData();
}
但是现在无法捕捉到关闭标题栏右方的X按钮的关闭消息,
程序怎么检测到窗体标题栏右方的那个X“关闭”按钮的消息啊?
B2China 2004-07-26
  • 打赏
  • 举报
回复
我改成这样可以了

while(i<3000)
{
// 查看消息
::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
Sleep(100);

if(msg.message == WM_CANCEL) // 如果是取消消息
return;
if(msg.message == WM_CLOSE) // 如果是窗体关闭消息
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
return;
}
ProcessData(); // 数据处理
}

特别是在原来的那个“退出”按钮的事件处理写成这样:

if(IDNO == MessageBox("是否退出","确定",MB_YESNO + MB_ICONQUESTION))
return;

m_bExit = TRUE;
RedrawWindow();
PostMessage(WM_CLOSE,0,0);

这样基本上可以实现关闭退出功能了,但是对于窗体标题栏右上方的“关闭”那个XX按钮
,就是不能捕捉到它的关闭消息,怎么捕捉呢?
无敌魔仙 2004-07-26
  • 打赏
  • 举报
回复
你可以试试处理WM_SYSCOMMAND然后检查是否为关闭消息--SC_CLOSE,然后 弹出用户选择框,如果用户选择关闭,那么你就 再PostQuitMessage给主窗口,就可以达到你的效果的
无敌魔仙 2004-07-26
  • 打赏
  • 举报
回复
PM_REMOVE
Messages are removed from the queue after processing by PeekMessage
B2China 2004-07-26
  • 打赏
  • 举报
回复
还是不行,点“否”以后程序在后台运行,就是窗体不见了。

大家一般怎么处理这个问题的?
就好像在拷贝一个大文件,在拷贝的过程中,如果点了“取消”按钮,程序会弹出一个
对话框:“是否取消?”,如果选“否”,继续拷贝;如果选“是”,拷贝全部取消。
leonda 2004-07-26
  • 打赏
  • 举报
回复
試試改成下面看, 最好在mainframe下面進行消息處理~~~~~~~~~~
for(int i= 0; i<30000;i ++)
{
// 消息循环
::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
{
// 如果检测到窗体关闭的消息
if(msg.message == WM_CLOSE)
{ if(MessageBox("你确定要退出吗?",
"确定",MB_YESNO+MB_ICONQUESTION) == IDYES)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
return;
}
}

}

// 如果检测到窗体关闭的消息

... // 这里进行内部的计算处理
}
B2China 2004-07-26
  • 打赏
  • 举报
回复
这时是不是要把WM_CLOSE消息移出消息队列?
B2China 2004-07-26
  • 打赏
  • 举报
回复
实际运行时,用户选择“否”,然后程序虽然主窗体不见了,但是进程还是可以看见在执行,执行完毕以后就什么都看不见了。
B2China 2004-07-26
  • 打赏
  • 举报
回复
BestBear(天外飞熊)
-----------------
选“否”以后,用户不需要关闭窗体,所以我就不需要做任何动作,让循环继续啊。

但是主窗体怎么这时却不见了。
zhuzhufox 2004-07-26
  • 打赏
  • 举报
回复
漏了
if msg == WM_CLOSE
if MessageBox () == IDYES
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
bestbear 2004-07-26
  • 打赏
  • 举报
回复
干吗不在消息处理过程里做???
在那里不是很好吗
zhuzhufox 2004-07-26
  • 打赏
  • 举报
回复
if MessageBox () == IDYES
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
bestbear 2004-07-26
  • 打赏
  • 举报
回复
你那个messagebox中,用户选否的话,你没有任何处理阿
在messagebox之前,你已经发出了close消息了
这样程序直接执行,就退出了阿
B2China 2004-07-26
  • 打赏
  • 举报
回复
wangjinwang(王进)
----------------------
不行啊,注释起来了以后在出现的对话框:
“你确定要退出吗?”
我点“否”,它就一直提示个不停啊?点“是”程序可以正常退出。
B2China 2004-07-26
  • 打赏
  • 举报
回复
zhuzhufox(狐狸的小猪)
--------------------------------------
你说把消息捕捉放在for循环的后面,放在for循环的起始处和for循环的末尾好像没有多大的区别把?
zhuzhufox 2004-07-26
  • 打赏
  • 举报
回复
处理完... // 这里进行内部的计算处理
然后WM_CLOSE了呀。
孤必有邻 2004-07-26
  • 打赏
  • 举报
回复
把你的“内部的计算处理”注释起来试一下,怀疑里面有问题
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

16,472

社区成员

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

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

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