winform 无边框 窗体基本功能 拖动和系统右键菜单冲突
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;
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
}
}
}