关于窗口的拖曳…
作者:互联网
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