关闭

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

标签: C#C#系统应用API函数窗体移动无标题窗口
3968人阅读 评论(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)

1
0
查看评论

C#实现无边框窗体拖动

1 2
  • CLeopard
  • CLeopard
  • 2014-08-28 17:03
  • 4074

C#中拖拽窗体实现移动演示

  • 2011-10-26 10:07
  • 43KB
  • 下载

C#实现窗体移动

//最近在自学C#,要实现无标题窗体移动。//实现窗体移动        private bool isMouseDown = false;        pr...
  • fsfree
  • fsfree
  • 2008-04-22 19:02
  • 919

C#去边框以及无边框窗体移动

1.去边框  : 1) 选中要去除边框的窗体,按F4调出窗体属性。 2)在属性框中找到FormBorderStyle选择none。 去边框之前效果 去边框之后效果 2.去掉边框后实现对窗口程序的拖动 1)双击窗体,进入程序设计界面 添加  using Syst...
  • LPVeneno
  • LPVeneno
  • 2016-12-07 16:12
  • 6506

C#winform窗体中如何点击移动某个控件来移动窗体

当我们把窗体设成无边框的时候,这个时候我们该怎么样去移动窗体呢,
  • lutaoquan
  • lutaoquan
  • 2014-08-11 09:42
  • 626

C# 无边框窗体 移动 两种方法

转载自:http://blog.sina.com.cn/s/blog_6b7c38030100xx17.html 网上和书上大致有两种方法,各有长短吧。 一种是使用Windows API: //需添加using System.Runtime.InteropServices; ...
  • u012377333
  • u012377333
  • 2016-08-25 13:47
  • 701

C# winform实现鼠标左键拖动窗体

public partial class Form1 : Form     {         public Form1()      ...
  • haoxiang110
  • haoxiang110
  • 2015-01-26 17:21
  • 5247

WinForm 无边框窗体 拖动工作区移动窗体

今天朋友问我这个问题 在网上找了一下, 果然有,但是 好像文章的bolg 关了,在百度快照里找到的 ,记录下, 自己以后可能也会用的到,免得到时候蛋疼方案1 : 通过重载消息处理实现。重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),C#中重写窗口过程不用再调用SetW...
  • li_1042237864
  • li_1042237864
  • 2010-08-23 18:10
  • 8293

用C#实现在客户区拖动窗体

首先必须了解Windows的消息传递机制,当有鼠标活动消息时,系统发送WM_NCHITTEST 消息给窗体作为判断消息发生地的根据。假如你点击的是标题栏,窗体收到的消息值就是 HTCAPTION ,同样地,若接受到的消息是 HTCLIENT,说明用户点击的是客户区,也就是鼠标消息发生在客户区。当重载...
  • orichisonic
  • orichisonic
  • 2007-11-13 09:26
  • 2450

c#窗体移动(无边框移动/用户区移动)

c#窗体移动(无边框移动/用户区移动)
  • furturerock
  • furturerock
  • 2010-06-26 20:58
  • 4183
    个人资料
    • 访问:2326263次
    • 积分:21610
    • 等级:
    • 排名:第413名
    • 原创:270篇
    • 转载:10篇
    • 译文:0篇
    • 评论:1651条
    个人博客
    作者:杨秀璋
    学历:本科-北京理工大学
               硕士-北京理工大学
    现任教于贵财财经大学信息学院
    http://www.eastmountyxz.com

    简介:自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。

    贵州纵美路迢迢,
    为负劳心此一遭。
    收得破书三四本,
    也堪将去教尔曹。

    娜美人生,醉美生活。
    他和她经历风雨,慢慢变老。
    博客专栏
    牛人博客
    最新评论