精华内容
下载资源
问答
  • 文章目录简介Windows窗体的基本属性一、布局属性1、StartPosition属性2、Location属性3、尺寸属性4、WindowsState属性5、Autoscroll属性6、AutoSize属性二、样式属性1、ControlBox属性2、MaximizeBox属性3、...

  • 博主写作不容易,孩子需要您鼓励
  • 万水千山总是情 , 先点个赞行不行
  • 简介

    在windows窗体应用程序中,窗体是与用户交互的基本方式,是向用户展示信息的图形界面,窗体是Windows窗体应用程序的基本单元,一个窗体应用程序可以包含一个窗体或多个窗体。
    窗体是存放各种控件的容器,一个Windows窗体包含了各种控件,如标签、文本框、按钮、下拉框等,这些控件是相对独立的用户界面元素,用来显示数据或接受数据输入,或者响应用户操作。
    窗体也是对象,窗体类定义了生成窗体的模板,每实例化一个窗体类,就产生一个窗体。
    using System.Windows.Forms命名空间中定义的Form类是所有窗体的基类,Form类被认为是对windows窗体的抽象。
    所谓窗体,就是Windows的窗口,一个应用程序除了需要实现应有的功能外,还必须具有良好的用户界面。在C#中Windows应用程序的界面是以窗体为基础的,窗体是Windows应用程序的基本单位,用来向用户展示和接受用户的输入。

    Windows窗体的基本属性

    Windows窗体的属性决定了窗体的布局、样式、外观、行为等可视化特征。通过代码可以对这些属性进行设置和修改,但是更方便的做法是在属性编辑器窗口进行设置和修改。
    在这里插入图片描述

    一、布局属性

    1、StartPosition属性

    用来获取或设置程序运行时窗体的初始显示位置,该属性有5个可选属性值,默认值为WindowsDefaultLocation
    如下表所示:

    属性值 说明
    Manual 窗体的初始显示位置由Location属性决定
    CenterScreen 窗体定位在当前显示屏幕窗口中居中,其尺寸在窗体大小Size中指定
    WindowsDefaultLocation 窗体定位在windows默认位置,其尺寸在窗体大小Size中指定
    WindowsDefaultBounds 窗体定位在windows默认位置,其边界也由windows默认指定
    CenterParent 窗体在其父窗体中居中位置

    2、Location属性

    获取或者设置显示时其左上角在桌面上的坐标,默认值为(0,0)。

    3、尺寸属性

    Size、MaximizeSize、MinimizeSize,分别表示窗体正常显示、最大化、最小化时的尺寸,他们分别包含窗体宽度Width和高度Height两个子项。

    4、WindowsState属性

    用来获取或设置窗体显示时的初始状态。默认为Normal
    可选属性值如下表:

    属性值 说明
    Normal 表示窗体正常显示
    Minimized 窗体以最小化显示形态
    Maximized 窗体以最大化显示形态

    5、Autoscroll属性

    用来获取或设置一个值,该值指示当任何控件位于窗体工作区以外时,是否会在该窗体上自动显示滚动条,默认为False。

    6、AutoSize属性

    当无法全部显示窗体中的控件时是否自动调整窗体大小,默认值为False。

    二、样式属性

    窗体中有多个与标题栏有关的样式属性,他们大多为布尔类型。

    1、ControlBox属性

    用来获取或设置一个值,该值指示在该窗体的标题栏中、窗口左角处是否显示控制菜单,值为True时将显示该控制菜单,为False时不显示,默认值为True

    2、MaximizeBox属性

    用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最大化按钮,值为True时将显示该按钮,为False时不显示,默认值为True

    3、MinimizeBox属性

    用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最小化按钮,值为True时将显示该按钮,为False时不显示,默认值为True

    4、HelpButton属性

    用来获取或设置一个值,该值指示是否在窗体的标题栏中显示帮助按钮,值为True时将显示该按钮,为False时不显示,默认值为True

    5、ShowIcon属性

    用来获取或设置一个值,该值指示是否在窗体的标题栏中是否显示图标,值为True时将显示图标,为False时不显示,默认值为True

    6、Icon属性

    获取或设置窗体标题栏中的图标。

    7、ShowInTaskbar属性

    用来获取或设置一个值,该值指示是否在Windows任务栏中显示窗体,默认值为True

    8、TopMost属性

    用来获取或设置一个值,该值指示该窗体是否为最顶层窗体。最顶层窗体始终显示在桌面的最上层,即使该窗体不是当前活动窗体,默认值为False

    9、IsMdiContainer属性

    用来获取或设置一个值,该值指示窗体是否为多文档界面中的子窗体的容器。值为True时,窗体是子窗体的容器,为False时,不是子窗体的容器,默认值为False

    10、Opacity属性

    获取或设置窗体的不透明度,默认为100%,实际应用中,可以通过该属性给窗体增加一些类似半透明等的特殊效果。

    11、MainMenuStrip属性

    设置窗体的主菜单,在窗体中添加MenuStrip控件时,Visual Studio .NET会自动完成该属性设置。

    三、外观属性

    1、Text属性

    该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示文字。

    2、BackColor

    用来获取或设置窗体的背景色。

    3、BackgroundImage

    用来获取或设置窗体的背景图片。

    4、BackgroundImageLayout

    设置背景图的显示布局,可选属性值为平铺Tile、居中Center、拉伸Stretch和放大Zoom,默认为Tile

    5、ForeColor

    用来获取或设置控件的前景色。

    6、Font

    获取或设置窗体中显示的文字的字体

    7、Cursor

    获取或设置当鼠标指针位于窗体上时显示的光标。

    8、FormBorderStyle

    获取或设置窗体的边框样式,该属性有7个可选值,默认值为Sizable。开发人员可以通过设置该属性值为none,实现隐藏窗体标题栏的功能。

    属性值 说明
    None 窗体无边框
    FixedSingle 固定的单行边框
    Fixed3D 固定的三维边框
    FixedDialog 固定的对话框式的粗边框
    Sizable 可调整大小的边框
    FixedToolWindow 固定大小的工具窗口边框
    SizableToolWindow 可调整大小的工具窗口边框

    4、行为属性

    1、Enabled

    用来获取或设置一个值,该值指示窗口是否可用,即是否可以对用户交互做出响应。默认值为True

    2、ContextMenuStrip

    设置窗体的右键快捷菜单,需要先添加ContextMenuStrip控件,才能设置该属性。

    3、AllowDrop

    用来获取或设置一个值,该值指示窗口是否可以接受用户拖放到它上面的数据。默认值为False

    4、ImeMode

    获取或设置控件的输入法编辑器IME模式。

    5、其他属性

    AcceptButton

    该属性用来获取或设置一个值,该值是一个按钮的名称,当按【Enter】键时就相当于单击了窗体上的该按钮。

    CancelButton

    该属性用来获取或设置一个值,该值是一个按钮的名称,当按【Esc】键时就相当于单击了窗体上的该按钮。

    KeyPreview

    该属性用来获取或设置一个值,该值指示在将按键事件传递到具有焦点的控件前,窗体是否接受该事件。值为True时,窗口将接受按键事件,值为False时,窗体不接受按键事件。

    窗体的重要方法和事件

    一、常用方法

    1、Show

    该方法的作用是让窗体显示出来

  • 语法格式如下:
  • 窗体名.Show();
    

    其中窗体名是要显示的窗体名称。
    例如使用show方法显示Form1窗体,代码如下。

    From1 frm = new Form1();
    frm.Show();
    

    2、ShowDialog

    该方法的作用是将窗口显示为模态对话框
    模态窗口就是在该窗口关闭之前,其父窗口不可能成为活动窗口的那种窗口。举个例子:
    窗口A弹出窗口B,如果窗口B是模态的,在窗口B关闭前就不可能切换到窗口A;如果B是非模态的,那可以在这两个窗口之间任意切换。
    它一般用来显示提示信息和接受用户的输入。对话框不能独立存在。目前有两种对话框,分别为:模态对话框 和 非模态对话框。
    模态对话框在显示之后,就不能对同一个程序中的其它窗口进行操作。
    非模态对话框在显示之后,还可以对同一个程序的其它窗口进行操作。

  • 语法格式如下:
  • 窗体名.ShowDialog();
    

    其中窗体名是要显示的窗体名称。

    3、Hide

    该方法的作用是把窗体隐藏起来,但不销毁窗体,也不释放资源,可以使用Show方法重新显示。

  • 语法格式如下:
  • 窗体名.Hide();
    

    其中窗体名是要隐藏的窗体名称。

    4、Close

    该方法的作用是把窗体关闭。

  • 语法格式如下:
  • 窗体名.Close();
    

    其中窗体名是要关闭的窗体名称。

    5、Refresh

    该方法的作用是刷新并重画窗体。

  • 语法格式如下:
  • 窗体名.Refresh();
    

    其中窗体名是要刷新的窗体名称。

    6、Activate

    该方法的作用是激活窗体并给予它焦点。

  • 语法格式如下:
  • 窗体名.Activate();
    

    其中窗体名是要激活的窗体名称。

    二、常用事件

    与窗体有关的事件有很多,Visual Studio的“属性”编辑窗口中“事件”选项页列出了所有这些事件。
    窗体有关的事件被引发后,程序将转入执行与该事件对应的事件响应函数。开发人员可以通过双击“属性”编辑窗口中某事件后的空白框,让Visual Studio自动生成该事件对应的的事件响应函数,生成的函数初始内容是空白的,可以通过添加相应的功能代码,实现相应的功能。

    窗体行为和操作相关

    其中,与窗体行为和操作有关的常用事件有以下几种:

    1、Load

    窗体在首次启动、加载到内存时将引发该事件,即在第一次显示窗体前发生。

    2、FromClosing

    窗体在关闭过程中将引发该事件。

    3、FromClosed

    窗体在关闭后将引发该事件。

    4、Click

    用户单击该窗体时将引发该事件。

    5、DoubleClick

    用户双击该窗体时将引发该事件。

    6、MouseClick

    单击该窗体时将引发该事件。

    7、MouseDoubleClick

    双击该窗体时将引发该事件。

    窗体布局、外观和焦点相关

    1、Resize

    窗体大小改变时将引发该事件。

    2、Paint

    重绘窗体时将引发该事件。

    3、Activated

    窗体得到焦点后,即窗口激活时将引发该事件。

    4、Deactivated

    窗体失去焦点后,成为不活动窗体时将引发该事件。

    窗体属性修改相关

    1、TextChanged

    窗体的标题文本被更改时将引发该事件。

    2、LocationChanged

    窗体的位置被更改时将引发该事件。

    3、SizeChanged

    窗体的大小被更改时将引发该事件。

    4、BackClolorChanged

    窗体的背景颜色被更改时将引发该事件。

    5、FontChanged

    窗体的字体被更改时将引发该事件。

    常用的输入输出方法

    在Windows应用程序中,用户经常需要输入信息和输出信息。
    常用的可接受信息的控件有Lable控件、TextBox控件等。
    MessageBox是一个消息框对象。要创建消息框,需要调用MessageBox的Show方法实现,而Show方法有很多重载方式,常用的有以下四种方式。

    1、最简单的消息框

  • 语法格式如下:
  • MessageBox.Show("消息内容");
    

    2、带标题的消息框

  • 语法格式如下:
  • MessageBox.Show("消息内容","消息框标题");
    

    3、带标题、按钮的消息框

  • 语法格式如下:
  • MessageBox.Show("消息内容","消息框标题",消息框按钮);
    

    例如

    MessageBox.Show("确定当前参数:" + dIn_FirsPhotoYPos.Value.ToString(), "提示", MessageBoxButtons.OKCancel)
    

    4、带标题、按钮、图标的消息框

  • 语法格式如下:
  • MessageBox.Show("消息内容","消息框标题",消息框按钮,消息框图标);
    
    ------------------------------------------------------------------------------------------
                                                  分割线
    ------------------------------------------------------------------------------------------
    
  • 博主简介:
  • 工业自动化上位机软件工程师、机器视觉算法工程师、运动控制算法工程师。目前从业于智能制造自动化行业。 博主邮箱:2296776525@qq.com
  • 帮忙点个赞吧。哈哈。
  • 展开全文
  • 窗体属于窗体

    千次阅读 2006-12-21 19:03:00
    窗体属于窗体 几乎所有正式一点的C++ Builder程序除了主窗体外都还有从属窗体,有时是对话框, 有时是无模式窗口。VCL使得创建和显示从属窗体都易如反掌。但不是所有程序都适于采用 无模式窗体,有些程序...
           将窗体从属于主窗体 
      几乎所有正式一点的C++ Builder程序除了主窗体外都还有从属窗体,有时是对话框, 
    有时是无模式窗口。VCL使得创建和显示从属窗体都易如反掌。但不是所有程序都适于采用 
    无模式窗体,有些程序需要在一个主窗体内显示不同的内容。本文讨论如何将一个从属窗体 
    “寄居”于主窗体中,从属窗体看上去是主窗体的一部分,用户甚至不知道一个从窗体正被 
    显示。图A显示了一个主窗体,其客户区是一个从窗体。 
     
     
     
    图A 客户区包含从属窗体的主窗体 
     
    理解子/父联系 
      这类程序的基本思路是让所有从属窗体都作主窗体的子窗体,这种设计在其他框架(如 
    OWL或MFC)中很常见,但在VCL程序中却不常见。VCL不允许简单地指定一下属性就使一个窗 
    体从属于另一窗体,要做到这一点还得付出点小小的劳动。你得告诉Microsoft Windows从 
    属窗体是主窗体的子对象,在C++ Builder编程中一般趋于认为窗体是窗口,元件是子对象 
    ,实际上从Windows的观点来看,窗体和元件都是窗口。可以将任一窗口 
    (窗体和元件)指定为另一窗口的子对象,只要你暂时跳出VCL圈子。 
     
    更好的“鼠夹” 
      将一个窗体附属于一个主窗体的一个好处是你可以象设计任何其他从属窗体一样设计子 
    窗体,就是说你创建一个新的窗体,在其上添加元件并书写这个窗体的代码。这样使得设计 
    你的子窗体变得容易,并将所有操纵子窗体的代码集中在一个地方。 
     
    程序设计范例 
      先给出一些程序的背景,程序名叫PARENTING,有一个主窗体,主窗体的顶部和底部各 
    有一个工具条(Tool Bar)和状态条(Status bar),除主窗体外,还有两个子窗体,一个叫 
    TTableForm,用栅格显示ANIMAL.DBF数据表,ANIMAL表是C++ Builder带的数据库样本的一个 
    表。另一个子窗体TChartForm用TChart显示ANIMAL表。(如果你购买的C++ Builder是标准 
    版则没有数据库元件)你可以通过点击菜单项或工具按钮来选择显示表单还是图形窗体,在 
    你作出选择时,活动窗体被摧毁而被选窗体被显示,子窗体在主窗体的工具条下方、状态条 
    上方的客户区显示,而且随主窗体大小变动而随时保持充满客户区。 
     
    重载CreateParams() 
      如前所述,为让主窗体控制从属窗体,需要将主窗体设为从窗体的“父”,这可以通过 
    重载CreateParams()方法来完成。CreateParams()在VCL创建与窗体联系的窗口时调用, 
    CreateParams()的声明如下: 
    void __fastcall CreateParams(TCreateParams& Params); 
    CreateParams()的唯一参数是对一个TCreateParams结构体的引用。在VCL中TCreateParams 
    定义如下: 
     
     
    struct TCreateParams 

    char *Caption; 
    int Style; 
    int ExStyle; 
    int X; 
    int Y; 
    int Width; 
    int Height; 
    HWND WndParent; 
    void *Param; 
    tagWNDCLASSA WindowClass; 
    char WinClassName[64]; 
    }; 
     
     
      此结构包含了Windows创建一个窗口所需的所有信息(如果你曾用API进行Windows编程 
    ,你一定能意识到TCreateParams的成员对Windows CREATESTRUCT结构的映射)。在重载 
    CreateParams()时,首先调用基类的CreateParams()方法,然后修改TCreateParams结构的 
    个别成员变量。一个重载过的CreateParams()方法看起来大致如下: 
     
     
    void __fastcall TChartForm::CreateParams(TCreateParams& Params) 

    TForm::CreateParams(Params); 
    Params.Style=WS_CHILD|WS_CLIPSIBLINGS; 
    Params.WndParent=MainForm->Handle; 
    Params.X=0; 
    Params.Y=0; 
    Params.Width=MainForm->ClientRect.Right; 
    Params.Height=MainForm->ClientRect.Bottom; 

     
     
      程序的关键是设置TCreateParams结构体的Style和WndParent成员,Style设WS_CHILD  
    和WS_CLIPSIBLINGS窗口式样,WS_CHILD指定窗口为另一窗口的子窗口。根据定义,一个子 
    窗口是没有标题棒的,设计时的标题棒在Windows在运行时创建窗体会被去掉。 
    WS_CLIPSIBLINGS保证主窗口的不同子窗口在窗体绘制时不互相干涉。很明显,一个子窗口 
    必须得有一个父对象,通过将父窗口句柄指定给TCreateParams结构体WndParent 成员就指 
    定了父对象,正如前面代码所示,WndParent成员设置为主窗体的Handle属性。鉴于指定父 
    对象属性相对直接明了,我不在这个主题上深入更多。 
     
    设置子窗体的属性 
      除了CreateParams()方法中的代码外,还得设置一些子窗体的属性,多数属性可以保留 
    缺省值,但AutoScroll属性应设为false,当然,前提是你的窗体要设计为不必卷动的窗体 
    风格。因为子窗口的大小和位置在CreateParams()中设定,所以Position属性可置为 
    poDefault。Caption和BorderIcon属性将被忽略,故而无需指定。确保BorderStyle置为 
    bsSizeable,还有BorderWidth置为0,如果此二属性设成其它值,子窗体与主窗体会不协调 
    。 
     
    窗体的其它元件 
      很多时候,除了从属窗体外,主窗体还包含别的元件,比如工具条和状态条,此时设置 
    TCreateParams结构体的X、Y、Width和Height成员时得考虑到工具条和状态条,子窗体应与 
    顶部的工具条和底部队状态条协调。因此设置TCreateParams结构体的成员的代码应该是: 
     
     
     
    Params.X=0; 
    Params.Y=MainForm->ToolBar->Height+1; 
    Params.Width=MainForm->ClientRect.Right; 
    Params.Height=(MainForm->StatusBar->Top-1)-Params.Y; 
     
     
      注意Y设为工具条底部加1,子窗体宽度置为主窗体客户区宽度,高度根据子窗体和状态 
    条的顶部计算,基本上为界于工具条底部和状态条底部之间的主窗体客户区。这些就是使从 
    属窗体“寄居”于主窗体的所有要求,你可能还有其它想在子窗体中实现的特征,我将把这 
    些特征的讨论留到后面。 
     
    设置主窗体 
      主窗体也得进行设置以控制其“收留”的子窗体。首先需要将子窗体从自动创建窗体列 
    表中去掉,需要时再创建它们。如果不从列表中去掉,则当你的应用程序启动时它们会自动 
    显示。你还需要一个变量来跟踪当前的活动子窗体,在主窗体的Public区声明如下变量, 
    TForm * ActiveChild; ActiveChild是公有的,因为子窗体要访问这个变量。我马上会演示 
    如何使用这一变量。现在来书写显示子窗体的代码,先看下面程序行,然后我来解释。 
     
     
    void __fastcall TMainForm::Chart1Click(TObject *Sender) 

    if(ActiveChild) 
    delete ActiveChild; 
     
    TChartForm * form=new TChartForm(this); 
    ActiveChild=form; 
    form->Show(); 
    Chart1->Checked=true; 
    Table1->Checked=false; 

     
     
      此方法是主窗体的菜单项的OnClick处理句柄,猜的没错,这是在显示TChartForm子窗 
    体。首先检查ActiveChild变量是否非0,如果有激活动子窗体ActiveChild将非0。如果 
    ActiveChild不为0,删除此变量关联的指针以摧毁活动子窗体,否则程序会将子窗体一个接 
    一个地堆叠在一起。接着创建一个TChartForm类的实例,将new操作返回到指针赋予 
    ActiveChild变量,这样ActiveChild总是包含一个指向当前子窗体的指针。最后调用Sow() 
    方法显示子窗体。最后两行代码确保代表表单或图形显示的菜单项显示一个选中标记。为完 
    成ActiveChild变量的讨论,我得带你回到子窗体单元一会儿。每个子窗体都含有一个如下 
    的OnClose事件的事件句柄: 
     
     
    void __fastcall TChartForm::FormClose(TObject *Sender, 
    TCloseAction &Action) 

    MainForm->ActiveChild=0; 
    MainForm->Chart1->Checked=false; 
    Action=caFree; 

     
     
      注意当窗体被摧毁时,主窗体的ActiveChild被置为0,并将与子窗体关联的菜单项置为 
    未选中。Action参数置为caFree,以通知VCL释放与此窗体关联的内存。你或许会疑惑为何 
    FormClose句柄包含上面最后两行。答案是每个子窗体都有一个Close按钮用来关闭窗体,如 
    果用Close按钮来关闭窗体,就需要释放内存和uncheck菜单项。 
     
    额外特征 
      例子程序至少还有一个尚未讨论的特征,就是如果子窗体比主窗体大,要重新调整主窗 
    体大小以容纳子窗体。这些语句放在子窗体的CreateParams()方法中。之前我展示过一个简 
    单的CreateParams()例子,但没有放进调整主窗体大小的语句。列表B中有完整的 
    CreateParams()方法,和先前展示唯一不同的是包含以下语句: 
     
     
    if(Width>MainForm->ClientWidth) 
    MainForm->ClientWidth=Width; 
    if(Height>(MainForm->StatusBar->Top-MainForm->ToolBar->Height)) 
    MainForm->ClientHeight=Height+ 
    MainForm->ToolBar->Height+ 
    MainForm->StatusBar->Height ; 
     
     
      这几条语句检查子窗体的宽度是否大于主窗体的ClientWidth属性,如果是,主窗体的 
    ClientWidth置为子窗体的宽度。余下的几行作的是同样的事情,只不过针对的是主窗体的 
    客户区高度而已。这些语句的结果是主窗体总是被调整到能完全容纳被显示的子窗体。范例 
    程序还考虑了主窗体调整大小时的情况。如果主窗口大小有变化,子窗体大小也必须变化以 
    进行充满主窗体的客户区。以下语句演示了主窗体的OnResize事件句柄: 
     
     
    void __fastcall TMainForm::FormResize(TObject *Sender) 

    if(ActiveChild) 
     
     

    ActiveChild->Width=ClientRect.Right; 
    ActiveChild->Height=(MainForm->StatusBar->Top-1)- 
    ActiveChild->Top; 

     
     

     
     
      这些语句相当直接,无需我逐条解释。注意首先检查ActiveChild变量确保非0(即指向 
    某子窗体),很明显如果当前没有激活任何子窗体,在OnResize中就什么都不用干。其余语 
    句是CreateParams()中看到语句的变种,只是简单地计算子窗体的新尺寸并设置相应的 
    Width和Height属性。 
     
    结语 
      列表A包含了例子程序主窗体的代码。列表B示出了TChartForm单元的源码。头文件都没 
    有给出因为没有什么有意义的语句,也未给出TTableForm单元的语句,因为与ChatForm单元 
    类似。你可以在www.reisdorph.com下载例子程序。将子窗体“寄居”于主窗体提供了一种 
    清晰的替代MDI的方法,对那些只能以无模式窗体形式向用户显示数据的程序也是一种替代 
    ,使用子窗体允许你使用窗体设计器设计你的从窗口,并将操纵子窗体的代码放在一个地方 
    。 
     
     
    列表A:MAINU.CPP 
    #include <vcl.h> 
    #pragma hdrstop 
     
    #include "MainU.h" 
    #include "ChartU.h" 
    #include "TableU.h" 
     
    #pragma resource "*.dfm" 
    TMainForm *MainForm; 
     
    __fastcall TMainForm::TMainForm(TComponent* Owner) 
     TForm(Owner) 

    //清0以防包含随机数 
    ActiveChild=0; 
    //打开数据表 
    Table->Active=true; 

     
    void __fastcall TMainForm::Table1Click(TObject *Sender) 

    if(Table1->Checked) return; 
    if(ActiveChild){ 
    delete ActiveChild; 
    ActiveChild=0; 

     
    TTableForm *form=new TTableForm(this); 
    //将DBGrid的DBGrid::DataSource属性赋给数据源 
    form->DBGrid->DataSource=DataSource; 
    //跟踪活动子窗体 
    Active=form; 
    form->Show(); 
    Table1->Checked=true; 
    Chart1->Checked=false; 

     
    void __fastcall TMainForm::Chart1Click(TObject *Sender) 

    if(Chart1->Checked) return; 
    if(ActiveChild){ 
    delete ActiveChild; 
    ActiveChild=0; 

     
    TChartForm *form=new TChartForm(this); 
    Active=form; 
    form->Show(); 
    Chart1->Checked=true; 
    Table1->Checked=false; 

     
    void __fastcall TMainForm::FormResize(TObject *Sender) 

    if(ActiveChild){ 
    ActiveChild->Width=ClientRect.Right; 
    ActiveChild->Height=(MainForm->StatusBar->Top-1)- 
    ActiveChild->Top; 


     
    列表B:CHARTU.CPP 
    #include <vcl.h> 
    #pragma hdrstop 
     
    #include "ChartU.h" 
    #include "MainU.h" 
     
    #pragma resource "*.dfm" 
    TChartForm *ChartForm; 
     
    __fastcall TChartForm::TChartForm(TComponent* Owner) 
     TForm(Owner) 


     
    void __fastcall TChartForm::CreateParams(TCreateParams& Params) 

    //调用基类CreateParams方法 
    TForm::CreateParams(Params); 
    //子窗口类型 
    Params.Style=WS_CHILD|WS_CLIPSIBLINGS; 
    //设置父为主窗体 
    Params.WndParent=MainForm->Handle; 
     
    Params.X=0; 
    if(Width>MainForm->ClientWidth) 
    MainForm->ClientWidth=Width; 
    if(Height>(MainForm->StatusBar->Top-MainForm->ToolBar->Height)) 
    MainForm->ClientHeight=Height+ 
    MainForm->ToolBar->Height+ 
    MainForm->StatusBar->Height; 
    Params.Y=MainForm->ToolBar->Height+1; 
    Params.Width=MainForm->ClientRect.Right; 
    Params.Height=(MainForm->StatusBar->Top-1)-Params.Y; 

     
    void __fastcall TChartForm::FormClose(TObject *Sender, 
    TCloseAction &Action) 

    MainForm->ActiveChild=0; 
    MainForm->Chart1->Checked=false; 
    Action=caFree; 

     
    void __fastcall TChartForm::CloseBtnClick(TObject *Sender) 

    Close(); 

     
    展开全文
  • 几乎所有正式一点的C++ ...本文讨论如何将一个从属窗体“寄居”于主窗体中,从属窗体看上去是主窗体的一部分,用户甚至知道一个从窗体正被显示。图A显示了一个主窗体,其客户区是一个从窗体。 图A 客户区包含从
     几乎所有正式一点的C++ Builder程序除了主窗体外都还有从属窗体,有时是对话框,有时是无模式窗口。VCL使得创建和显示从属窗体都易如反掌。但不是所有程序都适于采用无模式窗体,有些程序需要在一个主窗体内显示不同的内容。本文讨论如何将一个从属窗体“寄居”于主窗体中,从属窗体看上去是主窗体的一部分,用户甚至不知道一个从窗体正被显示。图A显示了一个主窗体,其客户区是一个从窗体。 

    图A 客户区包含从属窗体的主窗体

    理解子/父联系
      这类程序的基本思路是让所有从属窗体都作主窗体的子窗体,这种设计在其他框架(如OWL或MFC)中很常见,但在VCL程序中却不常见。VCL不允许简单地指定一下属性就使一个窗体从属于另一窗体,要做到这一点还得付出点小小的劳动。你得告诉Microsoft Windows从属窗体是主窗体的子对象,在C++ Builder编程中一般趋于认为窗体是窗口,元件是子对象,实际上从Windows的观点来看,窗体和元件都是窗口。可以将任一窗口
    (窗体和元件)指定为另一窗口的子对象,只要你暂时跳出VCL圈子。

    更好的“鼠夹”
      将一个窗体附属于一个主窗体的一个好处是你可以象设计任何其他从属窗体一样设计子窗体,就是说你创建一个新的窗体,在其上添加元件并书写这个窗体的代码。这样使得设计你的子窗体变得容易,并将所有操纵子窗体的代码集中在一个地方。

    程序设计范例
      先给出一些程序的背景,程序名叫PARENTING,有一个主窗体,主窗体的顶部和底部各有一个工具条(Tool Bar)和状态条(Status bar),除主窗体外,还有两个子窗体,一个叫TTableForm,用栅格显示ANIMAL.DBF数据表,ANIMAL表是C++ Builder带的数据库样本的一个表。另一个子窗体TChartForm用TChart显示ANIMAL表。(如果你购买的C++ Builder是标准版则没有数据库元件)你可以通过点击菜单项或工具按钮来选择显示表单还是图形窗体,在你作出选择时,活动窗体被摧毁而被选窗体被显示,子窗体在主窗体的工具条下方、状态条上方的客户区显示,而且随主窗体大小变动而随时保持充满客户区。

    重载CreateParams()
      如前所述,为让主窗体控制从属窗体,需要将主窗体设为从窗体的“父”,这可以通过重载CreateParams()方法来完成。CreateParams()在VCL创建与窗体联系的窗口时调用,CreateParams()的声明如下:
    void __fastcall CreateParams(TCreateParams& Params);
    CreateParams()的唯一参数是对一个TCreateParams结构体的引用。在VCL中TCreateParams定义如下:


    struct TCreateParams
    {
    char *Caption;
    int Style;
    int ExStyle;
    int X;
    int Y;
    int Width;
    int Height;
    HWND WndParent;
    void *Param;
    tagWNDCLASSA WindowClass;
    char WinClassName[64];
    };


      此结构包含了Windows创建一个窗口所需的所有信息(如果你曾用API进行Windows编程,你一定能意识到TCreateParams的成员对Windows CREATESTRUCT结构的映射)。在重载CreateParams()时,首先调用基类的CreateParams()方法,然后修改TCreateParams结构的个别成员变量。一个重载过的CreateParams()方法看起来大致如下:


    void __fastcall TChartForm::CreateParams(TCreateParams& Params)
    {
    TForm::CreateParams(Params);
    Params.Style=WS_CHILD|WS_CLIPSIBLINGS;
    Params.WndParent=MainForm->Handle;
    Params.X=0;
    Params.Y=0;
    Params.Width=MainForm->ClientRect.Right;
    Params.Height=MainForm->ClientRect.Bottom;
    }


      程序的关键是设置TCreateParams结构体的Style和WndParent成员,Style设WS_CHILD 和WS_CLIPSIBLINGS窗口式样,WS_CHILD指定窗口为另一窗口的子窗口。根据定义,一个子窗口是没有标题棒的,设计时的标题棒在Windows在运行时创建窗体会被去掉。WS_CLIPSIBLINGS保证主窗口的不同子窗口在窗体绘制时不互相干涉。很明显,一个子窗口必须得有一个父对象,通过将父窗口句柄指定给TCreateParams结构体WndParent 成员就指定了父对象,正如前面代码所示,WndParent成员设置为主窗体的Handle属性。鉴于指定父对象属性相对直接明了,我不在这个主题上深入更多。

    设置子窗体的属性
      除了CreateParams()方法中的代码外,还得设置一些子窗体的属性,多数属性可以保留缺省值,但AutoScroll属性应设为false,当然,前提是你的窗体要设计为不必卷动的窗体风格。因为子窗口的大小和位置在CreateParams()中设定,所以Position属性可置为poDefault。Caption和BorderIcon属性将被忽略,故而无需指定。确保BorderStyle置为bsSizeable,还有BorderWidth置为0,如果此二属性设成其它值,子窗体与主窗体会不协调。

    窗体的其它元件
      很多时候,除了从属窗体外,主窗体还包含别的元件,比如工具条和状态条,此时设置TCreateParams结构体的X、Y、Width和Height成员时得考虑到工具条和状态条,子窗体应与顶部的工具条和底部队状态条协调。因此设置TCreateParams结构体的成员的代码应该是:


    Params.X=0;
    Params.Y=MainForm->ToolBar->Height+1;
    Params.Width=MainForm->ClientRect.Right;
    Params.Height=(MainForm->StatusBar->Top-1)-Params.Y;


      注意Y设为工具条底部加1,子窗体宽度置为主窗体客户区宽度,高度根据子窗体和状态条的顶部计算,基本上为界于工具条底部和状态条底部之间的主窗体客户区。这些就是使从属窗体“寄居”于主窗体的所有要求,你可能还有其它想在子窗体中实现的特征,我将把这些特征的讨论留到后面。

    设置主窗体
      主窗体也得进行设置以控制其“收留”的子窗体。首先需要将子窗体从自动创建窗体列表中去掉,需要时再创建它们。如果不从列表中去掉,则当你的应用程序启动时它们会自动显示。你还需要一个变量来跟踪当前的活动子窗体,在主窗体的Public区声明如下变量,TForm * ActiveChild; ActiveChild是公有的,因为子窗体要访问这个变量。我马上会演示如何使用这一变量。现在来书写显示子窗体的代码,先看下面程序行,然后我来解释。


    void __fastcall TMainForm::Chart1Click(TObject *Sender)
    {
    if(ActiveChild)
    delete ActiveChild;

    TChartForm * form=new TChartForm(this);
    ActiveChild=form;
    form->Show();
    Chart1->Checked=true;
    Table1->Checked=false;
    }


      此方法是主窗体的菜单项的OnClick处理句柄,猜的没错,这是在显示TChartForm子窗体。首先检查ActiveChild变量是否非0,如果有激活动子窗体ActiveChild将非0。如果ActiveChild不为0,删除此变量关联的指针以摧毁活动子窗体,否则程序会将子窗体一个接一个地堆叠在一起。接着创建一个TChartForm类的实例,将new操作返回到指针赋予ActiveChild变量,这样ActiveChild总是包含一个指向当前子窗体的指针。最后调用Sow()方法显示子窗体。最后两行代码确保代表表单或图形显示的菜单项显示一个选中标记。为完成ActiveChild变量的讨论,我得带你回到子窗体单元一会儿。每个子窗体都含有一个如下的OnClose事件的事件句柄:


    void __fastcall TChartForm::FormClose(TObject *Sender,
    TCloseAction &Action)
    {
    MainForm->ActiveChild=0;
    MainForm->Chart1->Checked=false;
    Action=caFree;
    }


      注意当窗体被摧毁时,主窗体的ActiveChild被置为0,并将与子窗体关联的菜单项置为未选中。Action参数置为caFree,以通知VCL释放与此窗体关联的内存。你或许会疑惑为何FormClose句柄包含上面最后两行。答案是每个子窗体都有一个Close按钮用来关闭窗体,如果用Close按钮来关闭窗体,就需要释放内存和uncheck菜单项。

    额外特征
      例子程序至少还有一个尚未讨论的特征,就是如果子窗体比主窗体大,要重新调整主窗体大小以容纳子窗体。这些语句放在子窗体的CreateParams()方法中。之前我展示过一个简单的CreateParams()例子,但没有放进调整主窗体大小的语句。列表B中有完整的CreateParams()方法,和先前展示唯一不同的是包含以下语句:


    if(Width>MainForm->ClientWidth)
    MainForm->ClientWidth=Width;
    if(Height>(MainForm->StatusBar->Top-MainForm->ToolBar->Height))
    MainForm->ClientHeight=Height+
    MainForm->ToolBar->Height+
    MainForm->StatusBar->Height ;


      这几条语句检查子窗体的宽度是否大于主窗体的ClientWidth属性,如果是,主窗体的ClientWidth置为子窗体的宽度。余下的几行作的是同样的事情,只不过针对的是主窗体的客户区高度而已。这些语句的结果是主窗体总是被调整到能完全容纳被显示的子窗体。范例程序还考虑了主窗体调整大小时的情况。如果主窗口大小有变化,子窗体大小也必须变化以进行充满主窗体的客户区。以下语句演示了主窗体的OnResize事件句柄:


    void __fastcall TMainForm::FormResize(TObject *Sender)
    {
    if(ActiveChild)


    {
    ActiveChild->Width=ClientRect.Right;
    ActiveChild->Height=(MainForm->StatusBar->Top-1)-
    ActiveChild->Top;
    }


    }


      这些语句相当直接,无需我逐条解释。注意首先检查ActiveChild变量确保非0(即指向某子窗体),很明显如果当前没有激活任何子窗体,在OnResize中就什么都不用干。其余语句是CreateParams()中看到语句的变种,只是简单地计算子窗体的新尺寸并设置相应的Width和Height属性。

    结语
      列表A包含了例子程序主窗体的代码。列表B示出了TChartForm单元的源码。头文件都没有给出因为没有什么有意义的语句,也未给出TTableForm单元的语句,因为与ChatForm单元类似。你可以在www.reisdorph.com下载例子程序。将子窗体“寄居”于主窗体提供了一种清晰的替代MDI的方法,对那些只能以无模式窗体形式向用户显示数据的程序也是一种替代,使用子窗体允许你使用窗体设计器设计你的从窗口,并将操纵子窗体的代码放在一个地方。


    列表A:MAINU.CPP
    #include <vcl.h>
    #pragma hdrstop

    #include /"MainU.h/"
    #include /"ChartU.h/"
    #include /"TableU.h/"

    #pragma resource /"*.dfm/"
    TMainForm *MainForm;

    __fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
    {
    //清0以防包含随机数
    ActiveChild=0;
    //打开数据表
    Table->Active=true;
    }

    void __fastcall TMainForm::Table1Click(TObject *Sender)
    {
    if(Table1->Checked) return;
    if(ActiveChild){
    delete ActiveChild;
    ActiveChild=0;
    }

    TTableForm *form=new TTableForm(this);
    //将DBGrid的DBGrid::DataSource属性赋给数据源
    form->DBGrid->DataSource=DataSource;
    //跟踪活动子窗体
    Active=form;
    form->Show();
    Table1->Checked=true;
    Chart1->Checked=false;
    }

    void __fastcall TMainForm::Chart1Click(TObject *Sender)
    {
    if(Chart1->Checked) return;
    if(ActiveChild){
    delete ActiveChild;
    ActiveChild=0;
    }

    TChartForm *form=new TChartForm(this);
    Active=form;
    form->Show();
    Chart1->Checked=true;
    Table1->Checked=false;
    }

    void __fastcall TMainForm::FormResize(TObject *Sender)
    {
    if(ActiveChild){
    ActiveChild->Width=ClientRect.Right;
    ActiveChild->Height=(MainForm->StatusBar->Top-1)-
    ActiveChild->Top;
    }
    }

    列表B:CHARTU.CPP
    #include <vcl.h>
    #pragma hdrstop

    #include /"ChartU.h/"
    #include /"MainU.h/"

    #pragma resource /"*.dfm/"
    TChartForm *ChartForm;

    __fastcall TChartForm::TChartForm(TComponent* Owner)
    : TForm(Owner)
    {
    }

    void __fastcall TChartForm::CreateParams(TCreateParams& Params)
    {
    //调用基类CreateParams方法
    TForm::CreateParams(Params);
    //子窗口类型
    Params.Style=WS_CHILD|WS_CLIPSIBLINGS;
    //设置父为主窗体
    Params.WndParent=MainForm->Handle;

    Params.X=0;
    if(Width>MainForm->ClientWidth)
    MainForm->ClientWidth=Width;
    if(Height>(MainForm->StatusBar->Top-MainForm->ToolBar->Height))
    MainForm->ClientHeight=Height+
    MainForm->ToolBar->Height+
    MainForm->StatusBar->Height;
    Params.Y=MainForm->ToolBar->Height+1;
    Params.Width=MainForm->ClientRect.Right;
    Params.Height=(MainForm->StatusBar->Top-1)-Params.Y;
    }

    void __fastcall TChartForm::FormClose(TObject *Sender,
    TCloseAction &Action)
    {
    MainForm->ActiveChild=0;
    MainForm->Chart1->Checked=false;
    Action=caFree;
    }

    void __fastcall TChartForm::CloseBtnClick(TObject *Sender)
    {
    Close();
    }
    展开全文
  • Section 属性 使用 Section 属性可区分窗体或报表的节,并可以对该节的属性进行访问。同样可以通过控件所在窗体或报表的节来区分不同的控件。设置Section 属性属于 Integer 数据类型,它对应一个特定的节。属性值...
     
    
    Section 属性
                   

    使用 Section 属性可区分窗体或报表的节,并可以对该节的属性进行访问。同样可以通过控件所在窗体或报表的节来区分不同的控件。

    设置

    Section 属性值属于 Integer 数据类型,它对应一个特定的节。属性值可使用下列的整数或常量。建议采用常量来提高程序的可读性。

    设置 常量 说明
    0 acDetail 窗体主体节或报表主体节
    1 acHeader 窗体页眉节或报表页眉节
    2 acFooter 窗体页脚节或报表页脚节
    3 acPageHeader 窗体页面页眉节或报表页面页眉节
    4 acPageFooter 窗体页面页脚或报表页面页脚
    5 acGroupLevel1Header 组级别 1 的页眉节(仅用于报表)
    6 acGroupLevel1Footer 组级别 1 页脚节(仅用于报表)
    7 acGroupLevel2Header 组级别 2 页眉节(仅用于报表)
    8 acGroupLevel2Footer 组级别 2 页脚节(仅用于报表)


    如果报表的组级别不止 2 ,则后面页眉/页脚从 9 开始编号。

    Section 属性在所有视图中都是只读的。

    对于窗体和报表,Section 属性是由节数指定的窗体或报表中所有现有节的数组。例如,Section(0) 表示的是窗体的主体节,Section(3) 表示的是窗体的页面页眉节。

    也可以使用名称对节进行引用。下列几个语句引用了“客户”窗体的 Detail0 节并且是等价的。

    Forms!Customers.Section(acDetail).Visible
    Forms!Customers.Section(0).Visible
    Forms!Customers.Detail0.Visible
    说明

    对于窗体和报表,必须将 Section 属性与其他应用于窗体或报表节的属性结合使用。以下示例显示的是“客户”窗体上页面页眉节的 Visible 属性的引用方式。

    Forms!Customers.Section(acPageHeader).Visible
    Forms!Customers.Section(3).Visible
    对于控件,使用 Section 属性可以决定控件处于窗体或报表的哪个节中。以下示例使用 Section 属性决定“客户ID”控件处于哪个对象之中。

    Dim intSectionNumber As Integer
    intSectionNumber = Forms!Customers!CustomerID
    展开全文
  • Winform控件属性事件介绍

    千次阅读 2016-08-28 13:10:05
    1、窗体 2、Label控件 3、TextBox控件 4、RichTextBox控件 5、NumericUpDown控件 6、Button控件 7、GroupBox控件 8、RadioButton控件 9、CheckBox控件 10、ListBox控件 11、ComboBox控件 12、CheckedListBox控件 13...
  • 用C#实现规则窗体

    千次阅读 2010-01-08 22:29:00
    作者:光脚丫思考 524130780@QQ.COM文档创建时间:1/1/2010 9:52:59 PM 如何实现规则窗体?TransparencyKey:获取或设置将表示窗体透明区域的颜色。FormBorderStyle:获取或设置窗体的边框样式。BackgroundImage...
  • C#控件事件属性大全

    千次阅读 2015-01-17 19:29:00
    1、窗体... 1 2、Label 控件... 3 3、TextBox 控件... 4 4、RichTextBox控件... 5 5、NumericUpDown 控件... 7 6、Button 控件... 7 7、GroupBox 控件... 7 8、RadioButton控件... 8 9、CheckBox 控件... 8 ...
  • C 创建规则窗体 窗口 的几种方式

    千次阅读 2019-01-22 11:55:39
    &nbsp;... C#创建规则窗体(窗口)的几种方式一、自定义窗体,一般为规则的图形,如圆、椭圆等。做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下:System.Drawing.Drawi
  • Winform模式窗体

    千次阅读 2012-03-14 11:30:07
    何谓模式窗体?简单的可以理解为窗体对话框,用户必须在完成该窗体上的操作或关闭窗体后才能返回打开此窗体窗体...模式窗体属性设置  在.net中一个System.Windows.Forms.Form类就表示一个窗体,通过visual studi
  • C#创建规则窗体(窗口)的几种方式 一、自定义窗体,一般为规则的图形,如圆、椭圆等。 做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下: System.Drawing.Drawing2D.GraphicsPath...
  • 事件本身就是观察者模式的一个实现。 先总结一下事件的使用: 委托类型声明 定义发布者类,并声明事件 在发布者类中定义触发事件方法 定义订阅者类,并注册事件 在订阅者类中定义事件处理方法 针对事件,.Net ...
  • C# WinForm窗体间传值

    千次阅读 2014-03-31 10:37:03
    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式:   公共静态变量;使用共有属性;使用委托与事件;通过构造函数把主窗体传递到从窗体中;   一、通过静态变量 ...
  • winform模式窗体

    千次阅读 2010-04-19 11:53:00
    何谓模式窗体?简单的可以理解为窗体对话框,用户必须在完成该窗体上的操作或关闭窗体后才能返回打开此窗体窗体。...模式窗体属性设置 在.net中一个System.Windows.Forms.Form类就表示一个窗体,通过visual stud
  • 创建窗体抢夺焦点 http://www.cnblogs.com/cartler/ 经过资料查找,发现可以设置WS_EX_NOACTIVATE 界面编程里面,经常碰到焦点问题,以下几点可注意: 1. Create时指定 WS_EX_NOACTIVATE属性,注意同时...
  • 模式窗体详解

    2010-09-23 17:53:00
    内容索引 概述 模式窗体属性设置 模式窗体中的按钮 模式窗体的打开与关闭 窗体的参数传递 .net Framework提供的模式窗体 更多资源 <br />概述 何谓模式窗体...
  • 显示窗体可以有以下2种方法: Form.ShowDialog方法(窗体显示为模式窗体) Form.Show方法(窗体显示为无模式窗体) 两者具体区别如下: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行 2.在调用Form....
  • c#窗体基本知识

    千次阅读 2014-06-10 17:49:12
    概述 何谓模式窗体?简单的可以理解为窗体对话框,用户必须在完成该窗体上的操作或关闭窗体后才能返回打开此窗体的...模式窗体属性设置 在.net中一个System.Windows.Forms.Form类就表示一个窗体,通过visual stud
  • 结束主窗体

    2019-04-29 17:06:38
    Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过结束主窗体,相当于用户点击窗体的关闭按钮或者按Alt + F4。它的本质就是向主窗体发送WM_CLOSE消息(Process.MainWindowsHandle...
  • 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 2者具体区别如下: 1.在调用Form.Show方法后,Show方法后面的代码会立即
  • c#复习2----窗体部分

    2020-06-22 20:59:40
    第十二章(winform编程) 1.所有Windows窗体控件都是...5.以下哪个选项不属于ListBox控件Item属性的方法() ps:在ListBox.Item里Count是属性不是事件 6.Windows窗体应用程序的编程模型主要由( )三部分组成。 7.Bu
  • 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 两者具体区别如下: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行 2.在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,212
精华内容 5,284
关键字:

以下不属于窗体事件属性的是