Я пытался нарисовать пользовательские границы для существующих элементов управления .Net WinForms. Я попытался это сделать, создав класс, в элементе управления которого я хочу изменить цвет границы, а затем попробовал несколько вещей во время рисования. Я пробовал следующее:
1. Лови WM_NCPAINT
. Это в некоторой степени работает. Проблема с приведенным ниже кодом заключается в том, что при изменении размера элемента управления граница будет обрезана справа и снизу. Фигово.
protected override void WndProc(ref Message m)
{
if (m.Msg == NativeMethods.WM_NCPAINT) {
WmNcPaint(ref m);
return;
}
base.WndProc(ref m);
}
private void WmNcPaint(ref Message m)
{
if (BorderStyle == BorderStyle.None) {
return;
}
IntPtr hDC = NativeMethods.GetWindowDC(m.HWnd);
if (hDC != IntPtr.Zero) {
using (Graphics g = Graphics.FromHdc(hDC)) {
ControlPaint.DrawBorder(g, new Rectangle(0, 0, this.Width, this.Height), _BorderColor, ButtonBorderStyle.Solid);
}
m.Result = (IntPtr)1;
NativeMethods.ReleaseDC(m.HWnd, hDC);
}
}
2. Отменить void OnPaint
. Это работает для некоторых элементов управления, но не для всех. Это также требует, чтобы вы установили BorderStyle
в BorderStyle.None
, и вам нужно вручную очистить фон от краски, иначе вы получите это при изменении размера.
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
ControlPaint.DrawBorder(e.Graphics, new Rectangle(0, 0, this.Width, this.Height), _BorderColor, ButtonBorderStyle.Solid);
}
3. Переопределение void OnResize
и void OnPaint
(как в способе 2). Таким образом, он хорошо отображается при изменении размера, но не тогда, когда на панели AutoScroll
включен, и в этом случае он будет выглядеть следующим образом при прокрутке вниз. Если я попытаюсь использовать WM_NCPAINT
для закрашивания границы, Refresh()
не даст никакого эффекта.
protected override void OnResize(EventArgs eventargs)
{
base.OnResize(eventargs);
Refresh();
}
Предложения более чем приветствуются. Я хотел бы знать, какой лучший способ сделать это для нескольких типов элементов управления (мне придется сделать это для нескольких элементов управления WinForms по умолчанию).
OnPaint
(как видно из метода 2 в моем вопросе) прокрутки вниз: 4o4.nl/20140929R67rl.png Я обновлю свой вопрос. - person Codecat   schedule 30.09.2014AutoScroll
. (Если вы не намекаете, я должен поместить панель внутрь панели ..: P) - person Codecat   schedule 30.09.2014Width-1
иHeight-1
для границ, но дляControlPaint.DrawBorder
это не нужно. Обратите внимание, что он отлично отрисовывается, если вы не измените размер элемента управления (с помощью привязки или чего-то подобного). - person Codecat   schedule 30.09.2014