2011-10-27 84 views
1

最好的圖像顯示,我可以從MDI父級的邊緣拖動窗體,滾動條出現。C#MDI - 如何防止滾動條?

更像是子窗體被鎖定到父窗體的區域。

我已經找到了一個解決方案,(其中很多都是在2年前回答的,所以我希望它們已經過時了),並且只會遇到檢查移動事件座標的人......很好,但是如果我有20個表格或100個表格怎麼辦?我無法編碼所有這些,它有點傻。當然,我可以在父母表單上設置一個屬性。

MDI Scrollbar problem

+1

這是原生的Windows MDI支持的代碼鍵行爲,你不能把它關掉。這是一個從上個世紀開始的窗口模型,當用戶使用低分辨率顯示器時。考慮另一個。 –

+0

@HansPassant,還有其他的? :)請你舉個例子。 – Doomsknight

+0

我不知道「以前的centry」;至少MS Excel 2007是MDI(雖然一半僞裝成一個單一文檔界面,當你明顯看到它是MDI時,它會在我遇到這些情況時將我嚇壞了)。許多應用程序使用單文檔界面;幾個不同的電子郵件客戶端(Thunderbird,Outlook等)的UI看起來非常適合您的基本UI模型,並且很多用戶將熟悉基本的交互模型。 –

回答

1

你可以做這樣的事情...

步驟:你必須作出基本形式(如用戶控件)

,並把這個代碼在形式

namespace Controls 
{ 
    public partial class BaseForm : Form 
    { 
    public BaseForm() 
    { 
     InitializeComponent(); 
     StartPosition = FormStartPosition.WindowsDefaultLocation; 
     MaximizeBox = false; 
     Width = 806; 
     //Width = 850; 
     //Height = 760; 
     Height = 730; 
     //Width = 790; 
     //Height = 617; 
    } 


    protected override void WndProc(ref Message m) 
    { 
     const int WM_SYSCOMMAND = 0x0112; 
     const int SC_MOVE = 0xF010; 
     //ShowScrollBar(this.Handle, (int)ScrollBarDirection.SB_BOTH, false); 
     switch (m.Msg) 
     { 
     case WM_SYSCOMMAND: 
      int command = m.WParam.ToInt32() & 0xfff0; 
      if (command == SC_MOVE) 
      return; 
      break; 
     } 
     base.WndProc(ref m); 
    } 
    } 
} 

和然後在每種形式你必須這樣指定...

public partial class childform : BaseForm 
{ 
    ....... 
} 

請確保您的所有孩子形式的規模是應以鹼形式大小指定

  • MINSIZE是0,0

  • 最大sixze也0,0

  • 指定startPosition - windowsdefaultlocation

  • 的WindowState - 正常

我希望它將幫助你..

0

你總是可以覆蓋父類的移動功能,然後讓所有的形式從類繼承。

Theres沒有神奇的API /屬性(我知道,如果我錯了道歉)告訴MDI父母鎖定其範圍內的兒童。

1

第1步: 你應該創建一個從NativeWindow類繼承的新類並重寫它的WndProc方法。

第2步: 在你的MDI窗體創建這個新類的一個新對象,並通過MDICLIENT控制,它的構造。

第1步代碼:

internal class MyNativeMDIclient : NativeWindow 
    { 
     private MdiClient mdiClient; 

     public MyNativeMDIclient(MdiClient parent) 
     { 
      mdiClient = parent; 
      ReleaseHandle(); 
      AssignHandle(mdiClient.Handle);    
     } 
     internal void OnHandleDestroyed(object sender, EventArgs e) 
     { 
      ReleaseHandle(); 
     } 
     private const int SB_BOTH = 3; 
     [DllImport("user32.dll")] 
     private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow); 
     protected override void WndProc(ref Message m) 
     { 
      ShowScrollBar(m.HWnd, SB_BOTH, 0 /*false*/); 
      base.WndProc(ref m); 
     } 
    } 

第2步代碼:

foreach (Control control in this.Controls) 
      { 
       if (control is MdiClient) 
       { 
        MyNativeMDIclient nw = new MyNativeMDIclient(control); 
        break; 
       } 
      }