2015-08-31 13 views
1

我有一個程序將FormBorderStyle設置爲None。我一直在網上查找,發現了一個用於調整窗體大小的工作代碼,但只有當窗體沒有控件時纔有空格。儘管我的整個表單都是控件,但每個邊都有控件,而且我無法在邊上創建空間。有沒有辦法使用Windows API或其他東西來擴展調整大小的握柄,或者使用控件來觸發調整大小事件MouseDown調整無處不在的窗體的大小,無空格

+0

1-填充將無法正常工作。 2-我會在角落放一個sizegrip圖片的pictureBox?沒關係,如果我只能從右下角調整它的大小。 – XeZrunner

+0

我應該設置什麼樣的填充? – XeZrunner

回答

1

它可以以不同的方式完成。這個答案的主要思想是將一個面板放在窗體上作爲內容容器,然後排除它的右下角區域(大小抓握矩形),以使該區域不再面向面板,並且該矩形的所有鼠標事件將被路由到窗體,甚至小組不繪製該地區。

爲了實現這一目標,請執行下列操作步驟:

  1. 木箱表格並設置邊框樣式屬性設置爲無

  2. 添加小組形式,內容所有者並將其名稱以PANEL1和設置面板的Dock屬性爲填充

  3. 覆蓋OnSizeChanged的形式並設置與窗體大小相同的區域,然後排除其底部ri ght角落。這樣,排除的區域不再屬於面板,並且包括WM_NCHITTEST的所有消息將被我們的WndProc接收;該小組甚至不繪製該區域。

  4. 覆蓋WndProc得到WM_NCHITTEST消息,如果該點是我們在OnSizeChanges圍成的區域,顯示調整指針,並準備調整。

  5. 覆蓋OnPaint繪製大小握

截圖:

enter image description here

,這裏是用在它的容器面板一些控件的形式:

enter image description here

如果您將鼠標移動到大小抓地位置上,您將看到鼠標指針變爲右下角大小指針,並且可以使用它來調整表單大小。

您可以設置MinimumSize廣告MaximumSize的形式來防止醜陋的太小或太大的形式。

代碼:

下面是完整的代碼:因爲有與碼頭的控制設置爲填充和左

private int tolerance = 16; 
private const int WM_NCHITTEST = 132; 
private const int HTBOTTOMRIGHT = 17; 
private Rectangle sizeGripRectangle; 

protected override void WndProc(ref Message m) 
{ 
    switch (m.Msg) 
    { 
     case WM_NCHITTEST: 
      base.WndProc(ref m); 
      var hitPoint = this.PointToClient(new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16)); 
      if (sizeGripRectangle.Contains(hitPoint)) 
       m.Result = new IntPtr(HTBOTTOMRIGHT); 
      break; 
     default: 
      base.WndProc(ref m); 
      break; 
    } 
} 

protected override void OnSizeChanged(EventArgs e) 
{ 
    base.OnSizeChanged(e); 
    var region = new Region(new Rectangle(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height)); 
    sizeGripRectangle = new Rectangle(this.ClientRectangle.Width - tolerance, this.ClientRectangle.Height - tolerance, tolerance, tolerance); 
    region.Exclude(sizeGripRectangle); 
    this.panel1.Region = region; 
    this.Invalidate(); 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    ControlPaint.DrawSizeGrip(e.Graphics, Color.Transparent, sizeGripRectangle); 
} 
相關問題