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

时间:2009-11-12 22:56:20

标签: c# winforms custom-controls

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

任何帮助?

2 个答案:

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