您的位置:首页 > 其它

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

2014-06-09 10:39 375 查看
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);
        }
**********************没有问题***************************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: