Установить ClientRectangle в пользовательской форме в C # - PullRequest
2 голосов
/ 13 ноября 2009

В C # у меня есть пользовательская форма стиля границы Нет, которая переопределяет событие onPaint и рисует собственный фон с ключом прозрачности. Я хочу установить собственное значение прямоугольника клиента (чтобы содержимое помещалось внутри моей настраиваемой границы), но, к сожалению, свойство ClientRectangle формы доступно только для чтения. Я нашел совет по сети, чтобы переопределить метод WndProc (где он устанавливает размер клиента), но, к сожалению, я нашел очень мало информации об этом. Особенно это требует заполнения данных, на которые указывают lParam и wParam, и я действительно не знаю, как это сделать в C #.

Любая помощь?

Ответы [ 2 ]

3 голосов
/ 13 ноября 2009

У вашего вопроса есть пара вещей, которые меня беспокоят ... сначала вы хотите нарисовать собственную границу, а затем настроить прямоугольник клиента. Это действительно невозможно, поскольку прямоугольник клиента определяется при перемещении окна. После того, как определено, совершенно другое сообщение о рисовании отвечает за отрисовку всего не клиентского контента. Таким образом, вы можете делать то, что вы предлагаете; однако, это нарушит вашу текущую окраску.

Было бы FAR eaiser переместить все ваши элементы управления из вашей формы в новый элемент управления Panel и поместить его в форму. Теперь вы можете расположить эту панель так, как будто вы настраиваете клиентскую область.

Если вы хотите продолжить исходную мысль, чтобы изменить область клиента окна, вы должны сделать следующее:

    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;
        }
    }
0 голосов
/ 13 ноября 2009

Поскольку вы несете ответственность за рисование всей формы, возможно, проще всего определить собственный контент. Прямоугольник, который расположен, скажем, на 10 пикселей сверху / слева от формы и имеет ширину / высоту на 20 пикселей меньше ширина / высота формы.

Затем в элементе управления Paint сначала нарисуйте область границы как обычно, затем вызовите Graphics.Translate (10,10) и затем нарисуйте фактический контент.

...