gpt4 book ai didi

c# - 在 C# 中以自定义窗体设置 ClientRectangle

转载 作者:行者123 更新时间:2023-11-30 22:48:22 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com