创建非矩形窗体的过程有两个要素:创建成形的窗体,并编写某些编程逻辑的代码以允许移动和关闭窗体。 第二个步骤是必要的,因为自定义形状的窗体没有标题栏,并且它本身不具有任何功能,例如在屏幕中移动窗体以及关闭窗体的能力。 因此,编写重现这些功能的代码是非常必要的。
创建非矩形窗体的过程包含三个步骤:
1.创建一个作为窗体图面的位图。 (一种有效的方式是,您可以从矩形中“裁剪掉”所需的窗体形状。)
2.创建 Windows 应用程序项目,将其属性设置为移除标题栏并使用位图作为窗体背景。
3.输入重新创建标题栏所提供功能的代码,例如移动和关闭窗体。
窗口属性设置:
- 将 FormBorderStyle 属性设置为 None。此属性从窗体中移除标题栏。 (它同时移除标题栏所提供的功能,包括关闭和移动窗体的能力。 不过,以下代码中解决了这种不足。)
- 将窗体的 BackgroundImage 属性设置为先前创建的位图文件。 不必将文件添加到项目系统中;这将在指定该文件作为背景图像时自动完成。此属性将该位图图像设置为窗体的背景。 (当与以下指定的 TransparencyKey 属性前后使用时,此属性将定义窗体的形状。)
3.将 TransparencyKey 属性设置为位图文件的背景色。
此属性告诉应用程序窗体中的哪些部分需要设置为透明。
编写关闭窗体的代码:
1.将一个 Button 控件添加到窗体中。
2.添加代码,使用户可通过调用 Close 方法关闭该窗体。
private void button1_Click(object sender, System.EventArgs e)
{
this.Close();
}
编写移动窗体的代码(可选):
1.创建一个在拖动窗体时使窗体移动的过程。 输入类似于下文显示的代码来创建新的 Point 对象。 这将作为计算如何移动窗体时的变量。 isMouseDown 字段用于跟踪用户是否按下了鼠标按钮。 该窗体应只在用户按下鼠标按钮时才移动。
private Point mouseOffset;
private bool isMouseDown = false;
2.为窗体的 MouseDown 事件创建一个事件处理程序。 在处理程序中添加代码,使用户可以在窗体上的任意位置单击以拖动窗体。
输入类似于下文显示的代码,以根据鼠标指针的当前位置,将坐标分配给mouseOffset 变量。 在以下代码中,请注意偏移位置是使用有关边框大小 (FrameBorderSize.Width) 和标题栏高度 (CaptionHeight) 的系统信息进行计算的。 在测试偏移位置时必须考虑这些因素,因为某些测量结果是使用工作区得出的,而另一些测量结果是使用屏幕坐标得出的。 因此,偏移位置等于边框宽度加上标题高度,再加上窗体工作区的偏移位置。
private void Form1_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
{
int xOffset;
int yOffset;
if (e.Button == MouseButtons.Left)
{
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.Y - SystemInformation.CaptionHeight -
SystemInformation.FrameBorderSize.Height;
mouseOffset = new Point(xOffset, yOffset);
isMouseDown = true;
}
}
3.为窗体的 MouseMove 事件创建一个事件处理程序。
输入类似以下内容的代码。 单击鼠标左键并且拖动鼠标时,窗体的 Location 属性将设置为新的位置。
private void Form1_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)
{
if (isMouseDown)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouseOffset.X, mouseOffset.Y);
Location = mousePos;
}
}
4.为窗体的 MouseUp 事件创建一个事件处理程序。 输入类似以下内容的代码。
private void Form1_MouseUp(object sender,System.Windows.Forms.MouseEventArgs e)
{
// Changes the isMouseDown field so that the form does
// not move unless the user is pressing the left mouse button.
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}
}
网友评论