在C#中,我有自定义形式的无边框样式,它覆盖onPaint事件并使用透明度键绘制自定义背景。我想设置自己的客户端矩形值(因此内容将放在我的自定义边框内),但不幸的是Form的ClientRectangle属性是只读的。我发现net的建议覆盖了WndProc方法(它设置了客户端大小),但很遗憾,我发现这方面的信息很少。特别是它需要填充lParam和wParam指向的数据,我真的不知道如何在C#中执行此操作。
任何帮助?
答案 0 :(得分:3)
您的问题涉及到我的一些事情......首先,您想绘制自己的边框,然后调整客户端矩形。这实际上是不可能的,因为窗口移动时确定了客户端矩形。一旦确定,完全不同的绘制消息负责绘制所有非客户端内容。因此,你可以做你的建议;然而,它会打破你现在的边界画。
将所有控件从表单移动到新的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;
}
}
答案 1 :(得分:0)
由于您负责绘制整个表单,因此最简单的方法是定义自己的内容矩形,例如,从表单的顶部/左侧定位10个像素,宽度/高度小于20个像素形式宽度/高度。
然后,在控件Paint事件中,首先正常绘制边框区域,然后调用Graphics.Translate(10,10)然后绘制实际内容。