У меня есть пользовательский ComboBox в C# приложении WinForms, и мне удалось переопределить цвет фона, когда он включен и отключен, и переопределить границу, когда он включен, но когда элемент управления отключен, я не могу понять, Как изменить цвет его границы.
В настоящее время я ловлю WndProc
сообщения, отправляемые на пользовательский элемент управления, что-то вроде этого:
protected override void WndProc (ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_PAINT)
{
// set the enabled border color here, and it works
using (var g = Graphics.FromHwnd(Handle)
{
using (var p = new Pen(Color.Black))
{
g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
}
}
}
if (m.Msg == WM_CTLCOLORSTATIC)
{
// set the disabled background color here
]
if (m.Msg == WM_NCPAINT)
{
// try to set the disabled border color here, but its not working
using (var g = Graphics.FromHwnd(Handle)
{
using (var p = new Pen(Color.Black))
{
g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
}
}
}
}
Вот некоторые изображения Чтобы помочь понять проблему, я выбрал цвета, которые специально выделяют проблемную область, это не те цвета, которые я бы использовал:
Включен комбинированный список:
![enter image description here](https://i.stack.imgur.com/W2DCn.png)
Отключенный комбинированный список:
![enter image description here](https://i.stack.imgur.com/6fGbU.png)
Обратите внимание на толстую границу SystemGrey, применяемую при отключении комбинированного списка. Это то, что я хочу удалить, это выглядит хуже на старых windows системах, эти скриншоты были сделаны на Windows 10, но я нацеливаюсь на Windows Server 2012, где он производит странный эффект «ореола», который выходит за пределы контроль.
Глядя на MSDN, кажется, что WM_NCPAINT - это сообщение, которое я хочу, но пошаговое выполнение кода, кажется, граница уже была нарисована в этой точке. Я также попытался посмотреть на MSDN для WM_CTLCOLORSTATI C, так как имя кажется многообещающим, но, похоже, оно не вызывает ничего, кроме установки цветов фона.
Есть ли еще одно сообщение, на которое я должен обратить внимание, или я подхожу к этому неправильно? Я попытался пройтись и просмотреть каждое сообщение, но я просто не могу сказать, какое из них вызывает вызов для установки границы.
Редактировать : решение см. Ниже. быстрый и грязный пример того, чего я хотел достичь, и что будет делать код решения:
![enter image description here](https://i.stack.imgur.com/9mK3M.png)