其他分享
首页 > 其他分享> > 关于窗口的拖曳…

关于窗口的拖曳…

作者:互联网

Hold up the windows message to drag your form.


这边提供一个当你在开发没有标题列的窗口

或者是不规则窗口时

又需要拖曳功能的小眉角…

我目前看到大部分人的做法是

1. 当鼠标在窗口上按下右键时, 记录下当时的座标

2. 当鼠标移动时记录下相对的位移

3. 当鼠标放开时, 窗口移动到相对的座标

但其实不用这摸麻烦

这里先大概说明一下原理

之所以我们按了标题列之后可以拖曳窗口

是因为系统收到了WM_NCLBUTTONDOWN这个消息

所以跟你的窗口说可以拖曳了

而当我们在不是标题列的地方按下鼠标左键

则会收到WM_LBUTTONDOWN

但是你把标题列隐藏之后

系统自然不会收到WM_NCLBUTTONDOWN了

我想说到这边应该就有人知道怎摸做了

没错^^

就是当收到WM_LBUTTONDOWN后

把他替换成WM_NCLBUTTONDOWN

以下则为程序的做法

如果你是在MFC中, 只要覆写WindowProc这个方法即可

	LRESULT CMoveWindowsDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    
    // 拦截鼠标消息
    case WM_LBUTTONDOWN:
        
        // 然后送出WM_NCLBUTTONDOWN
        this->SendMessage(WM_NCLBUTTONDOWN,HTCAPTION);
        
        return 1;
    }

    return CDialog::WindowProc(message, wParam, lParam);
}


只要这样

就可以达到目的了

快吧^^

当然在C#中也可以这样做

不过稍微麻烦一点

	using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; // 记得要参考这个才能叫用外部dll

namespace MoveWindowsCS
{
    public partial class Form1 : Form, IMessageFilter
    {
        private const int WM_LBUTTONDOWN    = 0x0201; // WM_LBUTTONDOWN 的消息编号
        private const int WM_NCLBUTTONDOWN  = 0x00A1; // WM_NCLBUTTONDOWN 的消息编号
        private const int HTCAPTION         = 2;      // 标题栏本身
    
        // 这里引用SendMessage这个API
        [DllImport("user32.dll", EntryPoint = "SendMessage")] 
        private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

        public Form1()
        {
            InitializeComponent();

            // 记得向Application注册PreFilterMessage才会生效
            Application.AddMessageFilter(this);
        }


        /// 
        /// 这边的做法与MFC类似
        /// 
        /// 
        /// 
        public bool PreFilterMessage(ref Message m)
        {
            switch (m.Msg)
            { 
                case WM_LBUTTONDOWN:
                    SendMessage(this.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
                    break;
            }
            return true;
        }
    }
}


原文:大专栏  关于窗口的拖曳…




标签:NCLBUTTONDOWN,int,WM,hellip,System,LBUTTONDOWN,拖曳,using,amp
来源: https://www.cnblogs.com/petewell/p/11465462.html