2009-10-22 88 views
5

我使用以下代碼通過單擊並拖動窗體本身來拖動無邊界窗體。它可以工作,但它不適用於單擊並拖動窗體上的控件。我需要在單擊某些控件時才能拖動它,而不是其他按鈕 - 按標籤拖動,但不按按鈕和文本框。我該怎麼做?C#:如何從窗體拖動一個和它的控件?

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(ref m); 

    const int WM_NCHITTEST = 0x84; 
    const int HTCLIENT = 0x1; 
    const int HTCAPTION = 0x2; 

    if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) 
     m.Result = (IntPtr)HTCAPTION; 
} 

回答

3

其實,我找到了解決方案here

public const int WM_NCLBUTTONDOWN = 0xA1; 
public const int HTCAPTION = 0x2; 

[DllImport("User32.dll")] 
public static extern bool ReleaseCapture(); 
[DllImport("User32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 

// Paste the below code in the your label control MouseDown event 
if (e.Button == MouseButtons.Left) 
{ 
    ReleaseCapture(); 
    SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0); 
} 

它的工作原理。

而且,在上述我的代碼,如果大小調整是需要的,if語句應改爲

 if (m.Msg == WM_NCHITTEST) 
      if ((int)m.Result == HTCLIENT) 
       m.Result = (IntPtr)HTCAPTION; 
1

使用Spy ++分析哪些控件正在接收什麼Windows消息,然後您將知道需要捕獲的內容。

沒有深入研究你的代碼,我在想象主窗口上的子控件正在接收消息而不是表單,並且你想對其中的一些進行響應。

相關問題