文档库 最新最全的文档下载
当前位置:文档库 › C#可拖动窗体

C#可拖动窗体

C#可拖动窗体
C#可拖动窗体

所谓“可拖动窗体”就是无需拖动标题栏就可以拖动的窗体,这在一个没有标题栏的窗体上是一种非常有用的技术。关于这一方面的技巧,网上已经有很多介绍,但都不是很详尽,有些实现也不够简洁。最主要的,这些介绍大多是大片大片的源代码,很少讲解;初学者学起来恐怕要费些力气(我在学习这个技巧的时候就很痛苦)。在这里,我对这个技巧进行了一个详细的讲解,相信各位初学者朋友可以学会如何制作可拖动窗体。

(注:本文期望的读者是那些有一定用C#开发Windows程序基础但暂时还不会制作可拖动窗体的朋友。)

首先,我们来复习一下一个Windows窗体的组成。请看这张图:

图1 Windows窗体构成

这是一个形式化的标准Windows窗体。首先,窗体的顶部是一个标题栏,其余的部分是窗体的主体,包围在窗体主体外围的是一个边框,边框内不就是我们放置控件或绘制图形的用户区。

图中还标明了各种窗体构造元素的尺寸的获得方法。对于用户区,System.Windows.Forms.Form提供了实例属性ClientSize,相信大家已经很熟悉了。而要想活棋一般性的窗体构造元素(如标题栏、边框等)的尺寸,我们可以使用.NET类库中提供的一个类:System.Windows.Forms.SystemInformation,这个类提供了一些静态属性如表示标题栏高度的CaptionHeight。有关SystemInformation类的信息可以在.NET SDK文档目录“.NET Framework SDK ->参考->类库-> System.Windows.Forms -> SystemInformation 类”处找到(注:这里的超链接只在您安装了.NET Framework 1.1简体中文版并且安装了配套文档时才有效)。这是一个很有用的类,希望大家能够记住它(可能您早就知道了,可我是才知道的-_-汗~~)。

接下来,我们来看看如何在在用户区拖动鼠标时移动窗体。请看下面这张图:

图2 窗体的移动

我们来观察鼠标在窗体内的位置和窗体的移动,很容易可以发现:在窗体被拖动的过程中,鼠标在窗体内的相对位置是始终不变的!那么,我们只要检测到鼠标在屏幕中的移动并修改窗体的位置就可以达到拖动窗体的目的!

我们知道,在鼠标消息/事件处理中,只能得到鼠标相对于窗体的位置。那么,如何知道鼠标在屏幕中的位置呢?这里又要提到一个类:System.Windows.Forms.Control类。也许你会很吃惊:这不是所有控件的基类么?呵呵~是这样di。不过,尽管是这样,Control类却没有像其他广泛使用的基类那样被声明为抽象类,而且它提供了一个静态属性:MousePosition,通过这个属性可以得到鼠标相对于屏幕的位置。有关Control类的信息可以在.NET Framework文档目录“.NET Framework SDK ->参考->类库-> System.Windows.Forms -> Control 类”处找到(注:这里的超链接只在您安装了.NET Framework 1.1简体中文版并且安装了配套文档时才有效)。

知道了如何获取这些信息之后,制作移动窗体实际上就成了一个很简单的问题了。基本过程是这样的:首先,在鼠标(左键或一个你喜欢的键)按下时,记录鼠标位置;由于在移动的过程中,鼠标的屏幕坐标发生变化但窗体相对坐标不变,我们可以推算出窗体位置的变化为(假设mousePosition具有System.Drawing.Point类型,表示鼠标在窗体中的相对坐标):

// 示例代码1

Form.Top = Control.MousePosition.Y - mousePosition.Y;

Form.Left = Control.MousePosition.X - mousePosition.X;

这样还不行,因为我们的mousePosition表示的是鼠标在窗体用户区内的相对坐标,但在移动窗体的时候还要考虑窗体标题栏和边框的尺寸。在上面的基础上,我们将代码修正为:

// 示例代码2

Form.Top = Control.MousePosition.Y - mousePosition.Y

- SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight;

Form.Left = Control.MousePosition.Y - mousePosition.Y

- SystemInformation.FrameBorderSize.Width;

也就是说,在高度上(纵坐标)要减去标题栏的高度和边框的高度,而在宽度上(横坐标)要减去边框的宽度。然而,当制作一个既没有标题栏也没有边框的可拖动窗体时,使用“示例代码1”所示的代码就可以了。

上面的代码只是一个示范性代码。具体的操作如下:

首先,为窗体添加一个私有域:

private System.Drawing.Point mousePoint;

然后,为窗体添加鼠标按下事件处理方法(我这里是MainForm_MouseDown,别忘了将该方法链接到MainForm.MouseDown事件,这不用多说了吧?):

private void MainForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {

if(e.Button == MouseButtons.Left) {

this.mousePosition.X = e.X;

this.mousePosition.Y = e.Y;

}

}

在这里注意对鼠标按键进行筛选。

接下来,为窗体添加鼠标移动事件处理方法(我这里是MainForm_MouseMove):

private void MainForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {

if(e.Button == MouseButtons.Left) {

Form.Top = Control.MousePosition.Y - mousePosition.Y

- SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight;

Form.Left = Control.MousePosition.Y - mousePosition.Y

- SystemInformation.FrameBorderSize.Width;

}

}

在Excel中如何制作用户登录窗口

在Excel中如何制作用户登录窗口 1、启动Excel并打开工作表,打开VisualBasic编辑器,在工 程资源管理器中鼠标右击,选择关联菜单中的“插入”|“用户窗体”命令插入一个用户窗体。按F4键打开“属性”对话框,在"Caption"文本框中输入文字“用户登录”更改窗体标题,如图1所示。 图1创建用户窗体并设置其属性 2、从“工具箱”对话框中分别选择“文本框”控件、“标签” 控件和“命令按钮”控件,在窗体中绘制这些控件,如图2所示。 在“属性”对话框中将两个“标签”控件的"Caption"属性分别设置 为“登录名”和“登录密码”,将“命令按钮”控件的"Caption"属 性分别设置为“确定”和“取消”,如图3所示。 图2向窗体中添加控件 图3修改控件的 3、在窗体中选择第二个“文本框”控件,在“属性”对话框中将"PasswordChar"属性设置为字符“*”,如图4所示。这样,在该 文本框中输入的字符将被“*”替代。 图4更改“文本框”控件的 4、鼠标右击窗体中的“确定”按钮,选择关联菜单中的“查看 代码”命令打开“代码”窗口,此时VisualBasic编辑器将自动在“代码”窗口中为控件添加Click事件。为该按钮添加的Click事 件程序如下: PrivateSubCommandButton1_Click() IfTextBox1.Text<>"郭轶凡"Then'判断用户名是否正确 MsgBox"用户登录名错误,您无权登录!"'不正确给出提示

WithTextBox1 .SelStart=0'设置选择文字的开始字符 .SelLength=Len(TextBox1.Text)'设置选择文本的长度 .SetFocus'文本框获得焦点 EndWith ElseIfTextBox2.Text<>"abcdef"Then'如果密码错误 MsgBox"密码输入错误,请重新输入!"'给出提示 WithTextBox2 .SelStart=0'设置选择文本的开始字符 .SelLength=Len(TextBox2.Text)'设置选择文本的长度 .SetFocus'获得焦点 EndWith Else MsgBox"登录成功,欢迎你的到来!"'登录成功提示 UnloadMe'卸载窗体 EndIf EndSub 提示 在这里,程序首先判断第一个文本框的Text属性值是否为设定的用户名,如果不是则给出提示,同时使用With结构设置非常关键的SelStart属性和SelLength属性,使文本框中的文字能够高亮显示。同时,使用SetFocus方法使文本框获得焦点以方便用户更改用户名。如果输入的是设定的用户名,程序接着判断第二个文本框中

经典登录界面制作

经典登录界面制作 声明本登录使用jsp编写,可在MyEclipse8.5等软件中执行 1.登录界面图: 2.登录代码 Login.jsp <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="fmt" uri="https://www.wendangku.net/doc/8e17930266.html,/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="https://www.wendangku.net/doc/8e17930266.html,/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>