MFC 判断子窗体是否已经打开,避免重复创建
在主窗体中,嵌入一个很多个子窗体,但是,每次只显示一个。
我的做法是,首先在主窗体头文件中定义子窗体对象,然后在单击显示按钮的时候,先判断子窗体是否已经被创建,如果创建了,则ShowWindow(SW_SHOW);将其他已经创建的窗体ShowWindow(SW_HIDE);如果没有创建,则先Create窗体并显示。
在MainDlg.h里面定义:
DeviceParam deviceParam;//设备信息窗体
Version ver;//版本信息窗体
按下按钮判断是否已经存在:
CWnd* pChild;
pChild = deviceParam.GetActiveWindow();
if(NULL != pChild)
{
deviceParam.ShowWindow(SW_SHOW);
}
else
{
deviceParam.Create(DeviceParam::IDD,this);
deviceParam.SetParent(this);
deviceParam.ShowWindow(SW_SHOW);
deviceParam.SetWindowPos(NULL,x,y,deviceParam.Width,deviceParam.Height,0);
}
------解决方案--------------------
在MainDlg.h里面定义:
DeviceParam deviceParam;//设备信息窗体
Version ver;//版本信息窗体
CWnd* pChild;
MainDlg的构造函数里面
pChild=NULL;
在关闭pChild的时候要发送消息给MainDlg窗口把pChild=NULL;
按下按钮判断是否已经存在:
pChild = deviceParam.GetActiveWindow();
if(NULL != pChild)
{
deviceParam.ShowWindow(SW_SHOW);
}
else
{
deviceParam.Create(DeviceParam::IDD,this);
deviceParam.SetParent(this);
deviceParam.ShowWindow(SW_SHOW);
deviceParam.SetWindowPos(NULL,x,y,deviceParam.Width,deviceParam.Height,0);
}
差不多就这样了
------解决方案--------------------
在关闭pChild的时候要发送消息给MainDlg窗口把delete pChild;pChild=NULL;
------解决方案--------------------
成员变量:
CDialog* p[10];
构造函数:
for(int i=0; i<10; i++) p[i] = NULL;
假设有6个选项,每个选项对应一个对话框
switch(k)
{
if(p[k] == NULL){ p[k] = new CDialog(); p[k]->Create(); }
}
Show(k);
单独写Show函数
for(int i=0; i<10; i++)
{
if(p[i] != NULL) p[i]->ShowWindow(SW_HIDE);
}
p[k]->ShowWindow(SW_SHOW);
------解决方案--------------------
引用:
成员变量:
CDialog* p[10];
构造函数:
for(int i=0; i<10; i++) p[i] = NULL;
假设有6个选项,每个选项对应一个对话框
switch(k)
{
if(p[k] == NULL){ p[k] = new CDialog(); p[k]->Create(); }
}
Show(k);
单独写Show函数
********************************************************
******************自己测试通过解决方案*********************
static CDlgResetAlarmInfo *p_DlgResetAlarmInfo = new CDlgResetAlarmInfo; HWND hWnd = p_DlgResetAlarmInfo->GetSafeHwnd(); if(IsWindow(hWnd)) { p_DlgResetAlarmInfo->ShowWindow(SW_SHOW); } else { p_DlgResetAlarmInfo->Create(CDlgResetAlarmInfo::IDD,CWnd::FromHandle(a_pTrend->GetSafeHwnd())); p_DlgResetAlarmInfo->ShowWindow(SW_SHOW); }
**********************没有问题***************************
MFC 判断子窗体是不是已经打开,避免重复创建