暑假跟着学长做的一个项目,其中涉及到多播流的编写,设计思路是 为了便于管理每一个广播,把每一个广播创建为一个单独的子窗口,这样方便管理而且不会影响到其他的广播流。但是多个MDI子窗口被创建后,为了视觉效果和便于管理,我们需要把很多的子窗口最小化到主界面的某个角落,便于需要观看的时候。只要点击最大化就行。现在说一下遇到的困难,第一种情况:一开始如果主界面没有任何的控件,这样就可以任意创建多个窗口而且可以最小化到主界面的角落里管理,下面会给出代码。第二种情况:主界面上有很多的控件这样如果按照上面那样创建MDI子窗口的话,子窗口会被控件挡住。第三种情况:为了防止第二的情况(子窗口被遮住)出现,此时会使用API函数SetParent(参数1,参数2)。等一下介绍该函数,该函数可以解决第二种情况出现的情况,但是当子窗口最小化的时候,子窗口会消失掉,但是没有关掉,只是不能看见了(待会说原因)。所以为 了解决第三种情况,第四情况出现了:就是在创建子窗口之后,不为子窗口指定父窗口。执行SetParent函数时为它创建一个父窗口,而且这个父窗口就是主界面。这样就可以所有问题。不会被遮住,不会最小化消失。以下是代码。
第一种情况:父窗口没有任何控件,除了一个按钮。
父窗口:frmMain 子窗口:frmchild
frmMain->IsMdiContainer = true;//说明父窗口是个mdi 容器
frmchild->TopMost = true;//永远显示在最上面
单击按钮事件执行以下函数:
frmchild^ Child = gcnew frmchild();
Child->Show();
Child->MdiParent = this;//指定子窗口的父窗口是frmMain
第二种情况:主界面有控件(panel),代码如情况1
第三种情况:父窗口有一个panel时,他会挡住子窗口(如果按照上面的代码)
[DllImport("user32")]
static int SetParent(int hWnChild, int hWndNewParent);
此时调用API 函数 SetParent(参数1,参数2);
代码:
父窗口:frmMain 子窗口:frmchild
frmMain->IsMdiContainer = true;//说明父窗口是个mdi 容器
frmchild->TopMost = true;//永远显示在最上面
单击按钮事件执行以下函数:
frmchild^ Child = gcnew frmchild();
Child->Show();
Child->MdiParent = this;//指定子窗口的父窗口是frmMain
SetParent((int) Child.Handle,(int)this.Handle)//位子窗口换一个父窗口,
第四种情况:解决第三种情况出现的问题(最小化消失)
[DllImport("user32")]
static int SetParent(int hWnChild, int hWndNewParent);
此时调用API 函数 SetParent(参数1,参数2);
代码:
父窗口:frmMain 子窗口:frmchild
frmMain->IsMdiContainer = true;//说明父窗口是个mdi 容器
frmchild->TopMost = true;//永远显示在最上面
单击按钮事件执行以下函数:
frmchild^ Child = gcnew frmchild();
Child->Show();
//Child->MdiParent = this;//指定子窗口的父窗口是frmMain
SetParent((int) Child.Handle,(int)this.Handle)//位子窗口换一个父窗口,
我们的目的是使子窗口的父窗口是主界面,因为在情况三中,父窗口被换了,不再是主界面,这时如果最小化,则子窗口肯定不是在主界面上,而是在新建的的一个父窗口上,所以在主界面看不到最小化的子窗口。所以我们在创建子窗口后 不马上立即给它指定父窗口,而是通过API把主界面作为他们创建的父窗口,指定给子窗口,所以注释该代码
//Child->MdiParent = this;//指定子窗口的父窗口是frmMain ,可以达到在主界面既可以看见子窗口不会被遮住,又可以看见最小化不会消失掉。