您好,欢迎访问三七文档
第5章图形用户界面:Windows窗体设计5.1构造用户界面5.2Windows窗体5.2.1什么是Windows窗体5.2.2Windows窗体与MFC和ATL5.2.3Forms命名空间和Forms类5.2.4WindowsForms的不足5.3创建Windows窗体5.3.1Windows窗体的坐标5.3.2手动创建窗体5.3.3使用项目模板创建窗体5.3.4改变窗体属性和状态5.4添加和使用窗体5.4.1在项目中添加Windows窗体5.4.2添加和布局Windows控件5.4.3启动、显示Windows窗体5.5Windows窗体的用户输入5.5.1事件概念5.5.2事件处理模型5.5.3Windows窗体中用户输入5.5.4Windows窗体中键盘输入5.5.5Windows窗体中鼠标输入5.6Windows窗体中的对话框5.6.1创建Windows窗体对话框5.6.2显示Windows窗体对话框5.6.3处理和验证对话框输入数据5.6.4检索对话框结果5.6.5通用对话框5.6.6消息对话框5.7切分窗体切分窗体是一种特殊的文档界面模型,它可以分割为许多窗格,在不同窗格中又可以包含若干界面控件元素,图所示Windows资源管理器。在某些窗体上的界面中,窗体上控件所显示的数据长度可变,当我们把鼠标指针指向该控件的未停靠的边缘时,鼠标指针将更改外观,指示该控件的大小是可以调整的。图5-1Windows资源管理器5.7.1Splitter类主要属性和事件在Windows窗体应用程序设计中,实现窗体切分的类是Form::Splitter类。Splitter类继承了其父类Control的特性,封装了切分窗体中的切分条的操作,并将切分条封装成窗体的一个控件,使其操作控制更加方方便。1.Splitter类属性除了控件的字体、颜色、标题属性之外,Splitter类中主要属性有:(1)MinExtra与MinSize属性当用户调整切分条的位置或者窗体的大小时,会改变Splitter窗格的大小。MinExtra和MinSize属性都用来指定当用户移动切分条时,被切分窗格的最小宽度(水平切分)或高度(垂直切分),其默认值大小为25。但是这两个属性所指定的窗格是不同的:·对于水平切分窗体来说:MinSize属性用来指定切分条左侧的窗格的最小宽度MinExtra属性用来指定切分条右侧的窗格的最小宽度·对于垂直切分窗体来说:MinSize属性用来指定切分条上方的窗格的最小宽度MinExtra属性用来指定切分条下方的窗格的最小宽度(2)SplitPosition属性SplitPosition属性用来指定切分条的水平或垂直方向的位置。·对于水平切分窗体来说:SplitPosition属性用来指定切分条与左侧窗格控件的最左侧边缘的水平距离。·对于垂直切分窗体来说:SplitPosition属性用来指定切分条与上方窗格控件的最顶部边缘的垂直距离。(3)BorderStyle属性图5-2Splitter控件BorderStyle属性用来指定切分条的边框样式,如BorderStyle::Fixed3D为三维立体框,BorderStyle::FixedSingle为单线框,默认值为无边框BorderStyle::None。2.Splitter类中主要事件当切分条控件在移动过程中及移动后,Splitter类发生主要事件有:SplitterMoving和SplitterMoved。在这两个事件处理中,可以通过类SplitterEventArgs参数获取事件的相关数据。SplitterEventArgs类的属性有SplitterX、splitterY、X和Y,分别表示切分条和鼠标的X坐标和Y坐标。5.7.2单窗口切分实现与代码分析让拆分器作用于窗体的设置方式并不是很直观。关键要理解下列几点:·其一的奥妙在于向窗体添加控件的次序,这种次序取决于窗体控件的Z顺序。Z顺序指的是可能会彼此交叠的图形对象从前到后的次序。组成界面的按钮、列表框以及其他对象通常并不交叠,但是这些对象仍然有Z顺序。Z顺序是由窗体中加入控件的顺序决定。在使用图形界面GUI设计器时,可以使用bring-to-front和send-to-back命令来改变Z顺序。·拆分器作用于Z顺序中排在它前面的那些对象。·在Windows窗体中,Splitter类需要指定合理的dock属性才能实现窗体的切分。1.单窗体水平切分·程序创建方法与步骤:(1)创建一个Windows窗体应用程序项目。(2)在打开的窗体设计器上,单击Form1窗体,在窗体属性窗口中,将窗体标题Text属性内容修改为“单窗体水平切分”,然后调整窗体大小。(3)将工具箱中的TextBox控件拖放到窗体上,在其属性窗体中,将Dock属性选择为Left,BorderStyle属性选择为Fixed3D,name属性保留其默认值textBox1,Multiline属性选择为True。(4)将工具箱中的Splitter控件拖放到窗体上,按需修改属性,或保留为默认属性。(5)再一次将工具箱中的TextBox控件拖放到窗体上,在其属性窗体中,将Dock属性选择为Right,BorderStyle属性选择为Fixed3D,name属性保留其默认值textBox2,Multiline属性选择为True。图5-2单窗体水平切分(6)运行效果如图所示·程序代码分析//注意向窗口中添加控件的次序:textBox1-splitter1-textBox2private:System::Windows::Forms::TextBox^textBox1;protected:private:System::Windows::Forms::Splitter^splitter1;private:System::Windows::Forms::TextBox^textBox2;//分析:C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换*,就语义上来说他们的区别大致如下:1.gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址.2.gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放.this-textBox1=(gcnewSystem::Windows::Forms::TextBox());this-splitter1=(gcnewSystem::Windows::Forms::Splitter());this-textBox2=(gcnewSystem::Windows::Forms::TextBox());this-SuspendLayout();////textBox1//分析:设置textBox1的相关属性,Dock属性设置为Left;特别注意的是设置Multiline=true;这样才能接受多行输入this-textBox1-Dock=System::Windows::Forms::DockStyle::Left;this-textBox1-Location=System::Drawing::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=System::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=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位于最上面。如果以何人的其他顺序添加控件,程序就无法按照预期运行。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=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-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;this-splitter1-TabStop=false;////textBox2//this-textBox2-Dock=System::Windows::Forms::DockStyle::Bottom;this-textBox2-Location=System::Drawing::Point(0,141);this-text
本文标题:图形用户界面
链接地址:https://www.777doc.com/doc-2558765 .html