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

标签: C# C#系统应用 API函数 窗体移动 无标题窗口
4106人阅读 评论(0) 收藏 举报
分类:

在做项目界面设计中,常常为了美观需要设置窗体属性"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)

查看评论

C#下如何实现无标题可拖动窗口

1。重写Wndproc using System; using System.Collections.Generic; using System.ComponentModel; using S...
  • yang_629
  • yang_629
  • 2011-12-14 18:12:29
  • 1057

WPF在隐藏标题栏以后实现拖动

重写OnMouseLeftButtonDown事件  protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)  ...
  • u011549779
  • u011549779
  • 2016-12-15 10:02:15
  • 709

WPF 进程通信、无标题栏的窗口移动、工作区尺寸

无标题栏的窗口移动:
  • zhang_7150
  • zhang_7150
  • 2014-06-13 15:46:25
  • 1272

C# 自定义窗体移动窗体的方法

一般在C# 编写窗体时,都需要自己编写窗体让软件更美观一点。一般窗体在隐藏任务栏后都不会移动了,所以要做一些移动处理。...
  • ash126
  • ash126
  • 2017-09-21 10:41:53
  • 92

C#操作移动其他程序窗口

在这里使用了Win32 API来做的。可以使用C#根据窗体的路径,启动一个进程,然后使用Win32 API控制打开窗口的位置和大小。 主要代码如下:    public class A {  ...
  • lvxiaoting
  • lvxiaoting
  • 2014-05-05 09:55:28
  • 479

无标题窗口的移动

姚佩云   在Delphi 编 程 中 有 时 要 对 无 标 题 窗 体 进 行 移 动, 以 下就 结 合 本 人 的 经 验 介 绍 几 种 对 无 标 题 窗 体 移 动 的 方 法。 ---...
  • soweb
  • soweb
  • 2007-07-30 23:00:00
  • 476

MFC:拖动无标题窗口的三种方法

有的时候,我们需要自绘窗口的标题,或者隐藏了窗口标题,那么问题来了,这就是怎么拖动无标题的窗口? 这个问题的本质便是怎么在窗口的客户区上,拖动鼠标,并且移动窗口。 通常状态下,一个窗口只有在标题栏的区...
  • greless
  • greless
  • 2017-02-20 18:52:08
  • 842

C# 在winform中隐藏或者去除c#的标题栏并实现窗体移动附代码

设置窗体的FormBorderStyle为None 不过要自己加上一些相应的操作代码了,不然窗口是不能进行拖动关闭之类的 #region 实现点击移动 internal stat...
  • C_S_D_N_USER
  • C_S_D_N_USER
  • 2015-04-18 11:33:26
  • 2973

c# 实现用鼠标拖动没有标题栏的窗口(窗体的任何部分都可实现拖动效果)

上面形式的窗体,实现窗体的任何部分都可
  • soft_123456
  • soft_123456
  • 2014-11-04 10:05:47
  • 1704

无标题栏窗口拖动的实现

普通的Windows应用程序窗口都具有统一的窗口风格,它们一般都包括:用户区和非用户区两部分。非用户区包括标题条、窗口边框、最大化按钮、最小化按钮、关闭按钮和系统默认的快捷键及鼠标支持等。利用鼠标的左...
  • ArduousBonze
  • ArduousBonze
  • 2007-05-15 00:06:00
  • 2629
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 253万+
    积分: 2万+
    排名: 398
    牛人博客
    博客专栏
    最新评论