1.13 窗体控制技术
本节主要介绍了如何动态创建窗体、在窗体关闭前加入提示信息以及任意控制窗体移动等相关技术,这些都是在实际开发中被广泛应用的技术。
实例044 在关闭窗口前加入确认对话框
实例说明
用户对程序进行操作时,难免会有错误操作的情况,例如不小心关闭程序,如果尚有许多资料没有保存,那么损失将非常严重,所以最好使程序具有灵活的交互性。人机交互过程一般都是通过对话框来实现的,对话框中有提示信息,并且提供按钮让用户选择,例如【是】或【否】。这样用户就能够对所做的动作进行确认。正如前面所说的不小心关闭程序,如果在关闭程序之前提示用户将要关闭程序,并且提供用户选择是否继续下去,这样就大大减少了误操作现象。本例程序中的窗口在关闭时会显示一个对话框,该对话框中有两个按钮【是】与【否】代表是否同意关闭程序操作。实例运行结果如图1.45所示。
技术要点
窗口正要关闭但是没有关闭之前会触发FormClosing事件,该事件中的参数FormClosingEventArgs e中包含Cancel属性,如果设置该属性为True,窗口将不会被关闭。所以在该事件处理代码中可以提示用户是否关闭程序,如果用户不想关闭程序,则设置该参数为True。利用MessageBox参数的返回值可以知道用户所选择的按钮。下面详细介绍一下相关属性。
CancelEventArgs.Cancel属性用来获取或设置指示是否应取消事件的值。该属性结构如下:
public bool Cancel { get; set; }
l 属性值:如果应取消事件,则为True;否则为False。
实现过程
(1)创建一个项目,将其命名为Ex01_44,默认窗体为Form1。
(2)主要程序代码。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("将要要关闭窗体,是否继续?", "询问", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
举一反三
根据本实例,读者可以实现以下程序。
使窗体的关闭按钮无效。
使窗体关闭出现在托盘中。
实例045 使用任意组件拖动窗体
实例说明
通常将鼠标按住窗口的标题栏才能够拖动窗口,但是,在没有窗口标题栏的情况下如何拖动窗体呢?本例将会利用窗口中的控件拖动窗口,将鼠标放在按钮上然后按住鼠标左键移动鼠标即可拖动窗体。实例效果如图1.46所示。
技术要点
通过控件移动窗体时,需要判断用户的鼠标动作。用户准备拖动窗体时必须在控件上按住鼠标左键,所以应该在鼠标MouseDown事件处理过程中来实现窗体的拖动。当用户在按钮上将鼠标左键按下时,触发MouseDown事件,在该事件处理代码中,MouseEventArgs e的Button属性记录了当前按下的鼠标按钮,如果按键是鼠标左键,则表示可以移动窗口,鼠标移动时,窗体就可以跟着移动了。
实现过程
(1)创建一个项目,将其命名为Ex01_45,默认窗体为Form1。
(2)在Form1窗体上添加两个Button控件,分别用来拖动窗体和关闭窗体。然后设置窗体的背景颜色。
(3)主要程序代码。
声明记录鼠标按下时初始位置的变量,具体代码如下:
private int startX, StartY;
鼠标按下事件处理代码,具体代码如下:
private void button1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
startX = e.X;
StartY = e.Y;
}
}
鼠标移动事件处理代码,具体代码如下:
private void button1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Left += e.X - startX;
this.Top += e.Y - StartY;
}
}
举一反三
根据本实例,读者可以开发以下程序。
可以用窗体的用户区拖动窗体。
不可以拖动的窗体。
实例046 修改提示字体及颜色
实例说明
如果设置了控件的ToolTip属性,当鼠标移到该控件后,会提示相关的文本,但没有提供对提示字体及颜色的设置属性,如何改变提示文本的样式和字体呢?本例可以设置提示文本的字体及颜色。运行本例,效果如图1.47所示。
技术要点
C# 2.0中提供了ToolTip控件,可以指定关联控件并为每个控件提供提示文本,其中ToolTipTitle属性指定文本提示盒中的文本。下面介绍相关的属性和方法。
(1)SetToolTip方法
使工具提示文本与指定的控件相关联。其语法结构如下:
public void SetToolTip (Control control,string caption)
参数说明如下。
l control:要将工具提示文本与其关联的Control。
l caption:指针位于控件上方时要显示的工具提示文本。
(2)ToolTip.ToolTipTitle属性
获取或设置工具提示窗口的标题。其语法结构如下:
public string ToolTipTitle { get; set; }
l 属性值:包含窗口标题的String。该标题在窗口中作为一行粗体文本显示在标准的工具提示控件说明文本的上方。通常,标题只用于区分窗体上不同类别的控件,或作为较长控件说明的简介。
实现过程
(1)创建一个项目,将其命名为Ex01_46,默认窗体为Form1。
(2)在Form1窗体上添加Button控件用来在其上方显示提示文本;添加ToolTip控件用来设计提示文本。
(3)主要程序代码。
设置提示文本,及提示文本的关联控件,具体代码如下:
private void Form1_Load(object sender, EventArgs e)
{
this.toolTip1.OwnerDraw = true;
this.toolTip1.SetToolTip(this.button1,"设置提示的字体及颜色");
this.toolTip1.Draw += new DrawToolTipEventHandler(toolTip1_Draw);
}
设置文本的提示样式,具体代码如下:
void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
{
// throw new Exception("The method or operation is not implemented.");
e.DrawBackground( );
e.DrawBorder( );
using (StringFormat sf = new StringFormat( ))
{
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.None;
sf.FormatFlags = StringFormatFlags.NoWrap;
using (Font f = new Font("宋体", 12))
{
e.Graphics.DrawString(e.ToolTipText, f,
SystemBrushes.ActiveCaptionText, e.Bounds, sf);
}
}
}
举一反三
根据本实例,读者可以实现以下功能。
修改任意控件提示文本的样式。
提示时加提示的声音。





