2009-11-12 80 views
2

我使用SetWindowLongPtr PInvoke從大小窗口中刪除標題(WS_CAPTION)後,在Windows窗體中出現此問題。之後,無論窗口是最小化還是最大化,然後恢復到正常,它都會增長(通過CaptionHeight +邊框)。使用隱藏標題欄最小化/恢復使窗口窗體窗口增長

看來Windows窗體的佈局機制試圖補償它認爲仍然存在的標題欄。 (如果我從一個FormBorderStyle的None開始,並添加我想要的,即可觀的邊框,我最終會遇到相反的問題,窗口縮小)。

我發現另外一個人已經擊中了this problem on codeplex, 但是沒有發佈解決方案。

嘗試調整自定義處理程序中某個調整大小事件的大小都爲時過早,即Windows窗體在Layout,Resize和SizeChanged事件觸發後進行調整,並且如果沒有Caption欄,ResizeEnd不會觸發。在任何情況下,這只是一個解決方法,我想要一種方法來告訴Windows窗體做正確的事情。 想法?

(我有工作,我會很快發佈一個解決辦法,但它是對最終用戶可見。)

回答

1

它工作正常,如果你這樣做的Windows窗體的方式。將此代碼粘貼到您的表單中:

protected override CreateParams CreateParams { 
    get { 
    CreateParams parms = base.CreateParams; 
    parms.Style &= ~0xC00000; // Turn off WS_CAPTION 
    return parms; 
    } 
} 
+0

非常好!這更清潔;代碼少,沒有視覺異常。這不是很容易發現....謝謝。 – crpatton 2009-11-16 22:45:21

+0

請參閱[窗口樣式](http://msdn.microsoft.com/zh-cn/library/ms632600.aspx)以獲取可能的值列表。 – 2012-06-04 00:43:30

0

link text我的解決方案,由賈斯汀·羅傑斯引發真棒Windows窗體消息泵招:

private delegate void VoidMethodInvoker(); 
    public void ShrinkWindow() 
    { 
     int widthAdjust = 2 * SystemInformation.BorderSize.Height; 
     int heightAdjust = SystemInformation.CaptionHeight + 2 * SystemInformation.BorderSize.Height; 
     this.Size = new System.Drawing.Size(Size.Width - widthAdjust, Size.Height - heightAdjust); 
    } 

// Then in the Resize event: 
    case FormWindowState.Normal: 
    { 
      this.BeginInvoke(new VoidMethodInvoker(this.ShrinkWindow)); 

      break; 
    } 

BeginInvoke將ShrinkWindow調用放在消息泵上;直接從Resize事件處理程序中調用它太早 並且當標題欄不可見時,ResizeEnd事件似乎不會觸發。最終用戶確實看到這種增長和縮小,但它很快就會變成 。