C# 系统应用之无标题窗体移动的两种方法

在做项目界面设计中,常常为了美观需要设置窗体属性"FormBorderStyle"(窗体边框和标题栏外观)为None无标题窗口.此时隐藏标题的窗口怎样实现移动呢?我根据自己的项目从自己完成的两种方法进行讲解.

一.MouseDown\MouseMove事件方法实现

第一种方法我采用常用的根据MouseDown、MouseMove、MouseUp、MouseLeave事件中鼠标移动的距离,窗体坐标也跟着移动的方法.具体代码如下:

bool formMove = false;       //是否开始移动
int currentXPosition = 0;    //当前鼠标X坐标
int currentYPosition = 0;    //当前鼠标Y坐标

//函数:鼠标按下
private void WelcomeWindow_MouseDown(object sender, MouseEventArgs e)
{
    formMove = true;                       //鼠标按下开始移动
    currentXPosition = MousePosition.X;    //鼠标的X坐标为当前窗体左上角X坐标
    currentYPosition = MousePosition.Y;    //鼠标的Y坐标为当前窗体的左上角Y坐标
}
//函数:鼠标移动
private void WelcomeWindow_MouseMove(object sender, MouseEventArgs e)
{
    if (formMove)
    {
        //鼠标xy坐标确定窗体XY坐标 鼠标移动XY距离
        this.Left += MousePosition.X - currentXPosition;
        this.Top += MousePosition.Y - currentYPosition;
        //鼠标当前位置赋值
        currentXPosition = MousePosition.X;
        currentYPosition = MousePosition.Y;
    }
}
//函数:鼠标松开
private void WelcomeWindow_MouseUp(object sender, MouseEventArgs e)
{
    formMove = false;     //停止移动
}
//函数:鼠标离开
private void WelcomeWindow_MouseLeave(object sender, EventArgs e)
{
    //初始状态
    currentXPosition = 0;
    currentYPosition = 0;
    formMove = false;
}

同时有的设置变量Point formPoint通过Offset和Location变换位置亦类似.但是第一种方法可能由于每次获取鼠标坐标,移动时如果鼠标不在窗口位置会产生窗体总是向屏幕外移动的现象,因此推荐第二种调用API函数的方法.

二.调用API函数实现

第二种方法是采用API函数ReleaseCapture和SendMessage来实现的,ReleaseCapture函数从当前线程中窗口释放鼠标捕获,SendMessage函数的作用是调用一个窗口的窗口函数,将一条消息命令发给那个窗口.
SendMessage(
IntPtr hwnd,   //要接收消息的那个窗口的句柄
int wMsg,       //消息的标识符
int wParam,   //具体取决于发送的消息
int lParam      //具体取决于发送的消息
)
其中调用API函数需要引用命名空间System.Runtime.InteropServices.代码中WM_SYSCOMMAND常量代表要向窗口发送消息,SC_MOVE常代表要向窗口发送移动的消息.代码如下:

#region 鼠标移动操作
//该函数从当前线程中窗口释放鼠标捕获
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();

//发送消息移动窗体
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;    //向窗口发送消息
public const int SC_MOVE = 0xF010;          //向窗口发送移动的消息
public const int HTCAPTION = 0x0002;

//鼠标位于窗体(底部位置)按下移动操作
private void EMSecure_MouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
#endregion

其中,EMSecure是对话框Form,当鼠标点击到图片或控件Panel时不会响应移动,所以对需要移动的控件也响应该API函数即可.如我的程序界面Panel1位于窗体顶部,故也响应该移动事件,即panel1_MouseDown(object sender, MouseEventArgs e).运行结果如下图所示,红色部分可以实现移动(顶部为Panel控件):

提示如果是WPF可以响应Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){this.DragMove();}实现窗体移动.最后希望该文章对大家有所帮助,如果有错误或不足之处,请海涵.
(By:Eastmount 2014-3-7 夜2点 原创:http://blog.csdn.net/eastmount)

时间: 2024-10-08 19:10:35

C# 系统应用之无标题窗体移动的两种方法的相关文章

Win7系统提示ipv6无网络访问权限的两种原因及解决方法

Win7系统提示ipv6无网络访问权限,导致无法上网,这该如何解决呢?ipv6无网络访问权限的原因有很多种,针对此问题,下面教大家解决ipv6无网络访问权限的问题,大家一起来看看吧. 故障原因分析: 1.Internet选项设置不正确: 2.网络及相关服务配置不正确. 那么如何判断是那个原因,首先查看网络"属性",点击"本地连接",查看网络连接状态,窗口中会提示网络的状态,分别是IPV4和IPV6的状态: 3.如果提示"IPV6,IPV4都无法连接到网络,

windows7系统无法开启DHCP Client服务的解决两种方法

  今天小编和大家分享windows7系统开启DHCP Client服务的两种方法,DHCP的作用在于集中的管理和分配IP地址,而且可以提升地址的使用率.使用路由器的用户必须开启DHCP Client服务,不然无法获取IP地址上网.最近有windows7系统无法开启DHCP Client服务,导致无法上网,怎么办?由于DHCP服务和"WinHTTP Web Proxy Auto-Discovery Service"服务存在依赖关系,一般无法开启的话是依存服务出错导致的.下面小编介绍两种

提高win8系统打开文件夹速度的两种方法

  提高win8系统打开文件夹速度的两种方法           原因分析 如果电脑没有安装第三方防护软件,Win8/Win8.1系统自带的Windows Defender处于默认开启状态.这导致扫描文件时会占用大量的系统资源并造成打开文件夹慢,半天无响应问题;如果安装有其他防护软件,Windows Defender应该会自动关闭. 办法一:关闭Windows Defender 在Win8/win8.1桌面下,将鼠标悬停在任务栏右上角或右下角,弹出竖条菜单,点击"设置"→"控

判断窗体是否打开的两种方法

判断窗体是否打开的两种方法 Function IsLoaded(strName As String, Optional intObjectType As Integer = acForm) IsLoaded = (SysCmd(acSysCmdGetObjectState, intObjectType, strName) <> 0) End Function 函数二 Function IsFormLoaded(strFrmName As String) As Boolean Const con

卸载360系统急救箱的两种方法

  卸载360系统急救箱的两种方法          方法一: 360系统急救箱 打开注册表依次展开"HEKY LOCAL MACHINE""SOFTWARE""MICROSOFT""WINDOWS""CURRENTVERSION""UNINSTALL",单击其下的程序名,你会在右边窗口的列表中看到两个选项,DISPLAYNAME表明了该程序的名称,UNINSTALL表明了该程序的卸载,

Win8系统关闭软盘驱动器的两种方法

  Win8系统关闭软盘驱动器的两种方法          一.在BIOS中关闭软驱 1.在电脑开机的时候一直在键盘按DELETE键进入BIOS界面; 2.然后打开standard coms features,接着用键盘上面的方向键选择到Drive A,之后回车,选择"NONE"(关闭)或者"DISABLE",然后回车; 3.最后在键盘按下F10保存一下即可了. 二.在设备管理器中禁用软驱 打开计算机管理界面,找到软盘控制器,右键选项并禁用"软盘驱动器&q

win8.1系统更改屏幕分辨率的两种方法

win8.1系统更改屏幕分辨率的两种方法          方法一: 1.在桌面上右键单击,选择屏幕分辨率即可. 方法二: 1.使用鼠标,移动到屏幕右上角,选择"设置"; 2.点击设置后,选择"更改电脑设置"; 3.在左侧选择"电脑和设置"; 4.在"显示"中,可以调试分辨率.

XP系统经常提示“应用程序正在运行”的两种解决方案

XP系统经常提示"应用程序正在运行"的两种解决方案 原因一:输入法出现问题 打开"任务管理器",就会发现每次打开IE都会多运行一个ctfmon.exe进程,当把任务栏多出来的ctfmon.exe进程删掉的时候,在打开连接还是一样会再多出来一个ctfmon.exe进程. 解决方案一: 1.打开 控制面板-区域和语言选项-语言-详细信息-高级-把兼容配置下的"将高级文字服务支持应用于所有程序"选中-重启,即可解决问题; 2.借助第三方修复工具来修复c

win7系统隐藏qq图标的两种方法

  win7系统隐藏qq图标的两种方法          具体方法如下: 一.半隐藏法 1.这种方法是利用系统隐藏QQ的!右键电脑底部任务栏,点击属性; 2.点开属性设置,找到通知区域,点开自定义; 3.我们会看到QQ旁边有三个选项,我们选择中间一个就可以将QQ隐藏了.当然我们也可以根据实际情况来选择!怕接收不到消息的话,可以选择仅显示通知; 4.设置好了之后,我们在到桌面右下角,就看到不QQ图标了,我们要点击展开所有图标按钮才能找到.这样半隐藏图标就弄好了; 二.完全隐藏法 1.是利用QQ软件