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);
        }

**********************没有问题***************************

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

时间: 2024-10-05 03:50:11

MFC 判断子窗体是不是已经打开,避免重复创建的相关文章

C#中判断子窗体是否存在

可在父窗体中定义一个全局变量 public static Form form; 然后在秀出子窗体的点击事件中增加加下代码 if (form == null) { //窗体不存在时,实例化子窗体,并显示出来,CurrentBalance为子窗体名 form = new CurrentBalance(); form.Show(); } else { //窗体已经存在时,激活窗体 form.Activate(); } //在子窗体的FormClosing事件中,加入如下代码,清空父窗体中的form变量

Delphi中实现MDI子窗体(转)

Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容  ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一个典型例子.MDI体系中至少需要两种窗体,只能将其中之一设置为主窗体,其余窗体全部则全部为子窗体,主窗体负责子窗体的管理.切换等工作.自然,子窗体上承载的内容可各不相同.Tidy浏览器最终实现了三种不同的窗体:主窗体.浏览子窗体.源代码子窗体.  ② 设置窗体类型  我们通过窗体的FormStyle属性设置

【转】C# 子窗体如何调用父窗体的方法

网络上有几种方法,先总结如下: 调用窗体(父):FormFather,被调用窗体(子):FormSub. 方法1: 所有权法       //FormFather:        //需要有一个公共的刷新方法       public void Refresh_Method()        {                //...        }        //在调用FormSub时,要把FormSub的所有者设为FormFather        FormSub f2 = new

Winform 子窗体设置刷新父窗体

方法1:所有权法 父窗体:Form1    子窗体:Form2 //Form1:窗体代码 //需要有一个公共的刷新方法 public void Refresh_Method() { //... } //在调用Form2时,要把Form2的所有者设为Form1 Form2 f2 = new Form2() ; f2.Owner = this; f2.ShowDialog() ; //Form2:窗体代码 //在需要对其调用者(父)刷新时 Form1 f1 ; f1 = (Form1)this.Ow

C#父窗体跟子窗体的控件操作

很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异: 第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如: public static yourMainWindow pCurrentWin = null; 然后在主窗体构造函数中,给静态成员初始化,如下: pCurrentWin = this; 那么在子窗体

window.open 打开子窗体,关闭全部的子窗体

需求:通过window.open方法打开了子窗体,当关闭主窗体时.子窗体应当也关闭. 实现思路: 1.打开子窗体函数window.open(url,winName)的第二个參数winName能够唯一标识打开的窗体.因此关闭子窗体仅仅须要使用winName.close()函数就可以. 2.一个页面可能有多个子窗体. 因此须要一个数组存储全部子窗体对象.关闭时,遍历数组就可以. 3.子窗体还能够再打开子窗体. 无限循环下去.因此须要推断. 此需求能够通过两个方法实现. 调用子窗体的关闭函数. 此方法

WinForm------如何打开子窗体的同时关闭父窗体

方法: 如何打开子窗体的同时关闭父窗体 this.Hide(); new Frm_Management().ShowDialog(); this.Close();

主窗体里面打开子窗体&amp;&amp;打印饼图《Delphi 6数据库开发典型实例》--图表的绘制

\Delphi 6数据库开发典型实例\图表的绘制 1.在主窗体里面打开子窗体:ShowForm(Tfrm_Print); procedure Tfrm_Main.ShowForm(AFormClass:TFormClass);begin with AFormClass.Create(Self) do try ShowModal;  // 阻塞或者模态窗口,只有你把当前窗口关闭后,才能去操作父亲窗口. finally Free; end;end; //这个例子打开有异常,提示单元chart 引用本

c# 子窗体打开或者切换就最大化

"用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?",相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化:1.把父窗体的IsMdiContainer设置为True:2.把子窗体的WindowState设置为Normal:3.在父窗体中用下面的方法打开子窗体 private void testToolStripMenuItem_Click(object sender, EventArgs e) {