C#无边框窗体移动的三种方法
2024-08-28 17:50:23
1. 重写WndProc
protected override void WndProc(ref Message m)
{
const int WM_NCHITTEST = 0x84;
const int HTCLIENT = 0x01;
const int HTCAPTION = 0x02;
if (m.Msg == WM_NCHITTEST)
{
this.DefWndProc(ref m);
if (m.Result.ToInt32() == HTCLIENT)
m.Result = new IntPtr(HTCAPTION);
else
base.WndProc(ref m);
}
else
{
base.WndProc(ref m);
}
}
2.创建消息
private const int WM_NCLBUTTONDOWN = 0x00A1;
private const int WM_NCHITTEST = 0x84;
private const int HT_CAPTION = 0x2;
private const int HT_CLIENT = 0x1; private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
//this.Capture = false;
pictureBox1.Capture = false;
Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HT_CAPTION, IntPtr.Zero);
WndProc(ref msg);
}
3.调用API代码
using System.Runtime.InteropServices; [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; //在窗体的_MouseDown中加入如下代码:
如:
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, );
}
最新文章
- ubuntu 用apt-get 安装apache 和php 之后php不能解析的问题
- JSP网站开发基础总结《十二》
- .net学习笔记---xml基础知识
- SplayTree伸展树的非递归实现(自底向上)
- VC/Wince 实现仿Win8 Metro风格界面3——按钮移动交换、删除、添加快捷方式(附效果图)
- 应该如何入门deep learning呢?从UFLDL开始!
- GestureDetector类及其用法
- 151111 sqlite3数据库学习
- Javascript 学习 笔记一
- UIGestureRecognizer在多层视图中的触发问题
- 标准会话管理器——StandardManager
- idea git将多余的代码提交到本地,如何退回。
- 51行代码实现简单的PHP区块链
- js操作对象
- 牛客网小a的旅行计划
- intval — 获取变量的整数值
- C#调用C++的dll EntryPointNotFoundException
- JS中caller和callee
- Memcached常用语法与java连接服务
- vue构造器的内容