2012-02-17 39 views
4

我想通過左鍵點擊移動自己的狀態窗口中的任意拖動並保持在背景區,就像我們平常使用的標題欄移動創建非矩形形式。可以通過在背景區域

然後我也想我的應用程序(即,矩形窗)形式的窗口更改爲我的定製設計的圖形窗口。我在許多其他應用程序中看到過這種類型的窗口,所以我相信這是可能的。

回答

5

問題1:

要允許拖動它的客戶區時,被移動的形式,你需要告訴窗口管理器來處理客戶區就好像它是標題欄(標題區)。你在你的問題中提出了類似的建議。

這可以在.NET中通過重寫表單的WndProc method,響應WM_NCHITTEST消息,並返回HTCAPTION表明,一切都應該作爲標題(標題)欄的一部分進行處理來完成,而不是默認HTCLIENT, ,這表明它應該被視爲表單的客戶區域。下面的代碼添加到您的窗體類:

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

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

    if (m.Msg == WM_NCHITTEST) 
    { 
     // Convert HTCLIENT to HTCAPTION 
     if (m.Result.ToInt32() == HTCLIENT) 
     { 
      m.Result = (IntPtr)HTCAPTION; 
     } 
    } 
} 

問題2:

您可以通過表單的Region property設置的自定義Region創建一個任意的,非矩形形狀的一種形式你的選擇。如果您有像Photoshop這樣的圖形程序的經驗,您可以將其視爲爲表單設置「裁剪區域」:窗口管理器不會在您指定的邊界之外繪製任何內容。描述此形狀的像素甚至可以是不連續的。

創建區域的最簡單方法可能是使用GraphicsPath class,然後使用接受單個GraphicsPath對象作爲參數的constructor for the Region class

而且我假設你已經知道了,給定第一個問題,你必須將FormBorderStyle property設置爲None,以確保窗口管理器繪製的默認邊框消失。

不幸的是,這些區域不能反鋸齒。有關這些限制的更多詳細信息,請參閱Hans's answer to this question

最後,值得注意的是,後一種方法來創建非矩形形式可以產生完全不提高產品的可用性,像這樣一些徹頭徹尾的醜陋的用戶界面:

Windows Media Player "alien head"

請謹慎使用此技巧並運用良好的判斷力。如果有疑問,矩形對於窗戶來說實際上是一個非常好的形狀。

+0

謝謝科迪你的回答對我來說非常有用。我已經應用了這個,但是我的背景變爲禁用了。有什麼辦法可以讓我爲背景同時舉辦兩個活動嗎? – Prince123 2012-02-17 04:03:44

+0

你應該知道使用WM_NCHITTEST和HTCAPTION會產生副作用。例如:雙擊表單將使其最大化。 – AVIDeveloper 2012-02-17 08:43:34

+0

我可以通過禁用MaximizeBox來解決這個問題。但是,如何解決它受到影響的情況。 – Prince123 2012-02-17 16:00:38

1

這裏有令人印象深刻的CodeProject上的文章,這將回答這兩個問題你一個鏈接:An Alpha Channel Composited Windows Form with Designer Support。該實現使用前後窗組合。 它使用WS_EX_LAYERED來顯示一個基於位圖的窗口,並將鼠標事件掛鉤到主窗體以允許拖動它。

一兩件事,看起來有點假時被周圍拖動窗口 - 有前窗和後窗的運動之間有一個小的延遲,使它們看起來像他們互相追逐。

接下來的這個CodeProject上的文章顯示了一種方法通過使用DeferWindowPos來解決這一問題:Alpha Blended Windows Forms

祝你好運!