【今日/总数】文章:0/2773 用户:0/10774 书籍:0/200
回顾2016,喜迎2017,以“回顾我与C++技术网的2016,展望C++技术网的2017”为主题,发表文章,将有机会赢得2个月的会员或现金红包。

当前位置:工作生活 -> 提问 -> 如何实现对话框自动消失

原创版权标志如何实现对话框自动消失

作者:awaker  发表时间:2017/1/7 22:50:22  阅读:113
[摘要]C++技术网已经用心解答了用户提出的问题【如何实现对话框自动消失 】,如还有问题,请继续在文章底部留言交流,直到完全懂了为止。
文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。


如何实现右键单击弹出一个提示对话框,然后右键单击另一个地方 或者控件,新弹出一个对话框,原来的提示框自动消失?主要是对话框自动消失 不知道咋处理

实现对话框,自动消失,鼠标右键消失

#include "MsgDlg.h"
void  CSamtestDlg::OnRClick(NMHDR *pNotifyStruct, LRESULT* pResult)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*)pNotifyStruct;
TRACE(_T("Clicked on row %d, col %d\n"), pItem->iRow, pItem->iColumn);
int n = pItem->iRow;
int m = pItem->iColumn;
//int OD[10][8][24];
CString s;
s.Format(_T("%d,%d "),OD[0][n-1][m-1], OD[1][n - 1][m - 1] );
// m_Msg = s;
/*::AfxMessageBox(s); */
  CMsgDlg * dlg = new CMsgDlg  ;  
dlg->Create(IDD_MSG_DIALOG );
dlg->ShowWindow(SW_SHOWNORMAL); 
UpdateData(FALSE);
}




C++技术网会员解答:

    这个问题总结一下描述:就是在窗口右击弹出一个对话框后,如果在窗口其他空白位置再点击时,会弹出另外一个窗口,并且让之前弹的窗口关闭。

    下面来详细捋一下实现思路:

1.弹出对话框类型有模态对话框和非模态对话框之分

2.如何弹出对话框,思路扩展

3.弹出一个新对话框

4.关闭已经弹出来的那个对话框


    如果这个四个问题搞定,这个问题也就清清楚楚了。实现的这个效果大概是这样的,对话框就和提示框一样,不需要用户主动去关闭,单击或者右击其他空白位置,就可以弹出新的对话框,确实会很方便。对话框上都可以不用显示关闭的按钮,这样看上去更加美观,当然加上小叉叉可能会好点,这是用户习惯问题。

    当你弹出第一个对话框,然后后面操作会自动关闭前面的对话框,弹出新的对话框,那么最后一个对话框如何消失呢?如果不提供关闭按钮,那么就需要提供一个机制确保对话框自动关闭。很容易想到的方案就是定时器,对话框显示时,对话框自己计时,当到达一个时间后,就自己关闭自己。

    那么下面来针对四个问题,做详细的分析:

1.弹出对话框类型有模态对话框和非模态对话框之分

    对话框有模态对话框和非模态对话框之分,我们需要注意。模态对话框就是必须要手动在对话框上单击确定关闭按钮才能关闭的,就是要强迫用户主动操作对话框的。我们这里做的就是不需要用户去关闭,由程序自动关闭,所以显然模态对话框是不合适的。模态对话框显示之后,用户就没法操作主窗口的其他地方了,就没法达到预期的效果了。

    所以,我们用的就是非模态对话框,而非模态对话框就和普通的窗口一样的操作。我们使用CreateWindow函数创建窗口,用ShowWindow函数显示窗口。用DestroyWindow函数销毁窗口。

2.如何弹出对话框,思路扩展

    那么如何弹出对话框呢?问题描述的是右击,给出的代码例子也是右击的。为了说明问题的关键,这里就不拿例子来说,例子的代码是控件上的单击的,可能会将问题焦点分散了。

    弹出对话框其实就是创建显示一个窗口而已。所以,不管是单击、右击还是双击,都无所谓,只要触发显示窗口的代码执行就可以了。我们在很多软件上看到的就是单击一个位置,弹出一个提示框,再单击一个位置就弹出另外一个提示框。有的也可以是悬停时提示,反正道理都一样。你想这么弹都可以。

3.弹出一个新对话框

    弹出一个新对话框,就和第一个对话框一样弹出来,这个好说。就拿例子的关键代码来演示:

#include "MsgDlg.h" //包含对话框类头文件
CMsgDlg * dlg = new CMsgDlg;  //创建一个新对话框对象
dlg->Create(IDD_MSG_DIALOG );//创建对话框窗口
dlg->ShowWindow(SW_SHOWNORMAL); //显示对话框窗口
     当然,这里创建窗口可以是new出来的,也可以是成员对象,就根据自己的需要来选择。

4.关闭已经弹出来的那个对话框

    根据问题的描述,主要就是这个位置有点迷惑。非模态对话框并不会阻止用户操作窗口的其他未被提示对话框遮住的位置。所以,新对话框窗口的显示和前一个对话框窗口显示是同一个代码。那么关闭窗口代码在哪里呢?也在显示对话框窗口的位置。

    所以最复杂的位置就在于这个位置了。当用户鼠标右击窗口的时候,你要判断是不是有对话框显示了,有的话就关闭,然后弹出新的对话框,没有就直接显示对话框。如果提示的内容的格式和样式都不一样,那么每一个对话框都要制作一个对话框。这样的话,根据操作的位置不同,我们来区分要显示的是哪个对话框。比如我们可以根据用户右击窗口的坐标位置来区分。例子中是一个表格,应该就是单击不同的表格,显示不同的内容。这样我们可以先获取到表格的内容,然后再显示的提示对话框中。一列数据和一行数据提示的样式肯定是不一样的,这样的话,就要制作两种提示对话框。毕竟制作对话框要方便些,如果不嫌麻烦,也可以直接动态创建对话框上的控件和显示内容。

    如果是不同的表格的单元格,内容格式都是一样的,只是数据不一样,这样的话,就不必创建很多个对话框,只需要一个对话框就行了。获取到单元格数据后,就更新到提示框里就行了。

    那么问题就来了,我们关闭对话框就分为两种。如果上次和本次提示的内容是一样的,我们就不需要销毁之前的对话框,只需要更新内容就行了。当然,如果是为了方便,统一销毁之前的对话框,然后统一创建新的对话框也是可以的。

    那么我们关闭对话框是隐藏对话框还是销毁呢?因为可能涉及到不同的对话框,所以为了方便,可以统一销毁,再创建。用户手动单击的频率不会太高,所以不存在效率问题。

    至于要依据什么规则来显示不同的提示对话框,这里我就不说了,不同的应用不一样。可能本例是依据单击的行列号来提示的吧。


    以上是对问题的详细分析,下面来给一个可行的实现方案:

原理流程图:

如何实现对话框自动消失

1.鼠标响应函数作为处理分发中心,并记录前一个窗口和本窗口等信息

2.不同的条件启用不同的提示对话框

3.不同的对话框本身的定时关闭窗口由对话框类自己实现,不再主窗口类中处理。


    那么完整的思路全部写出来了,基本的代码就由你自己根据自己的需要来实现吧。

文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。


当前位置:工作生活 -> 提问 -> 如何实现对话框自动消失

  • codexia    2017/1/9 11:14:28回复
    判断提示框是否显示,可以通过窗口句柄是否为空,也可以通过对话框对象指针是否为空,也可以通过设定一个布尔变量来跟踪。


返回顶部

关于我们 QQ群 广告服务 增值服务 捐款资助 版权声明 RSS订阅 站点地图 百度网站地图 意见反馈
鄂ICP备14001349号-2, Copyright © 2014-2017, CJJJS.COM/CJJJS.CN, All Rights Reserved

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)