图形用户界面_第1页
图形用户界面_第2页
图形用户界面_第3页
图形用户界面_第4页
图形用户界面_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 图形用户界面:Windows窗体设计5.1 构造用户界面5.2 Windows窗体5.2.1 什么是Windows窗体5.2.2 Windows窗体与MFC和ATL5.2.3 Forms命名空间和Forms类5.2.4 Windows Forms的不足5.3 创建Windows窗体5.3.1 Windows窗体的坐标5.3.2 手动创建窗体5.3.3 使用项目模板创建窗体5.3.4 改变窗体属性和状态5.4 添加和使用窗体5.4.1 在项目中添加Windows窗体5.4.2 添加和布局Windows控件5.4.3 启动、显示Windows窗体5.5 Windows窗体的用户输入5.5.

2、1 事件概念5.5.2 事件处理模型5.5.3 Windows窗体中用户输入5.5.4 Windows窗体中键盘输入5.5.5 Windows窗体中鼠标输入5.6 Windows窗体中的对话框5.6.1 创建Windows窗体对话框5.6.2 显示Windows窗体对话框5.6.3 处理和验证对话框输入数据5.6.4 检索对话框结果5.6.5 通用对话框5.6.6 消息对话框5.7 切分窗体切分窗体是一种特殊的文档界面模型,它可以分割为许多窗格,在不同窗格中又可以包含若干界面控件元素,图所示Windows 资源管理器。在某些窗体上的界面中,窗体上控件所显示的数据长度可变,当我们把鼠标指针指向该

3、控件的未停靠的边缘时,鼠标指针将更改外观,指示该控件的大小是可以调整的。图5-1 Windows 资源管理器5.7.1 Splitter类主要属性和事件在Windows窗体应用程序设计中,实现窗体切分的类是Form: Splitter类。Splitter类继承了其父类Control的特性,封装了切分窗体中的切分条的操作,并将切分条封装成窗体的一个控件,使其操作控制更加方方便。1. Splitter类属性除了控件的字体、颜色、标题属性之外,Splitter类中主要属性有:(1)MinExtra与MinSize属性当用户调整切分条的位置或者窗体的大小时,会改变Splitter窗格的大小。MinEx

4、tra和MinSize属性都用来指定当用户移动切分条时,被切分窗格的最小宽度(水平切分)或高度(垂直切分),其默认值大小为25。但是这两个属性所指定的窗格是不同的:对于水平切分窗体来说:MinSize属性用来指定切分条左侧的窗格的最小宽度MinExtra属性用来指定切分条右侧的窗格的最小宽度对于垂直切分窗体来说:MinSize属性用来指定切分条上方的窗格的最小宽度MinExtra属性用来指定切分条下方的窗格的最小宽度(2)SplitPosition属性SplitPosition属性用来指定切分条的水平或垂直方向的位置。对于水平切分窗体来说:SplitPosition属性用来指定切分条与左侧窗格

5、控件的最左侧边缘的水平距离。对于垂直切分窗体来说:图5-2 Splitter 控件SplitPosition属性用来指定切分条与上方窗格控件的最顶部边缘的垂直距离。(3)BorderStyle属性BorderStyle属性用来指定切分条的边框样式,如BorderStyle:Fixed3D为三维立体框,BorderStyle:FixedSingle为单线框,默认值为无边框BorderStyle:None。2. Splitter类中主要事件当切分条控件在移动过程中及移动后,Splitter类发生主要事件有:SplitterMoving和SplitterMoved。在这两个事件处理中,可以通过类Sp

6、litterEventArgs参数获取事件的相关数据。SplitterEventArgs类的属性有SplitterX、splitterY、X和Y,分别表示切分条和鼠标的X坐标和Y坐标。5.7.2 单窗口切分实现与代码分析让拆分器作用于窗体的设置方式并不是很直观。关键要理解下列几点:其一的奥妙在于向窗体添加控件的次序,这种次序取决于窗体控件的Z顺序。Z顺序指的是可能会彼此交叠的图形对象从前到后的次序。组成界面的按钮、列表框以及其他对象通常并不交叠,但是这些对象仍然有Z顺序。Z顺序是由窗体中加入控件的顺序决定。在使用图形界面GUI设计器时,可以使用bring-to-front和send-to-ba

7、ck命令来改变Z顺序。拆分器作用于Z顺序中排在它前面的那些对象。在Windows窗体中,Splitter类需要指定合理的dock属性才能实现窗体的切分。1.单窗体水平切分图5-2单窗体水平切分程序创建方法与步骤:(1) 创建一个Windows窗体应用程序项目。(2) 在打开的窗体设计器上,单击Form1窗体,在窗体属性窗口中,将窗体标题Text属性内容修改为“单窗体水平切分”,然后调整窗体大小。(3) 将工具箱中的TextBox控件拖放到窗体上,在其属性窗体中,将Dock属性选择为Left,BorderStyle属性选择为Fixed3D,name属性保留其默认值textBox1,Multili

8、ne属性选择为True。(4) 将工具箱中的Splitter控件拖放到窗体上,按需修改属性,或保留为默认属性。(5) 再一次将工具箱中的TextBox控件拖放到窗体上,在其属性窗体中,将Dock属性选择为Right,BorderStyle属性选择为Fixed3D, name属性保留其默认值textBox2, Multiline属性选择为True。(6) 运行效果如图所示程序代码分析/ 注意向窗口中添加控件的次序: textBox1- splitter1- textBox2private: System:Windows:Forms:TextBox textBox1;protected: priv

9、ate: System:Windows:Forms:Splitter splitter1;private: System:Windows:Forms:TextBox textBox2;/分析:C+/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用来替换* ,就语义上来说他们的区别大致如下:1. gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址.2. gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放.this-textBox1 = (gcnew System:Windows:Forms:TextBox();this

10、-splitter1 = (gcnew System:Windows:Forms:Splitter();this-textBox2 = (gcnew System:Windows:Forms:TextBox();this-SuspendLayout();/ / textBox1/分析:设置textBox1的相关属性,Dock属性设置为Left;特别注意的是设置Multiline = true;这样才能接受多行输入this-textBox1-Dock = System:Windows:Forms:DockStyle:Left;this-textBox1-Location = System:Dra

11、wing:Point(0, 0);this-textBox1-Multiline = true;this-textBox1-Name = LtextBox1;this-textBox1-Size = System:Drawing:Size(128, 266);this-textBox1-TabIndex = 0;/ splitter1/分析:设置splitter1的相关属性this-splitter1-Location = System:Drawing:Point(128, 0);this-splitter1-Name = Lsplitter1;this-splitter1-Size = Sy

12、stem:Drawing:Size(10, 266);this-splitter1-TabIndex = 1;this-splitter1-TabStop = false;/ textBox2/分析:设置textBox2的相关属性,Dock属性设置为Right;特别注意的是设置Multiline = true;这样才能接受多行输入this-textBox2-BackColor = System:Drawing:Color:Lime;this-textBox2-Dock = System:Windows:Forms:DockStyle:Right;this-textBox2-Location =

13、 System:Drawing:Point(134, 0);this-textBox2-Multiline = true;this-textBox2-Name = LtextBox2;this-textBox2-Size = System:Drawing:Size(158, 266);this-textBox2-TabIndex = 2;/ Form1/分析:拆分器作用于Z顺序中排在它前面的textBox2对象,如果要将其关系连到textBox1,则必须按照下面的顺序向窗体添加控件。textBox2在Z的下面,拆分器位于中间,而textBox1位于最上面。如果以何人的其他顺序添加控件,程序就无

14、法按照预期运行。this-AutoScaleDimensions = System:Drawing:SizeF(6, 12);this-AutoScaleMode = System:Windows:Forms:AutoScaleMode:Font;this-ClientSize = System:Drawing:Size(292, 266);this-Controls-Add(this-textBox2);this-Controls-Add(this-splitter1);this-Controls-Add(this-textBox1);this-Name = LForm1;this-Text

15、 = L单窗体水平切分;this-ResumeLayout(false);this-PerformLayout();2.单窗体垂直切分若将上述控件的Dock属性改成下列属性代码,则可以实现垂直切分,效果如图所示。/ textBox1/this-textBox1-Dock = System:Windows:Forms:DockStyle:Top;this-textBox1-Location = System:Drawing:Point(0, 0);this-textBox1-Multiline = true;this-textBox1-Name = LtextBox1;this-textBox1

16、-Size = System:Drawing:Size(292, 111);this-textBox1-TabIndex = 0;/ splitter1/this-splitter1-Dock = System:Windows:Forms:DockStyle:Top;this-splitter1-Location = System:Drawing:Point(0, 111);this-splitter1-Name = Lsplitter1;this-splitter1-Size = System:Drawing:Size(292, 24);this-splitter1-TabIndex = 1

17、;this-splitter1-TabStop = false;/ textBox2/this-textBox2-Dock = System:Windows:Forms:DockStyle:Bottom;this-textBox2-Location = System:Drawing:Point(0, 141);this-textBox2-Multiline = true;this-textBox2-Name = LtextBox2;this-textBox2-Size = System:Drawing:Size(292, 125);this-textBox2-TabIndex = 2;图5-2

18、单窗体水平切分5.7.3多窗格切分实现与代码分析1.设计方法利用等容器类控件,可实现多个窗格的切分窗体。方法类似于水平或垂直的切分方法。需要特别说明的是,在窗体设计器中进行切分窗口设计师,控件的添加次序是极为重要的。图所示的多窗格切分次序是:(1) 首先设计panel1-Splitter1-panel2;(2) 其次在panel1中添加次序:TextBox1-Splitter2- TextBox2-Splitter3- TextBox3;(3) 在panel2中添加TextBox4其中,步骤(2)和(3)没有先后次序。2.代码分析/分析:定义控件,注意各控件定义的次序:(1)panel1-Sp

19、litter1-panel2;(2)TextBox1-Splitter2- TextBox2-Splitter3- TextBox3;private: System:Windows:Forms:Panel panel1;protected: private: System:Windows:Forms:Splitter splitter1;private: System:Windows:Forms:Panel panel2;private: System:Windows:Forms:TextBox textBox3;private: System:Windows:Forms:Splitter s

20、plitter3;private: System:Windows:Forms:TextBox textBox2;private: System:Windows:Forms:Splitter splitter2;private: System:Windows:Forms:TextBox textBox1;private: System:Windows:Forms:TextBox textBox4;/分析:C+/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用来替换* 。this-panel1 = (gcnew System:Windows:Forms:Panel(

21、);this-splitter1 = (gcnew System:Windows:Forms:Splitter();this-panel2 = (gcnew System:Windows:Forms:Panel();this-textBox1 = (gcnew System:Windows:Forms:TextBox();this-splitter2 = (gcnew System:Windows:Forms:Splitter();this-textBox2 = (gcnew System:Windows:Forms:TextBox();this-splitter3 = (gcnew Syst

22、em:Windows:Forms:Splitter();this-textBox3 = (gcnew System:Windows:Forms:TextBox();this-textBox4 = (gcnew System:Windows:Forms:TextBox();this-panel1-SuspendLayout();this-panel2-SuspendLayout();this-SuspendLayout();/ panel1/分析: textBox1- splitter2 -textBox2- splitter3- textBox3都是建在panel1容器上面。this-pane

23、l1-Controls-Add(this-textBox3);this-panel1-Controls-Add(this-splitter3);this-panel1-Controls-Add(this-textBox2);this-panel1-Controls-Add(this- textBox3);this-panel1-Controls-Add(this-textBox1);this-panel1-Dock = System:Windows:Forms:DockStyle:Left;this-panel1-Location = System:Drawing:Point(0, 0);th

24、is-panel1-Name = Lpanel1;this-panel1-Size = System:Drawing:Size(256, 371);this-panel1-TabIndex = 0;/分析:设置splitter1的属性this-splitter1-BorderStyle = System:Windows:Forms:BorderStyle:Fixed3D;this-splitter1-Location = System:Drawing:Point(256, 0);this-splitter1-Name = Lsplitter1;this-splitter1-Size = Sys

25、tem:Drawing:Size(18, 371);this-splitter1-TabIndex = 1;this-splitter1-TabStop = false;/ panel2/分析: textBox4都是建在panel2容器上面。this-panel2-Controls-Add(this-textBox4);this-panel2-Dock = System:Windows:Forms:DockStyle:Right;this-panel2-Location = System:Drawing:Point(280, 0);this-panel2-Name = Lpanel2;this

26、-panel2-Size = System:Drawing:Size(249, 371);this-panel2-TabIndex = 2;/ textBox1/分析:设置textBox1的属性,特别是注意停靠的位置、多行设置this-textBox1-Dock = System:Windows:Forms:DockStyle:Top;this-textBox1-Location = System:Drawing:Point(0, 0);this-textBox1-Multiline = true;this-textBox1-Name = LtextBox1;this-textBox1-Siz

27、e = System:Drawing:Size(256, 135);this-textBox1-TabIndex = 0;/ splitter2/this-splitter2-BorderStyle = System:Windows:Forms:BorderStyle:Fixed3D;this-splitter2-Dock = System:Windows:Forms:DockStyle:Top;this-splitter2-Location = System:Drawing:Point(0, 135);this-splitter2-Name = Lsplitter2;this-splitte

28、r2-Size = System:Drawing:Size(256, 25);this-splitter2-TabIndex = 1;this-splitter2-TabStop = false;/ textBox2/分析:设置textBox2的属性,特别是注意停靠的位置、多行设置this-textBox2-Dock = System:Windows:Forms:DockStyle:Left;this-textBox2-Location = System:Drawing:Point(0, 160);this-textBox2-Multiline = true;this-textBox2-Nam

29、e = LtextBox2;this-textBox2-Size = System:Drawing:Size(117, 211);this-textBox2-TabIndex = 2;/ splitter3/this-splitter3-BorderStyle = System:Windows:Forms:BorderStyle:Fixed3D;this-splitter3-Location = System:Drawing:Point(117, 160);this-splitter3-Name = Lsplitter3;this-splitter3-Size = System:Drawing

30、:Size(19, 211);this-splitter3-TabIndex = 3;this-splitter3-TabStop = false;/ textBox3/分析:设置textBox3的属性,特别是注意停靠的位置、多行设置this-textBox3-Dock = System:Windows:Forms:DockStyle:Left;this-textBox3-Location = System:Drawing:Point(136, 160);this-textBox3-Multiline = true;this-textBox3-Name = LtextBox3;this-tex

31、tBox3-Size = System:Drawing:Size(114, 211);this-textBox3-TabIndex = 4;/ textBox4/分析:设置textBox4的属性,特别是注意停靠的位置、多行设置。textBox4-Dock被设置为Fill,所以当调节panel1的大小的时候,textBox4会自动调节大小,填满窗体的剩余部分。this-textBox4-Dock = System:Windows:Forms:DockStyle:Fill;this-textBox4-Location = System:Drawing:Point(0, 0);this-textBo

32、x4-Multiline = true;this-textBox4-Name = LtextBox4;this-textBox4-Size = System:Drawing:Size(249, 371);this-textBox4-TabIndex = 0;/ Form1/Form1窗体上有三大部分组成:panel1、splitter1、panel2this-AutoScaleDimensions = System:Drawing:SizeF(6, 12);this-AutoScaleMode = System:Windows:Forms:AutoScaleMode:Font;this-Cli

33、entSize = System:Drawing:Size(529, 371);this-Controls-Add(this-panel2);this-Controls-Add(this-splitter1);this-Controls-Add(this-panel1);this-Name = LForm1;this-Text = L多窗格切分;this-panel1-ResumeLayout(false);this-panel1-PerformLayout();this-panel2-ResumeLayout(false);this-panel2-PerformLayout();this-R

34、esumeLayout(false);5.8 列表视图5.8.1 ListView类的属性和事件5.8.2 列表视图控件基本操作5.9 树视图5.9.1 TreeView类的属性和事件5.9.2 树视图控件的节点操作5.10 多文档界面窗体MDI程序设计5.10.1 多文档应用程序概述5.10.2 创建MDI父窗体5.10.3 创建MDI子窗体5.11 上机实验指导5.11.1切分窗体应用实例1.实例功能程序运行效果如图所示。在左边的窗格中,用户可以调整小方块在右边窗格的坐标位置、大小。方法一,知己在文本编辑框中输入数值;方法二,用鼠标点击数字旋转控件内容。在右边窗格中任何点击或移动鼠标或滚动

35、鼠标中间滚轮,相应的小方块移动到当前鼠标位置或者按照滚轮方向移动;且数字旋转控件内容实时随之发生改变。2.创建切分窗口框架程序创建方法与步骤:创建一个Windows窗体应用程序项目。在打开的窗体设计器上,单击Form1窗体,在窗体属性窗口中,将窗体标题Text属性内容修改为“切分窗体应用实例”,然后调整窗体大小。将工具箱中的Panel控件拖放到窗体上,在其属性窗体中,将Dock属性选择为Left,BorderStyle属性选择为Fixed3D,name属性保留其默认值Panel1。将工具箱中的Splitter控件拖放到窗体上,按需修改属性,或保留为默认属性。再一次将工具箱中的Panel控件拖放

36、到窗体上,在其属性窗体中,将Dock属性选择为Fill,BorderStyle属性选择为Fixed3D, name属性保留其默认值Panel2,背景颜色BackColor选择为window,光标Cursor属性选择为Cross 。3.实现窗格功能(1)在左边的窗格中,添加三个标签()和三个数字旋转控件(),用来表示右边窗格中鼠标或者小方块的坐标和小方块的大小。在数字旋转控件属性窗口中,分别将其Name属性设为pXEdit、pYEdit和pREdit,并将Maximum属性均设为1000。(2) 在窗体属性窗口中,单击事件图标按钮,为该窗体添加Load事件处理方法On_Load,并添加下列代码以

37、及添加记录右边窗格中的点的位置坐标变量m_ptRect:private: Drawing:Point m_ptRect;private: System:Void On_Load(System:Object * sender, System:EventArgs * e) m_ptRect = Drawing:Point( 0, 0 );/ 设置点位置坐标的初值 / 设置左边窗格中控件的数值pXEdit-Value = (Decimal) m_ptRect.X;pYEdit-Value = (Decimal) m_ptRect.Y; / 更新右边窗格中的内容,Invalidate()语句强制执行On_Paint,这样小方块就显示在当前鼠标的位置处 Panel2-Invalidate(); 3)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论