簡體   English   中英

鼠標雙擊僅在右鍵單擊時觸發

[英]Mouse double click fires on right clicks only

我想覆蓋面板控件上的雙擊,所以我基本上做到了

HeaderPanel.MouseDoubleClick += (sender, args) =>
{
    MaximizeOnClick(sender, args);
};

但是(奇怪的是)只有在我雙擊鼠標右鍵時才會觸發,而在沒有普通鼠標左鍵單擊的情況下永遠不會觸發。 有什么問題?

更新#1:我認為發生這種情況是因為我還重寫了MouseDown事件,因為當我刪除它時,單擊鼠標左鍵起作用了,所以這兩個事件之間是否存在某種交互作用?

更新#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();
}

好的,我已經通過在鼠標按下之前處理雙擊事件來解決了該問題……基本上可以更改此問題

private void HeaderPanelOnMouseDown(object sender, MouseEventArgs e)
{
    if (e.Button != MouseButtons.Left) {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
    }
}

對此

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM