1、以Tab键切换控件的顺序
Visual Studio 2008设计环境允许依次单击窗体上的控件,来设置窗体中使用Tab键时控件的切换顺序。要想激活该特性,在设计器中打开一个窗体,然后选择View|Tab Order菜单项。这样将在窗体上每个控件的左上角显示一个表示该控件标志索引的小编号。
在Windows窗体2.0版本中,可以将两个或两个以上的控件设置为相同的标志索引值,在运行时,VB将使用控件的z-order值来区分先后。z- order值最高的控件将最先得到焦点。z-order值是一个等级值,确定了哪些控件在其他控件的前面或后面。右击控件,选择Bring to Front选项,就可以改变z-order值。
2、动态调整控件的大小和布局
(1)停靠
停靠特性可以将一个控件贴附在其父控件的边缘。
如果试图将多个控件停靠在同一边,Windows窗体就必须确定如何打破这种平等的局面。优先级会按照z-order逆序赋给控件。换句话说,z- order值最大的控件将成为第一个停靠边框的控件。如果在同一条边停靠了两个控件,并想切换它们的顺序,可以右击要最先停靠的控件,再选择Send To Back选项。
如果要在窗体的边框和停靠的控件之间有一个空隙,可以设置父控件的DockPadding属性。可以为4个方向(Left、Right、Top、Bottom)设置不同的值。也可以使用All把这4个属性设置为相同的值。
(2)锚定
Anchor属性。锚定最常见的用法是把按钮的Anchor属性设置为窗体的右下部分。就使按钮与窗体右下角的距离保持不变。
也可以在代码中设置Anchor属性。最常见的情况是为运行时创建的控件设置该属性。要在代码中设置Anchor属性,必须把需要锚定的边全部添加进去。
(3)可改变大小的容器
一个SplitContainer类似于两个插入了Splitter的面板。可以把它看做有两个部分的面板,其分隔条是可以移动的,允许用户改变两个部分的相对大小。
通常插入TreeView或ListBox控件,使它们停靠在相应的子面板上。这会允许用户调整被包含控件的大小。
SplitContainer可以嵌套在另一个SplitContainer中,以建立多个部分能调整相对大小的窗体。
3、FlowLayoutPanel控件
FlowLayoutPanel中的控件可以根据FlowLayoutPanel的大小自动调整布局。
FlowLayoutPanel的工作原理在概念上类似于浏览器中显示的简单HTML页面。放在FlowLayoutPanel中的控件按水平方向顺序定位,如果没有足够的空间放置下一个控件,就另起一行。
FlowLayoutPanel会自动处理按钮的定位。实际上,如果按钮控件放在FlowLayoutPanel中,它们的定位信息就会被忽略。
Padding和Margin属性
为了辅助布置FlowLayoutPanel内的控件,所有的控件都包含了一个新的Margin属性。它的设置包括Margin.Left、 Margin.Right、Margin.Top和Margin.Bottom。在自动计算某个控件在FlowLayoutPanel上的位置时,这些设 置用于指定控件四周应预留的空间。
FlowLayoutPanel和其他的容器控件都有一个Padding属性。把某个控件嵌入到FlowLayoutPanel中 时,FlowLayoutPanel容器的Padding.Left、Padding.Right、Padding.Top和 Padding.Bottom属性用于决定控件到容器边界的距离。
其他的容器控件只有在设置了Dock属性后,才能使用Pdding属性。如果Padding值不为0,则停靠的控件与容器边界间的距离就是Padding属性所指定的值。
4、TableLayoutPanel控件
另一个用于实现动态布局的控件是TableLayoutPanel。这个控件包含了一张由列和行组成的表,形成了一个矩形单元格阵列。每个单元格中可以放置一个控件。该控件也可以是一个容器,例如Panel或FlowLayoutPanel。
列和行的维度都可以通过属性进行控制。要改变列数,应使用ColumnCount属性,每一列都可以使用ColumnStyles集合控制。单击ColumnStyles集合上的按钮,打开设计窗口,就可以设置每一列的SizeType和Width属性。
SizeType属性的枚举值包括:
- Absolute——把列宽设置为以像素为单位的固定尺寸。
- AutoSize——列宽由TableLayoutPanel负责管理,列中的最大控件宽度决定了列的宽度。
- Percent——指定列宽相对于TableLayoutPanel的百分比。
只有在SizeType不是AutoSize时,才能使用Width属性。该属性可以使用具体的像素数指定列宽(如果SizeType为Absolute),也可以使用百分数指定列宽(如果SizeType设置为Percent)。
与此类似,RowCount属性用于设置行数,RowStyles集合用于管理每一行的尺寸。RowStyles中的每一行都有对应的SizeType属性,该属性与列的SizeType属性作用一样,只不过它控制的是行高而不是列宽。Height属性设置了行的高度。
比较高级的UI布局技术是先创建一个TableLayoutPanel,再在TableLayoutPanel的一些单元格中嵌入FlowLayoutPanel,这允许将多个控件包含在一个单元格中,随单元格的大小变化而重新定位。
5、Panel和GroupBox容器控件
GroupBox和Panel它们的区别很小。
这两个控件在下述方面类似:
- 它们都可以用作其他控件的容器。
- 如果它们被隐藏或移动,容器中的所有控件都会隐藏或移动。
GroupBox控件在视觉效果上非常类似于VB6的Frame控件,它的操作也类似于VB6的Frame控件,但有一个重要的区别:无法删除其边框。它总是有边框,如果需要的话也可以有标题。边框总是以相同的方式设置。
Panel控件有3个地方与GroupBox控件不同:
- 它可以在BorderStyle属性中设置其边框显示,默认值是没有边框。
- 它可以把AutoScroll属性设置为True,进行滚动。
- 它不能设置标题。
6、扩展的Provider控件
Windows窗体中有一组只能和其他可视化控件一起使用的控件。这些控件称为扩展的Provider控件,它们可以和Visual Studio IDE一起使用,在属性窗口中为窗体上的其他控件添加新属性。
Windows窗体2.0目前可以使用的3个扩展Provider控件是HelpProvider、ToolTip和ErrorProvider。这3个控件的工作方式基本相同。每个扩展的Provider控件都实现了附加在其他控件上的属性。
(1)ToolTip控件
ToolTip控件是最简单的扩展提供程序,它给每个控件添加一个ToolTip On ToolTip1属性(假定ToolTip控件的默认名称是ToolTip1)。这个属性的工作方式与VB6中的ToolTipText属性相同,实际上是取代了ToolTipText属性。
在Windows窗体2.0中,可以把工具提示的形状改为气球,为此,可以把ToolTip组件的IsBalloon属性设置为True。
(2)HelpProvider控件
HelpProvider控件可以在按下F1键后显示控件的关联帮助。把HelpProvider控件添加到窗体上时,窗体上的所有控件都获得下表所示的新属性,这些属性都显示在控件的属性窗口中。
属性 | 用法 |
HelpString on HelpProvider1 | 控件在获得焦点时,如果按下F1键,该属性就会提供弹出的工具提示。如果HelpKeyword和HelpNavigator属性设置为提供一个对帮助文件的有效引用,HelpString值就会被忽略,而显示帮助文件中的内容 |
HelpKeyword on HelpProvider1 | 为控件的关联帮助提供在帮助文件中使用的关键字或其他索引。HelpProvider控件有一个属性指定要使用的帮助文件,这个属性替代了VB6中的HelpContextID属性 |
HelpNavigator on HelpProvider1 | 包含一个枚举值,确定如何使用HelpKeyword中的值引用帮助文件。该属性有几个可能的值,例如把元素显示为帮助文件中的主题、索引或目录表 |
ShowHelp on HelpProvider1 | 确定HelpProvider控件对于这个控件是否为激活状态 |
填充HelpString属性会使控件在获得焦点且按下F1键时,得到ToolTip帮助。HelpProvider控件有一个指向帮助文件(HTML帮助文件或Win32帮助文件)的属性,HelpTopic属性中的帮助主题指向了这个文件中的某个主题。
(3)ErrorProvider控件
ErrorProvider控件提供了一种简单、直观的方式,告诉用户窗体的控件出现了错误。在使用ErrorProvider控件时,给窗体上的每个控件都添加了名为Error On ErrorProvider1的属性。把这个属性设置为字符串值,会在控件的旁边显示错误图标,如果把鼠标指针停放在该错误图标上,就会在工具提示中显示相关文本。
(4)扩展Provider控件的属性
除了为其他控件提供属性之外,扩展Provider控件还有它们自己的属性。例如,ErrorProvider控件有一个BlinkStyle属性,它设置为NeverBlink时,受ErrorProvider影响的所有控件就不会闪烁其错误图标了。
ErrorProvider的其他属性可以改变某些特性,比如当字段出错时,所使用的图标以及图标出现的位置等。例如,可以让图标显示在字段的左边而不是 默认的右边。还可以在窗体上添加多个ErrorProvider。例如,要给用户显示一个警告,而不是错误,第二个ErrorProvider可以使用黄 色的图标来提供这个特性。
(5)在代码中使用扩展的Provider控件
在前面的例子中,Error属性的设置可以在属性窗口中进行,但这对于动态的错误管理来说不是非常有效。在代码中设置Error属性采用的不是一般的属性 语法。按照约定,扩展Provider控件为每个需要设置的属性提供了一个方法,该方法的参数包括关联的控件和属性设置。要设置前面例子中的Error属 性,应使用下面的代码:
设置属性的方法名称是Set后跟属性名。
获得属性值也有对应的方法,其名称是Get后跟属性名。要获得txtName的Error属性的当前设置,可以使用下面的代码:
可以使用类似的语法操作扩展Provider控件的任何属性。前面讨论的ToolTip控件是在属性窗口中设置的ToolTip属性,要在代码中设置这个属性,语法如下:
7、数据输入的高级功能
Windows窗体2.0版本为数据输入提供了两个高级功能。Textbox和Combobox控件实现了自动填充功能,新添加的MaskedTextbox控件允许控制数据的输入格式,例如电话号码等。
(1)自动填充
自动填充功能可以使用几个内置列表。除了把AutoCompleteSource设置为CustomSource之外,还可以把它设置为文件系统中的文件或最近在IE中使用的URL。其他选项参见AutoCompleteSource文档。
(2)MaskedTextbox控件
把MaskedTextbox控件拖到窗体上后,就可以设置控件的屏蔽了。为此,在属性窗口中选择Mask属性或者单击MaskedTextbox右边的智能标记(右箭头)。在这两种方法中,都可以手动构建屏蔽,或者从列表中选择常用的屏蔽。
在自己创建屏蔽时,会用到下表所示的格式化字符:
屏蔽字符 | 描述 |
# | 数字占位符 |
. | 小数点占位符。实际使用的字符时国际化设置中指定的小数点占位符。这个字符时用于实现屏蔽的字面字符 |
, | 千位分隔符。实际使用的字符时国际化设置中指定的千位分隔符。这个字符是用于实现屏蔽的字面字符 |
: | 时间分隔符。实际使用的字符是国际化设置中指定的时间分隔符。这个字符是用于实现屏蔽的字面字符 |
/ | 日期分隔符。实际使用的字符时国际化设置中指定的日期分隔符。这个字符是用于实现屏蔽的字面字符 |
\ | 把屏蔽字符串中的下一个字符处理为字面字符。这允许在屏蔽中使用#、&、A、?等字符。这个字符时用于实现屏蔽的字面字符 |
& | 字符占位符。这个占位符的有效值是下面范围内的ANSI字符:32-126和128-255 |
> | 把所有的字母转换为大写 |
< | 把所有的字母转换为小写 |
A | 字符与数字占位符(必须输入)。例如:a-z、A-Z或者0-9 |
a | 字符与数字占位符(可选输入) |
9 | 数字占位符(可选输入)。例如0-9 |
C | 字符或者空格占位符(可选输入)。功能和“&”完全一样,实现了与Microsoft Access的兼容 |
? | 字母占位符。例如:a-z或者A-Z |
字面字符 | 其他的符号都显示为字面字符,即和它们本身一样 |
MaskedTextBox控件可以自动插入字面字符。例如,对于电话号码中使用的圆括号,用户不必在控件的文本区域输入它们,MaskedTextbox会自动插入。
假设有一个账户号码,其格式必须是2个大写字母加上5个数字。为此可以使用屏蔽“>??00000”。第一个字符强制把所有的字母都转换为大写,后面的两个问号指定必须使用字母字符,最后的5个0指定了只能接受数字输入。
为MaskedTextbox设定了Mask后,该控件内输入的所有条目必须匹配Mask的样式。无效的键入会自动舍弃。
8、验证数据输入
大多数放在窗体上的控件都需要用某种方式验证它们的内容。与以前版本相比,前面讨论的ErrorProvider组件更容易完成这项任务。
(1)Validating事件
当控件开始验证时,会触发Validating事件,在该事件中需要放置用于验证控件的代码,并为错误设置可见的提示。插入下面的代码:
运行程序,在没有输入任何文本的两个控件之间进行跳转,会得到错误消息。每个文本框控件的旁边都会闪烁一个图标,如果把光标停放在错误图标上,就会看到相应的错误信息。
在控件的Validating事件完成后,还会引发Validated事件。在其他事件处理完控件的内容后,可以使用它进行最后的检查。
(2)CauseValidation属性
CauseValidation属性用于确定控件是否参与窗体上的验证事件。控件的CauseValidation属性设置为True时,会产生两种作用:
- 在适当时,控件将触发它的Validating/Validated事件。
- 控件会为其他控件引发Validating/Validated事件。
重要的是,控件的验证事件不是在控件失去焦点时引发,而是在焦点移动到一个CauseValidation值为True的控件上时引发的。
9、工具栏与新增的ToolStrip控件
除了初始位置外,ToolStrip还可以移动到窗体的其他边上。另外,工具栏上的控件布置也更加灵活,使用IDE可以更好地创建和配置工具栏。
ToolStrip并不是固定在窗体上的。在把一个ToolStrip拖放到窗体上时,窗体中的容器被称为RaftingContainer。这个容器负责控件的放置,因此使用ToolStrip创建的工具栏可以拖放到窗体的其他部分。
ToolStrip位于RaftingContainer容器内,是工具栏元素的容器。ToolStrip负责改变工具栏的尺寸,移动工具栏中的元素,实现其他的工具栏常用功能。
工具栏上的元素必须是可作为工具栏元素的控件。这些控件都派生于ToolStripItem基类。可用于工具栏元素的控件如下表所示:
控件 | 描述 |
ToolStripButton | 为工具栏实现常规的Button控件功能 |
ToolStripLabel | 为工具栏实现常规的Label控件功能 |
ToolStripSeparator | 用于分割不同组元素的垂直栏(没有用户交互功能) |
ToolStripCombobox | 为工具栏实现常规的ComboBox控件功能。这个元素必须包含在ToolStripControlHost中 |
ToolStripTextBox | 为工具栏实现常规的TextBox控件功能。这个元素必须包含在ToolStripControlHost中 |
ToolStripControlHost | ToolStrip上用于容纳其他控件的容器。可以容纳的控件包括:ToolStripComboBox、ToolStripTextBox以及其他的Windows窗体控件和用户控件 |
ToolStripDropDownItem | 以下拉菜单的形式显示工具栏元素。可以包含:ToolStripMenuItem、ToolStripSplitButton和ToolStripDropDownButton |
ToolStripDropDownButton | 支持下拉功能的按钮。单击按钮会显示一个选项列表,用户可以自行选择。用户需要从一组选项中选择时使用这个控件。下拉菜单中的所有条目都不是经常使用的 |
ToolStripSplitButton | 普通按钮与下拉按钮的组合。如果有一个常用的选项,又要给用户提供其他不常用的选项时,就可以使用这个控件 |
ToolStripMenuItem | 菜单或者弹出菜单中的可选项。这个元素通常与继承于ToolStrip的菜单控件结合使用。 |
ToolStripControlHost上几乎可以放置所有的控件。但是,对于按钮、文本框、标签和组合框等,使用ToolStrip版本来代替这个通用版本要简单得多。
(1)ToolStrip的创建与工具栏元素的添加
为了使ToolStrip更动态,必须把它嵌入ToolStripContainer中。将ToolStripContainer的Dock属性设置为Fill,就会给ToolStrip提供一个界面,其中包含了窗体的4条边。
参考:
ToolStripContainer控件概述
在ToolStripContainer的左侧、右侧、顶部和底部都有用来放置和漂浮ToolStrip、MenuStrip和StatusStrip控 件的面板。如果将多个ToolStrip控件放在ToolStripContainer的左边或右边,这些控件会垂直重叠;如果将这些控件放在 ToolStripContainer的顶部或底部,则会水平重叠。使用ToolStripConyainer的中心 ToolStripContentPanel可以在窗体上放置传统控件。
任何或所有ToolStripContainer控件在设计时都可以直接选择,并且可以删除。ToolStripContainer的每个面板都可扩展和可折叠的,并且可以用它包含的控件来调整大小。
重要的ToolStripContainer成员
Name | 说明 |
BottomToolStripPanel | 获取ToolStripContainer的底部面板 |
BottomToolStripPanelVisible | 获取或设置一个值,该值指示ToolStripContainer的底部面板是否可见 |
LeftToolStripPanel | 获取ToolStripContainer的左面板 |
LeftToolStripPanelVisible | 获取或设置一个值,该值指示ToolStripContainer的左面板是否可见 |
RightToolStripPanel | 获取ToolStripContainer的右面板 |
RightToolStripPanelVisible | 获取或设置一个值,该值指示ToolStripContainer的右面板是否可见 |
TopToolStripPanel | 获取ToolStripContainer的顶部面板 |
TopToolStripPanelVisible | 获取或设置一个值,该值指示ToolStirpContainer的顶部面板是否可见 |
ToolStripContainer类似于SplitContainer。它使用四个停靠侧面板(ToolStripPanel的实例)和一个中间面板 (ToolStripContentPanel实例)来创建典型排列。您不能移除侧面板,但可以通过对它们各自的Visible属性设置为false来隐 藏它们。默认情况下,这些属性的每一个在设计时都是true。在设计时,ToolStripContainer还显示其顶部面板已经展开。既不能移除也不 能隐藏ToolStripContentPanel。可以在侧面板中排列一个或多个ToolStrip、MenuStrip或StatusStrip控 件,并且可以将中间面板用于其它控件。ToolStripContentPanel还提供一种方法,能够在窗体的主体中支持呈现程序以获得一致的外观。
ToolStripContainer不支持多文档界面(MDI)应用程序。ToolStripPanel用于MDI应用程序。
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Public Class Form1
Inherits Form
Private toolStripContainer1 As ToolStripContainer
Private toolStrip1 As ToolStrip
Public Sub New()
InitializeComponent()
End Sub 'New
<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub 'Main
Private Sub InitializeComponent()
toolStripContainer1 = New System.Windows.Forms.ToolStripContainer()
toolStrip1 = New System.Windows.Forms.ToolStrip()
' Add items to the ToolStrip.
toolStrip1.Items.Add("One")
toolStrip1.Items.Add("Two")
toolStrip1.Items.Add("Three")
' Add the ToolStrip to the top panel of the ToolStripContainer.
toolStripContainer1.TopToolStripPanel.Controls.Add(toolStrip1)
' Add the ToolStripContainer to the form.
Controls.Add(toolStripContainer1)
End Sub 'InitializeComponent
End Class 'Form1
(2)允许用户移动工具栏元素
默认情况下,ToolStrip的AllowReorder属性设置为False。如果把它设为True,工具栏中的元素可以改变它们相对于其它元素的位置(重新排序)。
把ToolStrip的AllowReorder属性设置为True,然后再次运行程序,按住Alt键,拖动控件中的元素,放开鼠标键后,元素将被放置在新的位置。
(3)创建标准的工具栏元素集合
如果要创建一个包含通用元素(剪切、复制、粘贴等)的工具栏,我们不需要自己创建这些元素,而可以使用设计器自动完成。
10、菜单
MenuStrip或ContextMenuStrip都是ToolStrip的子类,因此前面学习的ToolStrip功能也适用于MenuStrip 和ContextMenuStrip。由于它们是菜单,因此添加条目最常用的方法是,突出显示控件,并在出现的菜单设计器中直接输入它们。
(1)给菜单添加标准元素
(2)图标与复选标记
每个菜单项都有一个Image属性。把这个属性指向某个图像后,该图像会出现在菜单选项所对应的文字的左边。
可以在菜单项的旁边显示复选标记,只要把它的Checked属性改为True即可。
(3)关联菜单
为了给窗体或者窗体上的控件实现关联菜单功能,应给窗体添加一个ContextMenuStrip控件并添加菜单选项。
ContextMenuStrip菜单控件的ContextMenuStrip属性可以把关联菜单与某个控件绑定在一起。之后,运行应用程序时,在控件上单击鼠标右键,就会弹出关联菜单。
(4)在运行时动态管理菜单
参考:
ToolStripMenuItem类
表示MenuStrip或ContextMenuStrip上显示的可选选项。虽然ToolStripMenuItem对以前版本的MenuItem控件的功能进行了替换和添加,但考虑到向后兼容和将来的使用(如果选择),仍然保留了MenuItem。
ToolStripMenuItem是一个ToolStripDropDownItem,与ToolStripDropDownMenu和ContextMenuStrip一起工作,以便为菜单处理特殊的突出显示、布局和列排列方式。
为了显示ToolStripMenuItem,必须将其添加到MenuStrip或ContextMenuStrip。
ToolStripMenuItem类提供使您得以配置菜单项的外观和功能的属性。若要显示菜单项旁边的选中标记,请使用Checked属性。使用此功能可以标识在互斥的菜单项列表中选定的菜单项。使用ShortcutKeys属性可以定义组合键。
11、通用对话框
这些对话框不能显示为非模态,它们使用ShowDialog方法显示为模态。这个方法返回一个标准DialogResult值。
(1)OpenFileDialog和SaveFileDialog控件
除了显示给用户时出现在实际对话框中的按钮和标签不同,本质上它们是相同的。
属性 | 说明 |
InitialDirectory | 定义对话框打开时所显示的初始位置,例如: OpenFileDialog1.InitialDirectory=”C:\Program Files” |
Filter | 用来定义文件类型列表的字符串。通过“|”字符来分隔每一项。输入的项分为两部分,一部分是对文件类型的描述,另一部分是文件通配符。例如: OpenFileDialog1.Filter=”All Files|*.*|Text Files|*.txt|Rich Text Files|*.rtf” |
FilterIndex | 整数值,指定打开对话框时所使用的默认过滤器项。例如,使用上述的过滤器设置,可以使用下面的方法默认打开文本文件:OpenFileDialog1.FilterIndex=2 |
RestoreDirectory | 布尔值,如果为True,将使系统的默认目录恢复为对话框第一次打开时的位置。默认值为False |
Filename | 保存用户选择的文件的全名称,包括路径 |
ShowDialog | 显示对话框 |
下面的代码会打开一个标准对话框,要求用户选择一个当前系统中存在的文件,并在消息框中显示返回的选择结果。
(2)ColorDialog控件
属性 | 注释 |
Color | 用户选择的System.Drawing.Color。当用户打开对话框时,它也能用来设置最初选择的颜色 |
AllowFullOpen | 布尔值。如果为True,允许用户选择任何颜色;如果为False,用户只能从默认颜色集中进行选择 |
ShowDialog | 显示对话框 |
(3)FontDialog控件
属性 | 注释 |
Font | 用户选择的System.Drawing.Font,也可以用来设置最初的字体 |
ShowEffects | 布尔值,如果为True,将在对话框中显示文本的下划线和删除线的效果选项 |
ShowColor | 布尔值,如果为True,将在对话框中显示字体颜色组合框,要想使该设置有效,必须将ShowEffects属性设置为True |
FixedPitchOnly | 布尔值,如果为True,将限制字体选择的列表,只留下固定字符间距的选项 |
ShowDialog | 显示对话框 |
![image image](https://i-blog.csdnimg.cn/blog_migrate/b73fe082c8e8bca60bff7ee8e9005f0f.jpeg)
(4)PrinterDialog控件
有3个较常用的对话框控件,即PrintDialog、PrintPreviewDialog和PageSetupDialog。它们都用于将文件输出到打印机。可以将它们与PrintDocument组件联合使用,以执行和控制打印作业。
参考:
PrintDialog组件
Windows窗体PrintDialog控件是一个预先配置的对话框,可在基于Windows的应用程序中用于选择打印机、选择要打印的页以及确定其他 与打印相关的设置。将该控件用作选择打印机和打印相关设置的简单解决方案,而不用配置您自己的对话框。可使用户能够打印文档的很多部分:全部打印、打印选 定的页范围或打印选定内容。利用标准的Windows对话框,您可以创建其基本功能可立即为用户所熟悉的应用程序。PrintDialog组件从 CommonDialog类继承
可使用ShowDialog方法在运行时显示对话框。此组件具有与单个打印作业(PrintDocument类)或个别打印机的设置(PrinterSettings类)相关的属性。这两类属性反过来可由多个打印机共享。
PrintDocument组件
Windows窗体PrintDocument组件用于设置一些属性,这些属性说明在基于Windows的应用程序中要打印什么内容以及打印文档的能力。可将它与PrintDialog组件一起使用来控制文档打印的各个方面。
涉及PrintDocument组件的两种主要情况是:
- 简单的打印作业,如打印单个文本文件。在这种情况下,应将PrintDocument组件添加到Windows窗体,然后再PrintPage事件处理程 序中添加打印文件的编程逻辑。该编程逻辑应以使用Print方法打印文档结束。此方法向打印机发送一个Graphics对象,该对象包含在 PrintPageEventArgs类的Graphics属性中。
- 更为复杂的打印作业,如想要重新使用已编写的打印逻辑的情况。在这种情况下,应从PrintDocument组件派生一个新组件,并重写PrintPage事件。
Imports System
Imports System.Drawing
Imports System.IO
Imports System.Drawing.Printing
Imports System.Windows.Forms
Public Class Form1
Inherits Form
Private printButton As Button
Private printDocument1 As New PrintDocument()
Private stringToPrint As String
Public Sub New()
Me.printButton = New System.Windows.Forms.Button()
Me.printButton.Location = New System.Drawing.Point(12, 51)
Me.printButton.Size = New System.Drawing.Size(75, 23)
Me.printButton.Text = "Print"
Me.ClientSize = New System.Drawing.Size(292, 266)
End Sub
Private Sub ReadFile()
Dim docName As String = "testPage.txt"
Dim docPath As String = "c:\"
printDocument1.DocumentName = docName
Dim stream As New FileStream(docPath + docName, FileMode.Open)
Try
Dim reader As New StreamReader(stream)
Try
stringToPrint = reader.ReadToEnd()
Finally
reader.Dispose()
End Try
Finally
stream.Dispose()
End Try
End Sub
Private Sub printDocument1_PrintPage(ByVal sender As Object, _
ByVal e As PrintPageEventArgs)
Dim charactersOnPage As Integer = 0
Dim linesPerPage As Integer = 0
' Sets the value of charactersOnPage to the number of characters
' of stringToPrint that will fit within the bounds of the page.
e.Graphics.MeasureString(stringToPrint, Me.Font, e.MarginBounds.Size, _
StringFormat.GenericTypographic, charactersOnPage, linesPerPage)
' Draws the string within the bounds of the page
e.Graphics.DrawString(stringToPrint, Me.Font, Brushes.Black, _
e.MarginBounds, StringFormat.GenericTypographic)
' Remove the portion of the string that has been printed.
stringToPrint = stringToPrint.Substring(charactersOnPage)
' Check to see if more pages are to be printed.
e.HasMorePages = stringToPrint.Length > 0
End Sub
Private Sub printButton_Click(ByVal sender As Object, ByVal e As EventArgs)
ReadFile()
printDocument1.Print()
End Sub
<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(False)
Application.Run(New Form1())
End Sub
End Class
PrintPreviewDialog控件
Windows窗体PrintPreviewDialog控件是预先配置的对话框,用于显示PrintDocument在打印时的外观。可在基于 Windows的应用程序中使用它作为简单的解决方案,而不用配置自己的对话框。该控件包含打印、放大、显示一页或多页和关闭此对话框的按钮。
该控件的主要属性是Document,用于设置要预览的文档。文档必须是PrintDocument对象。若要显示对话框,必须调用它的 ShowDialog方法。抗锯齿可使文字显得更齐整平滑,但也会使显示更慢;若要使用它,请将UseAntiAlias属性设置为true。
PageSetupDialog组件
Windows窗体PageSetupDialog组件是一个预先配置的对话框,用于在基于Windows的应用程序中设置页详细信息以便打印。在基于 Windows的应用程序中将该组件用作用户设置页首选项的简单解决方案,而不用配置您自己的对话框。可允许用户设置边框和边距调整量、页眉和页脚以及纵 向或横向打印。利用标准的Windows对话框,您可以创建其基本功能可立即为用户熟悉的应用程序。
可使用ShowDialog方法在运行时显示对话框。此组件具有与单页(PrintDocument类)或任何文档(PageSettings类)相关的 可设置属性。此外,PageSetupDialog组件可用于确定特定的打印机设置,这些设置存储在PrinterSettings类中。
12、拖放操作
在.NET Framework中,拖放操作是通过一组事件来实现的。通常,它开始于一个控件的MouseDown事件,终止于另一个控件的DragDrop事件。
进行拖放操作的第一步,是指定控件是否接受“放”操作。默认情况下,所有的控件都拒绝这种行为,对于用户将某些对象拖放到它们上面的任何尝试,不会做出响应。在例子中,我们将第二个列表框的AllowDrop属性设置为True。
下一步是调用拖放操作。使用DoDragDrop方法(但不限于这么做),在包含了要拖动数据的控件的MouseDown事件中进行。DoDragDrop方法定义了要拖动的数据和拖动的类型。在本例中将拖动所选列表框项的文本,允许对数据执行移动和复制操作。
为ListBox1的MouseDown事件添加如下代码:
现在调用DoDragDrop方法,作为开始的一步。
下一步将涉及数据的接收器,这里有两个事件将被重点监控——DragEnter和DragDrop事件。
当用户第一次将鼠标指针移动到接收器控件的上方时,会触发DragEnter事件。DragEnter事件有一个DragEventArgs类型的参数,包含了Effect属性和KeyState属性。
Effect属性可为用户设置下拉图标的显示,以表明释放鼠标按钮时是进行移动还是复制。KeyState属性可用来测定Ctrl、Alt和Shift键 的状态。Windows的标准是,当移动或复制时,按下Ctrl键表示复制。因而,在该事件中将检验KeyState属性的值,使用它来决定如何设置 Effect属性。
为ListBox2的DragEnter事件添加如下代码:
注意,如果需要,也可以使用DragOver事件。但是,当鼠标指针移动到目标控件上方时,该事件将连续触发。在这种情况下,只需要捕获鼠标指针刚刚移动到控件上方时触发的事件即可。
拖放操作的最后一步就是用户松开鼠标按钮,将数据放在目标位置。这可以通过DragDrop事件来捕获。参数包含一个保存拖动数据的属性。将拖动的数据放在接收器控件中是一个简单的过程,代码如下:
最后一步——如果拖放操作是一个移动操作,不能忘了处理ListBox1.这里将填充留在ListBox1的MouseDown事件中的空白。只要触发了 DragDrop事件,过程的初次调用将返回一个结果,用于说明最终发生的事情。返回ListBox1_MouseDown事件,如果是移动数据项(不是 简单的复制),就修改该事件的代码,从ListBox1中删除数据项,如下所示:
13、标准Windows窗体控件小结
(1)Button
- VB6及以前版本称为CommandButton。
- 现在用Text属性代替了Caption属性。
- 现在能够同时显示图标和文本。用Image属性(代替了Picture属性)来设置图像,用ImageAlign属性(left、right、center等)来设置图像的位置。
- 能够使用TextAlign属性来对齐按钮上的文本。
- 现在能够使用FlatStyle属性,使控件具有不同的外观。
- 不再拥有Default和Cancel属性。它们的功能现在可以由窗体自身通过使用AcceptButton和CancelButton属性来完成。
(2)CheckBox
- 现在使用Text属性代替Caption属性。
- 现在使用Appearance属性,使控件以一个触发器按钮的形式出现。
- 现在使用CheckAlign和TextAlign属性,能够将CheckBox和文本放在一个定义的区域中。
- 使用CheckState属性代替了Value。
- 用FlatStyle属性控制复选框的外观。
(3)CheckedListBox
列表框的每个列表项旁边都有复选框。
(4)ComboBox
- 与新的ListBox控件相同,现在能够保存一个对象的集合,而不是字符串数组。
- 现在拥有一个MaxDropDownItems属性,用于指定打开列表时显示多少个列表项。
(5)DateTimePicker
就是以前的DTPicker。
(6)DomainUpDown
- 列表框的单行版本。
- 能够保存一个对象集合,显示集合中一个数据项的ToString结果。
- 使用Wrap属性能够包含整个列表,产生连续翻屏的效果。
(7)HScrollBar
没有变化。
(8)ImageList
除了对列表中用于管理图像的窗口进行了改进外,与以前的版本相同。MaskColor属性现在是TransparentColor属性。
(9)Label
- 本质上与以前的版本相同。
- Caption属性现在是Text属性。
- 现在能够显示图像和文本。
- 可以自动调整大小。把AutoSize属性设置为True,可以自动设置水平尺寸(这是该属性的默认值)。
- TextAlign属性尤其有用。文本框旁边的标签文本在VB6中总是比文本框中的文本高几个像素。现在可以设置标签的TextAlign属性,将垂直对齐设为Middle,就解决了这个问题。
- 现在能够指定是否解释助记符号(如果UseMnemonic是True,Text属性的第一个“&”符号将表示给第一个字符加上下划线,并相应Alt快捷键,按照Tab顺序将焦点放在下一个像文本框这样能够拥有焦点的控件)。
(10)LinkLabel
与Label相同,但是行为类似于一个超链接,拥有像LinkBehavior(例如,HoverUnderline)、LinkColor和ActiveLinkColor这样的附加属性。
(11)ListBox
- 列表框现在能够保存一个对象集合,而不是原来的字符串数组。使用DisplayMember属性来指定列表中显示对象的什么属性,使用ValueMember属性指定对象的什么属性能够用作列表项的值。
- 不能再使用Style属性设置复选框的显示,使用CheckedListBox控件来代替。
(12)ListView
- 同VB6版本的功能相同,但是提供了一个改进的属性编辑器,允许在设计时定义ListView数据项集合和它的子数据项。
- 子数据项能够拥有自己的字体显示属性。
- 用新增的HeaderStyle属性来代替HideColumnHeaders属性。
(13)MonthCalendar
以前的MonthView。
(14)NotifyIcon
- 在系统面板中提供一个图标。
- 通过控件的Text属性来设置图标的工具提示。
- 使用ContextMenu控件来设置弹出菜单。
(15)NumericUpDown
显示一个数字和一组上/下按钮的单行文本框,单击上/下按钮能够增/减数字的值。
(16)PictureBox
- Image属性用于定义图形的显示,代替了原来的Picture属性。
- 使用SizeMode属性来自动伸展或居中画面。
(17)ProgressBar
现在拥有的Step方法能够根据在Step属性中定义的数量,自动增长进度条的数值。
(18)RadioButton
- 以前的OptionButton。
- 使用Checked属性来指定数值(以前是用Value属性)。
- 使用CheckAlign和TextAlign属性来指定单选按钮和文本出现在相关控件区域的什么位置。
(19)RichTextBox
- 有几个新属性,例如ZoomFactor、WordWrap、DetectURL和AutoWordSelection。
- 使用Lines数组来得到或设置控件的各行文本。
(20)TabControl
- 以前的TabStrip控件。
- 现在拥有一个TabPage对象的TabPages集合。TabPage对象是Panel控件的一个子类,专用在TabControl控件中。
- 如果需要,可以使用Appearance属性将选项卡显示为按钮(以前用TabStrip控件的Style属性)。
(21)TextBox
- 现在拥有CharacterCasing属性能够自动调整文本,按大写或小写格式输入。
- 现在ReadOnly属性用于防止编辑文本,过去使用Locked属性来完成(Locked属性现在用于决定控件是否能够移动或缩放)。
- 现在拥有了Cut、Copy、Paste、Undo和ClearUndo方法。
(22)Timer
- 本质上与以前的版本相同。
- 现在在默认情况下禁用Timer控件。
- 不能通过时间间隔为0来禁用它。
(23)TrackBar
原来的Slider控件,本质上没有变化。
(24)TreeView
除了新增的Node Tree Editor允许对树进行可视化设计以外,与VB6中的该控件具有相同的功能。
(25)VScrollBar
没有变化
14、已撤销的控件
下面的列表概述了一些存在于VB6中但是在Windows窗体中已经不存在的控件,以及如何再现它们的功能:
(1)Spinner
使用DomainUpDown或NumericUpDown控件。
(2)Line和Shape
- Windows窗体没有Line或Shape控件,也没有任何直接的等价控件。绘制水平线或垂直线的另一个简易方法是使用Label控件。将Label控件的背景色设置为所需线的颜色,然后将Size.Height或Size.Width的值设置为1.
- 斜线和形状必须使用GDI+图形方法来绘制。
(3)DirListBox、FileListBox、DriveListBox
这些控件的典型用法是创建与Windows Explorer类似的文件系统浏览器。Windows窗体中没有等价的控件。使用OpenFileDialog和SaveFileDialog可以满足大多数情况的需要。
(4)Image
使用PictureBox控件。
15、处理相关控件组
在Windows Forms 2.0不支持控件数组。.NET显著改进了事件处理的控制,很容易把多个控件的事件关联到一个处理程序上。
要使用一个方法处理多个控件的事件,必须把这些控件的事件关联到处理程序上。为此可以在Handles子句中指定多个控件,或者给每个控件使用AddHandler。除非控件可以随时添加到窗体上,否则在Handles子句中使用更多的控件通常是最理想的。
其中没有VB6中旧样式的控件数组所使用的Index属性,而使用事件处理程序的Sender参数,来确定哪个控件启动了事件。
16、在运行时添加控件
其他编程技巧
- 将焦点切换到一个控件:使用.Focus方法。
- 快速确定容器控件或父窗体:使用组合框和面板,控件常常被包含了多次。现在能够使用FindForm方法迅速引用窗体。使用GetContainerControl方法访问控件最直接的父窗体。
- 遍历Tab顺序:使用任何控件的GetNextControl方法,可以按照Tab顺序引用窗体的下一个控件。
- 将客户坐标转换为屏幕坐标(或将屏幕坐标转换回客户坐标):想知道控件的屏幕坐标是什么吗?使用PointToScreen方法。使用PointToClient可以将屏幕坐标转换回客户坐标。
- 在运行时改变控件的Z-Order:现在,控件拥有BringToFront和SendToBack两个方法。
- 鼠标指针的位置:现在控件类有一个MousePosition属性,用于返回鼠标指针的屏幕坐标。
- 管理子控件:像组合框或面板这样的容器控件可以使用HasChildren属性和Controls集合,来分别确定子控件的存在性和直接引用。
- 最大化、最小化和还原窗体:使用窗体的WindowState属性。