2014-10-04 105 views
0

我要重写双击面板控制,所以我基本上做到了鼠标双击火灾只

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(); 
} 
+0

@HansPassant对不起,我已经添加了其余的代码,它处理窗体的移动...和显示调整器 – 2014-10-04 22:28:49

+1

您没有双击,因为它认为它是非客户区,* SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0); *。 – 2014-10-04 22:39:07

+0

@γηράσκωδ'αείπολάλδιδασκόμε我已经发布了修复程序。 – 2014-10-04 22:42:22

回答

3

好吧,我已经在鼠标前处理双击事件下来......基本上改变这种

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); 
    } 
}