[英]Mouse double click fires on right clicks only
I want to override double click on a panel control so i basically did that 我想覆盖面板控件上的双击,所以我基本上做到了
HeaderPanel.MouseDoubleClick += (sender, args) =>
{
MaximizeOnClick(sender, args);
};
However (strangely) it only fires if i double right click and never with normal double left click. 但是(奇怪的是)只有在我双击鼠标右键时才会触发,而在没有普通鼠标左键单击的情况下永远不会触发。 ? ? what is the issue ? 有什么问题?
Update #1: i think this happens because i also override the MouseDown
event because when i remove it the left click works so is there some kind of interaction or something between the 2 events ? 更新#1:我认为发生这种情况是因为我还重写了MouseDown
事件,因为当我删除它时,单击鼠标左键起作用了,所以这两个事件之间是否存在某种交互作用?
Update #2: 更新#2:
const int WM_NCLBUTTONDOWN = 0xA1;
const int HTCAPTION = 0x2;
const UInt32 WM_NCHITTEST = 0x0084;
const UInt32 WM_MOUSEMOVE = 0x0200;
const UInt32 HTLEFT = 10;
const UInt32 HTRIGHT = 11;
const UInt32 HTBOTTOMRIGHT = 17;
const UInt32 HTBOTTOM = 15;
const UInt32 HTBOTTOMLEFT = 16;
const UInt32 HTTOP = 12;
const UInt32 HTTOPLEFT = 13;
const UInt32 HTTOPRIGHT = 14;
const int RESIZE_HANDLE_SIZE = 10;
[DllImport("User32.dll")]
public static extern bool ReleaseCapture();
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
protected override void WndProc(ref Message m)
{
bool handled = false;
if (m.Msg == WM_NCHITTEST || m.Msg == WM_MOUSEMOVE)
{
Size formSize = Size;
Point screenPoint = new Point(m.LParam.ToInt32());
Point clientPoint = PointToClient(screenPoint);
Dictionary<UInt32, Rectangle> boxes = new Dictionary<UInt32, Rectangle>
{
{HTBOTTOMLEFT, new Rectangle(0, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTBOTTOM, new Rectangle(RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, formSize.Width - 2*RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTBOTTOMRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, formSize.Height - 2*RESIZE_HANDLE_SIZE)},
{HTTOPRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, 0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTTOP, new Rectangle(RESIZE_HANDLE_SIZE, 0, formSize.Width - 2*RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTTOPLEFT, new Rectangle(0, 0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTLEFT, new Rectangle(0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, formSize.Height - 2*RESIZE_HANDLE_SIZE)}
};
foreach (KeyValuePair<UInt32, Rectangle> hitBox in boxes)
{
if (hitBox.Value.Contains(clientPoint))
{
m.Result = (IntPtr)hitBox.Key;
handled = true;
break;
}
}
}
if (!handled)
base.WndProc(ref m);
}
private void HeaderPanelOnMouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
}
private void MaximizeOnClick(object sender, EventArgs eventArgs)
{
if (FormWindowState.Normal == WindowState)
{
MaximumSize = Screen.PrimaryScreen.WorkingArea.Size;
WindowState = FormWindowState.Maximized;
}
else
{
MaximumSize = new Size(0, 0);
WindowState = FormWindowState.Normal;
}
Panel.Select();
}
Ok i have fixed that issue by handling the double click event before the on mouse down... basically changing this 好的,我已经通过在鼠标按下之前处理双击事件来解决了该问题……基本上可以更改此问题
private void HeaderPanelOnMouseDown(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) {
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
}
to this 对此
private void HeaderPanelOnMouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.Clicks >= 2) {
MaximizeOnClick(sender, e);
return;
}
if (e.Button != MouseButtons.Left) {
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.