2009-11-12 286 views
2

在C#中,我使用無邊框樣式的自定義窗體來覆蓋onPaint事件並使用透明度鍵繪製自定義背景。我想設置我自己的客戶端矩形值(因此內容將放置在我的自定義邊框內),但不幸Form的ClientRectangle屬性是隻讀的。我發現網上的建議,以覆蓋WndProc方法(它設置客戶端大小),但令人傷心的是,我發現很少有關於此的信息。尤其是它需要填充由lParam和wParam指向的數據,我真的不知道如何在C#中執行此操作。在C#中設置ClientRectangle爲自定義窗體#

任何幫助?

回答

3

你的問題有幾個關注我的事情......首先你想繪製自己的邊框,然後調整客戶矩形。這實際上是不可能的,因爲客戶矩形是在窗口移動時確定的。一旦確定完全不同的繪畫信息負責繪製所有非客戶端內容。因此,你可以做你的建議;不過,它會打破你目前的邊框畫。

將FAR eaiser將您的表單中的所有控件移動到新的Panel控件中並將其放置在窗體上。現在您可以像調整客戶區域那樣定位此面板。

如果你必須與你最初的想法修改窗口客戶區進行,你會做到以下幾點:

private void AdjustClientRect(ref RECT rcClient) 
    { 
     rcClient.Left += 10; 
     rcClient.Top += 10; 
     rcClient.Right -= 10; 
     rcClient.Bottom -= 10; 
    } 

    struct RECT { public int Left, Top, Right, Bottom; } 
    struct NCCALCSIZE_PARAMS 
    { 
     public RECT rcNewWindow; 
     public RECT rcOldWindow; 
     public RECT rcClient; 
     IntPtr lppos; 
    } 

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

     const int WM_NCCALCSIZE = 0x0083; 
     if (m.Msg == WM_NCCALCSIZE) 
     { 
      if (m.WParam != IntPtr.Zero) 
      { 
       NCCALCSIZE_PARAMS rcsize = (NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(NCCALCSIZE_PARAMS)); 
       AdjustClientRect(ref rcsize.rcNewWindow); 
       Marshal.StructureToPtr(rcsize, m.LParam, false); 
      } 
      else 
      { 
       RECT rcsize = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT)); 
       AdjustClientRect(ref rcsize); 
       Marshal.StructureToPtr(rcsize, m.LParam, false); 
      } 
      m.Result = new IntPtr(1); 
      return; 
     } 
    } 
+0

我雖然有關創建與背景色= Color.Transparent簡單停靠面板和父窗體的填充設置新客戶端大小。父控制也覆蓋父表單的自身控制屬性以獲取控制面板的控制權。但是,這不起作用的原因之一:如果控制顯示圖像太慢並且被重新縮放 – PiotrK 2009-11-13 11:56:52

+0

雖然將所有內容都移動到面板上會更容易嗎? OP沒有真正指定他如何使用它,但它可能是這種情況,例如,這將用於多個表單將從中繼承的基類。 – 2014-11-10 20:41:05

+0

@joshua pech,同意這就是爲什麼我推薦相同。 – 2014-11-11 03:00:43

0

由於您負責繪製整個窗體,因此定義您自己的內容可能是最簡單的方法。從窗體的頂部/左側開始放置10像素的矩形,並且寬度/高度小於20像素然後表格寬度/高度。

然後,在控件Paint事件中,先正常繪製邊界區域,然後調用Graphics.Translate(10,10),然後繪製實際內容。