作者:博士吃货 | 来源:互联网 | 2023-10-10 09:32
我在MFC里设了一个窗口,IDD_DATASHOW.在A函数里打开这个窗口A{DataShowDlgShow;Show.DoModal();}我现在希望在调用A的时候,如果窗口原
我在MFC里设了一个窗口,IDD_DATASHOW.在A函数里打开这个窗口
A{
DataShowDlg Show;
Show.DoModal();
}
我现在希望在调用A的时候,如果窗口原来是打开的,就先关闭,然后再打开,这个代码应该怎么写呢?
16 个解决方案
1.DataShowDlg Show;声明为一个全局变量,如果A函数是类的成员函数的话,则可以把Show声明为类的成员变量
2.A函数中实现如下:
if(NULL != Show.GetSafeHwnd())
{
Show.EndDialog(IDCANCEL);//相当于CDialog::OnCancel();如果是EndDialog(IDOK),则相当于CDialog::OnOK();
}
Show.DoModal();
我觉得楼主可以直接先关闭,再打开,不用管他以前是不是已经打开了,反正即便是没打开你关闭只能是失败什么的。。。怕什么
DataShowDlg Show;
if(NULL != Show.GetSafeHwnd())
{
Show.EndDialog(IDCANCEL);//测试中发现,这里不管窗口是否打开,都是不执行的 }
Show.DoModal();
代码这么写没错吧,为什么那个关闭的代码不执行呢?
前提是DataShowDlg Show;声明为一个全局变量。。。楼主,你定义的那个DataShowDlg Show;不是你已经打开的那个。。。
DataShowDlg Show;
这行代码是声明一个局部变量,还是全局变量啊?
我用计时期10秒触发一个事件,这个事件里有打开窗口的代码。现在程序编程10秒就打开一个窗口,原来已经打开的也不关闭。所以我想知道一下怎么把原来已经打开的窗口关闭。本人初学C++,属于小白。
如果只有一个线程在调用的话, 应该是不会有问题的. 因为 DoModal() 会等你的对话框关闭后才返回.
但是这也不是绝对的, 虽然说 DoModal() 还没有返回, 但是你的窗口的消息处理函数一样会被调用. 只要你确保 DataShowDlg 这个对话框的消息处理函数不会调用 A 函数就 OK 了.
把你的 DataShowDlg Show 声明成一个函数内的 static 变量吧.
简单就别局部变量,一定要局部变量就先FindWindow,找到了就关闭,可以用SetProp,GetProp辅助
static DataShowDlg Show;这样写