在C#中以自定义forms设置ClientRectangle

在C#中,我有自定义forms的无边框样式,它覆盖onPaint事件并使用透明度键绘制自定义背景。 我想设置自己的客户端矩形值(因此内容将放在我的自定义边框内),但不幸的是Form的ClientRectangle属性是只读的。 我发现net的建议覆盖了WndProc方法(它设置了客户端大小),但很遗憾,我发现这方面的信息很少。 特别是它需要填充lParam和wParam指向的数据,我真的不知道如何在C#中执行此操作。

有帮助吗?

你的问题有几个让我感到困惑的事情……首先你要绘制自己的边框,然后调整客户端矩形。 这实际上是不可能的,因为窗口移动时确定客户端矩形。 一旦确定,完全不同的绘制消息负责绘制所有非客户端内容。 因此,你可以做你的建议; 但是,它会破坏你当前的边框画。

将所有控件从表单移动到新的Panel控件并将其放在表单上将是FAR eaiser。 现在,您可以像调整客户区域一样定位此面板。

如果您必须按照原来的想法修改窗口客户区,则可以执行以下操作:

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)然后绘制实际内容。