在C#中,我使用無邊框樣式的自定義窗體來覆蓋onPaint事件並使用透明度鍵繪製自定義背景。我想設置我自己的客戶端矩形值(因此內容將放置在我的自定義邊框內),但不幸Form的ClientRectangle屬性是隻讀的。我發現網上的建議,以覆蓋WndProc方法(它設置客戶端大小),但令人傷心的是,我發現很少有關於此的信息。尤其是它需要填充由lParam和wParam指向的數據,我真的不知道如何在C#中執行此操作。在C#中設置ClientRectangle爲自定義窗體#
任何幫助?
在C#中,我使用無邊框樣式的自定義窗體來覆蓋onPaint事件並使用透明度鍵繪製自定義背景。我想設置我自己的客戶端矩形值(因此內容將放置在我的自定義邊框內),但不幸Form的ClientRectangle屬性是隻讀的。我發現網上的建議,以覆蓋WndProc方法(它設置客戶端大小),但令人傷心的是,我發現很少有關於此的信息。尤其是它需要填充由lParam和wParam指向的數據,我真的不知道如何在C#中執行此操作。在C#中設置ClientRectangle爲自定義窗體#
任何幫助?
你的問題有幾個關注我的事情......首先你想繪製自己的邊框,然後調整客戶矩形。這實際上是不可能的,因爲客戶矩形是在窗口移動時確定的。一旦確定完全不同的繪畫信息負責繪製所有非客戶端內容。因此,你可以做你的建議;不過,它會打破你目前的邊框畫。
將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;
}
}
由於您負責繪製整個窗體,因此定義您自己的內容可能是最簡單的方法。從窗體的頂部/左側開始放置10像素的矩形,並且寬度/高度小於20像素然後表格寬度/高度。
然後,在控件Paint事件中,先正常繪製邊界區域,然後調用Graphics.Translate(10,10),然後繪製實際內容。
我雖然有關創建與背景色= Color.Transparent簡單停靠面板和父窗體的填充設置新客戶端大小。父控制也覆蓋父表單的自身控制屬性以獲取控制面板的控制權。但是,這不起作用的原因之一:如果控制顯示圖像太慢並且被重新縮放 – PiotrK 2009-11-13 11:56:52
雖然將所有內容都移動到面板上會更容易嗎? OP沒有真正指定他如何使用它,但它可能是這種情況,例如,這將用於多個表單將從中繼承的基類。 – 2014-11-10 20:41:05
@joshua pech,同意這就是爲什麼我推薦相同。 – 2014-11-11 03:00:43