• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
彭旭
天空不留痕迹,鸟儿却已飞过……
博客园    首页    新随笔    联系   管理    订阅  订阅

[Winform/C#]点击工作区域移动窗体

前言

话说鼠标点击客户区域实现移动窗体蛮简单的,目前有3种方法。

1.通过Form的MouseDown、MouseMove、MouseUp实现。这个逻辑比较简单就不介绍了。

2.通过Form的MouseDown事件里调用API。主要是调用ReleaseCapture()及SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0),WM_SYSCOMMAND=0x112、SC_MOVE=0xf010、HTCAPTION=0x2。大概是这样,有兴趣的可以试试。

3.重写WndProc函数,处理WM_NCHITTEST消息。

我是懒得用API,就选了第三种实现。

 

实现

先看代码,对WM_NCHITTEST消息有兴趣可以看看这里,以及MSDN。

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    if (m.Msg == 0x84) //WM_NCHITTEST
    {
        m.Result = (IntPtr)2; //HTCAPTION
    }
}

问题1

坑爹的是,Form在无边框的时候,双击工作区就最大化,把屏幕的工具栏区域也覆盖了。

好吧,在构造函数里加句this.MaximumSize = Screen.PrimaryScreen.WorkingArea.Size;

 

问题2

最大化没问题了,但是你丫最大化了还能移动就太二了吧。

想想就只能在处理Windows消息之前把鼠标左键点击消息屏蔽了。

完整代码如下:

protected override void WndProc(ref Message m)
{
    if (this.Size.Equals(this.MaximumSize))
    {
        if (m.Msg == 0xA1) //WM_NCLBUTTONDOWN
            return;
    }
    base.WndProc(ref m);
    if (m.Msg == 0x84) //WM_NCHITTEST
    {
        m.Result = (IntPtr)2; //HTCAPTION
    }
}

 

知识共享许可协议
本文 由 彭旭 创作,采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
posted @ 2012-04-26 16:10  彭旭  阅读(1676)  评论(4)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3