将窗体从属于主窗体,第1张

将窗体从属于主窗体,第2张

几乎所有正式的C++ Builder程序在主窗体之外都有从属窗体,有时是对话框,有时是无模式窗口。VCL使创建和显示依赖表单变得很容易。但是并不是所有的程序都适合无模式表单,有些程序需要在一个主表单中显示不同的内容。本文讨论了如何在主窗体中“驻留”一个从属窗体。从属窗体看起来像主窗体的一部分,用户甚至不知道正在显示一个从属窗体。图A显示了一个主窗体,它的客户区是一个从窗体。

理解子/父连接
之类的程序的基本思路是让所有的下级窗体都成为主窗体的子窗体。这种设计在其他框架(如OWL或MFC)中很常见,但在VCL程序中并不常见。VCL不允许简单地通过指定属性使一个表单从属于另一个表单,这样做需要一点劳动。你必须告诉微软视窗,从属窗体是主窗体的子对象。在C++ Builder编程中,一般认为窗体是窗口,组件是子对象。事实上,从窗口的角度来看,窗体和组件都是窗口。您可以将任何窗口
(窗体和组件)指定为另一个窗口的子对象,只要您暂时跳出VCL圈。

更好的“鼠标剪辑”
将窗体附加到主窗体的一个好处是,你可以像设计任何其他下属窗体一样设计子窗体,也就是说,你创建一个新窗体,向它添加组件,并编写这个窗体的代码。这使得设计子窗体变得很容易,并将所有操作子窗体的代码集中在一个地方。

程序设计的例子
首先给出一些程序的背景。这个项目叫做养育。有一个主窗体,主窗体的顶部和底部有一个工具栏和一个状态栏。除了主窗体之外,还有两个子窗体,一个叫做TTableForm,显示动物。带网格的DBF数据表。动物表是C++ Builder带来的数据库样本表。TChartForm是另一个子窗体,用Tchart显示动物表。(如果你购买的C++ Builder是标准版,没有数据库组件。)您可以通过单击菜单项或工具按钮来选择是显示表单还是图形表单。当您做出选择时,活动表单被销毁,选定的表单被显示。子窗体显示在主窗体工具栏下方和状态栏上方的工作区中,并且随着主窗体大小的变化随时保持充满工作区。

重载CreateParams()
如前所述,为了让主窗体控制从窗体,需要将主窗体设置为从窗体的“父窗体”,这可以通过重载CreateParams()方法来实现。当VCL创建一个与窗体关联的窗口时,CreateParams()被调用。CreateParams()的声明如下:
void _ _ fastcallcreateParams(tcreateParams & Params);
create params()的参数是对TCCreateParams结构的引用。VCL的TCreateParams定义如下:


struct tcreate params
{
char * Caption;
int Style;
int ex style;
int X;
int Y;
int Width;
int Height;
HWND wnd parent;
void * Param;
tagWNDCLASSA window class;
char win class name[64];
};


此结构包含Windows创建窗口所需的所有信息(如果您使用API对Windows进行编程,则必须了解TCreateParams成员到Windows CREATESTRUCT结构的映射)。重载CreateParams()时,首先调用基类的CreateParams()方法,然后修改TCCreateParams结构的各个成员变量。重载的CreateParams()方法如下所示:


void _ _ fast call TChartForm::create Params(TCreateParams & Params)
{
t form::create Params(Params);
Params。style = WS _ CHILD | WS _ clip siblings;
Params。wnd parent = main form-> Handle;
Params。x = 0;
Params。y = 0;
Params。Width=MainForm->ClientRect。对;
Params。Height=MainForm->ClientRect。底部;
}


程序的关键是设置TCreateParams结构的Style和WndParent成员。Style设置WS_CHILD和WS_CLIPSIBLINGS的窗口样式,WS_CHILD将该窗口指定为另一个窗口的子窗口。根据定义,子窗口没有标题栏,当Windows在运行时创建窗体时,设计时的标题栏将被移除。WS_CLIPSIBLINGS确保在绘制窗体时,主窗口的不同子窗口不会相互干扰。显然,子窗口必须有一个父对象。通过将父窗口句柄分配给TCreateParams结构的WndParent成员来指定父对象。如前面的代码所示,WndParent成员被设置为主窗体的handle属性。鉴于指定父对象属性相对简单,我就不再深入探讨这个主题了。

设置子窗体的属性
除了CreateParams()方法中的代码之外,还需要设置子窗体的一些属性。大多数属性可以保持默认值,但是AutoScroll属性应该设置为false。当然前提是你的表单要设计成没有滚动的表单风格。因为子窗口的大小和位置是在CreateParams()中设置的,所以Position属性可以设置为poDefault。标题和边框属性将被忽略,因此不需要指定它们。确保BorderStyle设置为bs sibilized,BorderWidth设置为0。如果将这两个属性设置为其他值,子窗体和主窗体就会不协调。

表单的其他组件
在很多情况下,除了从属表单,主表单还包含其他组件,如工具栏和状态栏。此时,在设置TCreateParams结构的x、y、Width和Height成员时,应考虑工具栏和状态栏,子窗体应与顶部的工具栏和底部的状态栏相协调。所以设置TCreateParams结构成员的代码应该是:


Params。x = 0;
Params。y =主窗体->工具栏->高度+1;
Params。Width=MainForm->ClientRect。对;
Params。height =(MainForm-> status bar-> Top-1)-Params。y;

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 将窗体从属于主窗体

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情