none
重新定义Panel的客户区域? RRS feed

  • 问题

  • 大家好,最近在做一系列的控件,包括Button,Panel等。

    现在在做Panel的时候遇到了一个问题,我需要定义自己的ScrollBar做为Panel的ScrollBar,而这样做的前提是要改变控件的ClientSize,否则在Panel中添加控件,选择Dock = Fill 的时候会直接覆盖Scrollbar,

    于是我重载了WndProc,并监听了消息:WindowsMessages.NCCALCSIZE=0x83,具体代码如下:

     protected override void WndProc(ref Message m)
            {
                if (m.Msg == (uint)Win32API.WindowsMessages.NCCALCSIZE)
                {
                    NCCALCSIZE_PARAMS Params;
                    Params = (NCCALCSIZE_PARAMS)m.GetLParam(typeof(NCCALCSIZE_PARAMS));
                    if (Params.rgrc[2].Right > 16)
                    {
                        Params.rgrc[2].Right = Params.rgrc[0].Right - Params.rgrc[0].Left - 16 + Params.rgrc[2].Left;
                    }
                    if (Params.rgrc[2].Bottom > 16)
                    {
                        Params.rgrc[2].Bottom = this.Height - 16 + Params.rgrc[2].Top;
                    }
                    m.WParam = IntPtr.Zero;
                    m.Result = IntPtr.Zero;
                    Marshal.StructureToPtr(Params, m.LParam, false);
                }
                else
                {
                    base.WndProc(ref m);
                }
            }
    

    现在遇到的问题是,在控件内的Button还会覆盖Scrollbar而ClientSize没有任何改变,

    请教大家如何修正Control的ClientSize来达到控件自动排列的目的

     

    2011年10月15日 2:54

全部回复