首页 > 代码库 > MFC 判断子窗体是不是已经打开,避免重复创建

MFC 判断子窗体是不是已经打开,避免重复创建

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);
        }
**********************没有问题***************************