在 C# 中,我有 None 边框样式的自定义形式,它覆盖 onPaint 事件并使用透明度键绘制自定义背景。我想设置我自己的客户端矩形值(因此内容将放置在我的自定义边框内),但不幸的是 Form 的 ClientRectangle 属性是只读的。我通过网络找到了重写 WndProc 方法(它设置客户端大小)的建议,但遗憾的是,我发现了很少的信息。特别是它需要填充lParam和wParam指向的数据,我真的不知道如何在C#中做到这一点。
有什么帮助吗?
最佳答案
你的问题有一些让我担心的事情......首先你想绘制自己的边框,然后调整客户端矩形。这实际上是不可能的,因为客户矩形是在窗口移动时确定的。一旦确定完全不同的绘制消息负责绘制所有非客户端内容。这样你就可以按照你的建议去做;但是,它会破坏您当前的边框绘制。
将所有控件从窗体移至新的面板控件并将其放置在窗体上会更容易。现在您可以像调整客户区域一样定位该面板。
如果您必须继续最初的想法来修改窗口客户区,您将执行以下操作:
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;
}
}
关于c# - 在C#中以自定义形式设置ClientRectangle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1725987/