关于ShowWindow(SW_HIDE)不能把窗口隐藏的问题

zyhserry 2010-04-06 10:28:21
像QQ游戏那种,有大厅和游戏界面,大厅的弹出对话框内有倒计时,倒计时结束后自动关闭对话框

现在的问题是,大厅弹出倒计时对话框后,我切换到游戏界面,再切换回大厅,看到倒计时对话框计时到了,但是对话框没有关闭,调试版本断点到确实调用了ShowWindow(SW_HIDE),但是对话框没有关闭!

大厅和游戏窗口都是从CDialog继承的!
...全文
1441 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-04-14
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
dd_zhouqian 2010-04-14
  • 打赏
  • 举报
回复
直接close掉好了
zhangxin357 2010-04-14
  • 打赏
  • 举报
回复
destory
SullenSun 2010-04-06
  • 打赏
  • 举报
回复
应该没问题的,你再仔细看看。。
向立天 2010-04-06
  • 打赏
  • 举报
回复
代码看不出问题
建议这样做一下测试
在OnOk里设断点
然后切换到别的程序
看看能不能正常执行到ShowWindow(SW_HIDE);
如果可以
那就是在大厅获得焦点的时候激活了这个窗口的显示
那就要检查一下相关的代码了
如果没有执行到
那就是时钟消息有问题
不过这种可能新比较小
zyhserry 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lllyyy2403 的回复:]
void CMsgBoxDlg::OnOk()
{
KillTimer(WAIT_TIMER);
ShowWindow(SW_HIDE);
}
----------你这里的ShowWindow函数没有指明窗口句柄,是否就是这个原因?
[/Quote]


内部直接调用就是隐藏自已啊。。。。。CMsgBoxDlg基类是CDialog
lllyyy2403 2010-04-06
  • 打赏
  • 举报
回复
void CMsgBoxDlg::OnOk()
{
KillTimer(WAIT_TIMER);
ShowWindow(SW_HIDE);
}
----------你这里的ShowWindow函数没有指明窗口句柄,是否就是这个原因?
zyhserry 2010-04-06
  • 打赏
  • 举报
回复

void CMsgBoxDlg::OnTimer(UINT_PTR nIDEvent)
{
if(nIDEvent == WAIT_TIMER)
{
DWORD dwElipsTime = GetTickCount()-m_dwUpdateTime;
m_dwUpdateTime = GetTickCount();
m_dwTime += dwElipsTime;

if((m_dwTime)/1000 - (m_dwTime-dwElipsTime)/1000== 1)
{
CRect rect;
rect.SetRect(10,119,250,141);
InvalidateRect(rect,FALSE);
}

if(m_dwTime >= 10000)
{
OnOk();
}
}

__super::OnTimer(nIDEvent);
}
void CMsgBoxDlg::SetMsg(const CString& msg)
{
m_strMsg = msg;
m_dwUpdateTime = GetTickCount();
m_dwTime = 0;
SetTimer(WAIT_TIMER,5,NULL);
Invalidate();
}
void CMsgBoxDlg::OnOk()
{
KillTimer(WAIT_TIMER);
ShowWindow(SW_HIDE);
}
void CMsgBoxDlg::OnClose()
{
KillTimer(WAIT_TIMER);
ShowWindow(SW_HIDE);
}
zyhserry 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]
你这个窗口是怎么管理的?
是不是倒计时结束之后就没用了?
可不可以直接close掉
[/Quote]


有用的,是一个全局消息提示框,单体,只要有消息要提示,就会显示,正常况下,10秒后自动隐藏,或者手动隐藏
向立天 2010-04-06
  • 打赏
  • 举报
回复
你这个窗口是怎么管理的?
是不是倒计时结束之后就没用了?
可不可以直接close掉
zyhserry 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xianglitian 的回复:]
你的倒计时窗口是自己隐藏自己?
如果切换出去了
再回来可能调用了showwindow(SW_HOW)
你说的切换是你的大厅和别的程序的切换
还是大厅和这个倒计时窗口的切换
[/Quote]


自已隐藏自已,大厅和别的窗口切换。。。。
向立天 2010-04-06
  • 打赏
  • 举报
回复
你的倒计时窗口是自己隐藏自己?
如果切换出去了
再回来可能调用了showwindow(SW_HOW)
你说的切换是你的大厅和别的程序的切换
还是大厅和这个倒计时窗口的切换
zyhserry 2010-04-06
  • 打赏
  • 举报
回复
应该不是时钟的问题,时钟可以到计时到0秒,而且不切换的时候可以正常隐隐的。。。。。

是不是窗口激活与非激活状态对ShowWindow有影响????
zhou1xp 2010-04-06
  • 打赏
  • 举报
回复
这个应该是你的时钟的问题,代码贴出来
zyhserry 2010-04-06
  • 打赏
  • 举报
回复
应该是窗口切换的问题,只要切换一下窗口,再回来,肯定隐藏不了,不切换的话,没这个问题,不知道是什么原因!
tanwei1002 2010-04-06
  • 打赏
  • 举报
回复
调试看看
Kudeet 2010-04-06
  • 打赏
  • 举报
回复
倒计时的窗口应该是非模式的吧!应该是一个简单的对话框,你看看是不是其他的地方又阻止其隐藏了...
瓶盒 2010-04-06
  • 打赏
  • 举报
回复
可以试下把CMsgBoxDlg的父窗口和owner窗口置为空
向立天 2010-04-06
  • 打赏
  • 举报
回复
把原来用ShowWindow(SW_HIDE)的地方改称SendMessage(WM_CLOSE, 0, 0)试试

不过你所说的会出现多个消息窗口的问题其实是可以解决的
要看你的管理机制
比如创建一个消息窗口后就保存这个窗口的句柄
再来消息如果该句柄不为NULL就通过句柄处理
当消息窗口销毁是也同时将这个窗口句柄置空
zyhserry 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xianglitian 的回复:]
还是建议你每次来消息的时候新建窗口
然后及时销毁信息窗口
使用隐藏/显示模式不太好
[/Quote]

这会产生新问题的,就是会出现多个消窗口。。。。



我试了下不用ShowWindow(SW_HIDE)用CDialog::OnCancel()也是能隐藏窗口的,最小化的时候,也能隐藏
但是用CDialog::OnCancel()有另外一个问题,就是窗口最小化的时候,倒计时还没完呢,窗口就不见了
所以这个问题,很让人抓狂啊!!!
加载更多回复(4)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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