c# - 在C#中以自定义形式设置ClientRectangle

标签 c# winforms custom-controls

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

相关文章:

.net - 禁用文本的系统颜色是什么?

c# - 如何在 WebBrowser 控件中获取当前状态代码?

ios - 带有 UIButtons 的 UIView 在单击或旋转之前未显示

c# - 在 C# 中创建我的对称 key

c# - Linq (EntityFramework) 中的正则表达式,数据库中的字符串处理

c# - 无法连接到C#中的本地数据库

c# - WPF:获取 Child 在其父面板中的真实 'logical' 位置

c# - LINQ - IQueryable 优化 - 是否需要?

c# - 如何连接两个富文本框

asp.net - 继承自 Control 与 Web Control