winform 无边框 窗体基本功能 拖动和系统右键菜单冲突
时间:2009-12-24
来源:互联网
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;
using RightMenuItem;
namespace ClientFrom
{
public partial class Form12 : Form
{
private const int WM_SYSCOMMAND = 0x0112;//点击窗口左上角那个图标时的系统信息
private const int WM_NCHITTEST = 0x0084;
private const int WM_NCMBUTTONDOWN = 0x00A7;
private const int WS_SYSMENU = 0x00080000; // 系统菜单
private const int WS_MINIMIZEBOX = 0x20000; // 最大最小化按钮
private const int SC_MAXIMIZE = 0xF030;//最大化信息
private const int SC_MINIMIZE = 0xF020;//最小化信息
private const int GWL_WNDPROC = -4;
private static int LEFT = 2, RIGHT = 2, BOTTOM = 2, TOP = 2, TITLE_WIDTH = 16;//边框和标题栏的大小
private int m_BorderWidth = 4;
private int m_CaptionHeight = 22;
[DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
public static extern int GetWindowLong(HandleRef hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(HandleRef hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
private static extern int GetSystemMenu(int hwnd, int bRevert);
[DllImport("user32.dll")]
private static extern int AppendMenu(int hMenu, int Flagsw, int IDNewItem, string lpNewItem);
public Form12()
{
InitializeComponent();
//SetWindowLong(new HandleRef(this, this.Handle), -16, GetWindowLong(new HandleRef(this, this.Handle), -16) | WS_SYSMENU); //这里加上这段后 下面的case WM_NCHITTEST:就没反应了 请问这儿怎么写
}
#region WndProc
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
HandleRef hr = new HandleRef(this, m.HWnd);
switch (m.Msg)
{
case WM_SYSCOMMAND:
if (m.WParam == (IntPtr)SC_MAXIMIZE)
{
m.WParam = (IntPtr)SC_MINIMIZE;
}
break;
case WM_NCHITTEST:
if (m.Result == (IntPtr)HitTest.HTCLIENT)
{
m.HWnd = this.Handle;
Rectangle rect = this.Bounds;
Point vPoint = new Point((int)m.LParam & 0xFFFF, (int)m.LParam >> 16 & 0xFFFF);
vPoint = PointToClient(vPoint);
if (vPoint.X <= LEFT)
{
if (vPoint.Y <= TOP)
{
m.Result = (IntPtr)HitTest.HTTOPLEFT;
}
else if (vPoint.Y >= ClientSize.Height - BOTTOM)
{
m.Result = (IntPtr)HitTest.HTBOTTOMLEFT;
}
else
{
m.Result = (IntPtr)HitTest.HTLEFT;
}
}
else if (vPoint.X >= ClientSize.Width - RIGHT)
{
if (vPoint.Y <= TOP)
{
m.Result = (IntPtr)HitTest.HTTOPRIGHT;
}
else if (vPoint.Y >= ClientSize.Height - BOTTOM)
{
m.Result = (IntPtr)HitTest.HTBOTTOMRIGHT;
}
else
{
m.Result = (IntPtr)HitTest.HTRIGHT;
}
}
else if (vPoint.Y <= TOP)
{
m.Result = (IntPtr)HitTest.HTTOP;
}
else if (vPoint.Y >= ClientSize.Height - BOTTOM)
{
m.Result = (IntPtr)HitTest.HTBOTTOM;
}
else if (vPoint.Y > TITLE_WIDTH)
{
m.Result = (IntPtr)HitTest.HTCAPTION;
}
}
break;
}
}
#endregion
/// <summary>
/// 枚举鼠标拖动
/// </summary>
public enum HitTest : int
{
HTERROR = -2,
HTTRANSPARENT = -1,
HTNOWHERE = 0,
HTCLIENT = 1,
HTCAPTION = 2,
HTSYSMENU = 3,
HTGROWBOX = 4,
HTSIZE = HTGROWBOX,
HTMENU = 5,
HTHSCROLL = 6,
HTVSCROLL = 7,
HTMINBUTTON = 8,
HTMAXBUTTON = 9,
HTLEFT = 10,
HTRIGHT = 11,
HTTOP = 12,
HTTOPLEFT = 13,
HTTOPRIGHT = 14,
HTBOTTOM = 15,
HTBOTTOMLEFT = 16,
HTBOTTOMRIGHT = 17,
HTBORDER = 18,
HTREDUCE = HTMINBUTTON,
HTZOOM = HTMAXBUTTON,
HTSIZEFIRST = HTLEFT,
HTSIZELAST = HTBOTTOMRIGHT,
HTOBJECT = 19,
HTCLOSE = 20,
HTHELP = 21
}
}
}
作者: renyibin 发布时间: 2009-12-24
作者: changling_wang 发布时间: 2009-12-24
作者: zqd5920 发布时间: 2009-12-24
这段有问题
作者: renyibin 发布时间: 2009-12-24
[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; private void button1_MouseDown(object sender, MouseEventArgs e) { ReleaseCapture(); SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); }
这是无边框拖动
作者: hhc123 发布时间: 2009-12-24
//SetWindowLong(new HandleRef(this, this.Handle), -16, GetWindowLong(new HandleRef(this, this.Handle), -16) | WS_SYSMENU); //这里加上这段后 下面的case WM_NCHITTEST:就没反应了 请问这儿怎么写
这段有问题
把注释去掉 就不能响应case WM_NCHITTEST: 的功能了
作者: renyibin 发布时间: 2009-12-24
private void Form12_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
作者: renyibin 发布时间: 2009-12-24
作者: songgongpu 发布时间: 2009-12-25
作者: starts_2000 发布时间: 2009-12-25
作者: qyq520wei 发布时间: 2010-06-06
急!!!
呵呵~
作者: madai 发布时间: 2011-12-09
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28