2010-04-19 76 views
3

使用winforms我不知道是否有一些方法來防止垂直調整窗體的大小。我希望允許用戶在除了垂直方向以外的所有方向上調整窗體大小。此外,我希望允許用戶向上方向垂直調整大小,但不允許向下調整大小。Winforms:如何防止垂直調整大小VB.NET

我曾嘗試將其設置爲使用MAXIMUMSIZE:Me.maximumsize =新的大小(0,me.height)

我設置寬度爲0,因爲我想允許用戶改變形式寬度。

不幸的是它不起作用。

任何想法?

回答

8

您必須小心以允許窗體在啓動時自行調整大小。爲了適應具有不同視頻DPI設置或不同系統字體大小的計算機所需的縮放比例,或者是一個改變標題欄高度的用戶覆蓋。所有這些都是在Load事件運行時排序的。因此:

protected override void OnLoad(EventArgs e) { 
    Screen scr = Screen.FromControl(this); 
    this.MinimumSize = new Size(this.MinimumSize.Width, this.Height); 
    this.MaximumSize = new Size(scr.WorkingArea.Width, this.Height); 
} 

下你應該做的事情是確定光標的行爲,當用戶移動它,允許垂直調整窗口的窗口的邊緣。這是一個有點難看,你必須陷阱與WndProc中的WM_NCHITTEST消息,並更改消息返回值:

protected override void WndProc(ref Message m) { 
    base.WndProc(ref m); 
    if (m.Msg == 0x84) { // Trap WM_NCHITTEST 
    switch (m.Result.ToInt32()) { 
     case 12: m.Result = (IntPtr)2; break; // HTTOP to HTCAPTION 
     case 13: m.Result = (IntPtr)10; break; // etc.. 
     case 14: m.Result = (IntPtr)11; break; 
     case 15: m.Result = (IntPtr)1; break; 
     case 16: m.Result = (IntPtr)10; break; 
     case 17: m.Result = (IntPtr)11; break; 
    } 
    } 
} 
+0

優秀的樣品!這正是我想要的。這裏還有其他一些很好的解決方案,但我認爲這是最符合我需求的方案。有了這個,我可以完全控制所有調整方向。偉大的代碼片段! 但有一點,我有疑問......我想知道如果我可以將消息返回值更改爲我想要的值。是否重要,你返回或不是?你能回到任何一個嗎?爲什麼你返回這些值而不是其他值? 非常感謝! – user304602 2010-04-22 16:00:57

+0

查看WM_NCHITTEST的MSDN文檔。 http://msdn.microsoft.com/en-us/library/ms645618%28VS.85%29.aspx – 2010-04-22 16:12:27

+0

另請參閱http://stackoverflow.com/a/2140908/521757以獲得更好的API。 – jnm2 2013-10-28 12:48:24

1

有幾種解決方案。一個簡單的一個是這樣的:

Dim originalSize As Integer = Me.Height 

Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize 
    If Me.Height <> originalSize Then 
     Me.Height = originalSize 
    End If 
End Sub 

有記住,調整大小總是向下,當你調整了一下,你正在做的是改變表單的位置和調整下來。

+0

好主意檢查是否需要修改高度,因爲高度更改會導致另一個Resize事件被觸發,依此類推。如果沒有「if」,你會陷入無限循環。 – 2010-04-19 11:09:35

+0

好的解決方案,但在我的情況下,唯一的問題是,我將不得不在不同的點更新originalSize變量,它不是很舒服。但是你的解決方案很好!謝謝 – user304602 2010-04-19 14:36:28

+1

您可以創建一個自定義屬性來更新表單的大小,並同時更新originalSize變量。 – 2010-04-20 06:39:51

3

設置窗體的最大&最小尺寸的屬性或寫下面的代碼時的Form_Load:

this.MaximumSize=new System.Drawing.Size(2048, 300); 
this.MinimumSize=new System.Drawing.Size(0, 300); 

給同一高度兩者。

1

大多數時候開發商已經設置了從設計 大小,這樣的代碼將

private void FormLogin_Load(object sender, EventArgs e) 
{ 
    this.MaximumSize = this.Size; 
    this.MinimumSize = this.Size; 

}