zoukankan      html  css  js  c++  java
  • [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 中国大陆 许可协议进行许可。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    Case study, about cnblogs
    《Windows用户态程序高效排错》
    为什么java+winform就那么慢呢
    Mixed DLL Loading analysis
    <a>标签无跳转
    各情景下元素宽高的获取
    在Asp.Net中使用FCKeditor的常用配置
    Small Program 1.0 发布
    微软会向开发者收费吗?
    BO入门实战
  • 原文地址:https://www.cnblogs.com/ainijiutian/p/2471582.html
Copyright © 2011-2022 走看看