Я пытался найти простое решение для изменения цвета элемента управления редактирования, который имеет флаг ES_READONLY. Код, который у меня есть (работает), работает, когда элемент управления для редактирования доступен для редактирования, однако не влияет на мой элемент управления для редактирования, который имеет флаг только для чтения.
case WM_CTLCOLOREDIT:
{
HDC hdc = (HDC)wParam;
//if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam)
//{
SetTextColor(hdc, RGB(255, 255, 255)); // Set text color to white
SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black
//}
return 0;
}
break;
У меня есть комментарий, чтобы проверить, работает ли мой код, и он работает с элементом управления, который не только для чтения. Если я уберу ES_READONLY на моем другом элементе редактирования, он будет работать на нем. Я создаю программу чата и не хочу, чтобы пользователь мог печатать в области чата. И когда он только для чтения, он становится серо-серым, но я хочу белый цвет. Есть ли другой способ сделать это? Кроме того, цвет только окрашивает область, в которой находится текст, а не всю высоту элемента управления для редактирования. Что я делаю неправильно?
Вам нужно создать кисть и следить за ней. Затем вы возвращаете эту кисть вместо return 0
в вашем фрагменте кода. Как только кисть больше не нужна, вы должны удалить ее. Обычно это делается в ответ на WM_DESTROY
сообщение.
В вашем случае вы могли бы уклониться от пули, используя стоковую кисть, что я бы порекомендовал.
В режиме «только чтение» элементы управления редактированием реагируют на WM_CTLCOLORSTATIC
вместо WM_CTLCOLOREDIT
, поэтому вы должны правильно обработать это сообщение:
case WM_CTLCOLORSTATIC:
{
if( (HWND)lParam == GetDlgItem(hwnd, IDC_EDIT_IN) )
{
SetBkMode( (HDC)wParam, TRANSPARENT );
SetTextColor(hdc, RGB(255, 255, 255));
return (LRESULT)( (HBRUSH)GetStockObject(BLACK_BRUSH) );
// if edit control is in dialog procedure change LRESULT to INT_PTR
}
else // this is some other static control, do not touch it!!
return DefWindowProc( hwnd, message, wParam, lParam );
}
При рисовании редактирования / статического контроля, у вас есть 3 части для рисования:
Чтобы закрасить весь элемент управления в нужный цвет, необходимо вернуть кисть нужного цвета ( return (LRESULT)someBrush
для оконной процедуры, или return (INT_PTR)someBrush
для диалогового окна).
Ваш звонок в SetBkColor
устанавливает цвет текст фон, который разные из цвета фона элемента управления. Вот почему мы называем SetBkMode
с TRANSPARENT
параметр, чтобы «сказать», что мы хотим, чтобы текстовый фон соответствовал фону элемента управления.
В вашем случае я использовал стоковую кисть, потому что вам не нужно отслеживать ее, и вам не нужно удалять ее, когда она больше не нужна.
Тем не менее, могут быть случаи, когда вам понадобится другой цвет. В этом случае вот что вам нужно сделать:
HBRUSH
переменная или static HBRUSH
Переменная в вашем окне / диалоговом режиме.WM_CREATE
если в оконной процедуре. Если в диалоговом окне инициализировать кисть в WM_INITDIALOG
, Что-то вроде someBrush = CreateSolidBrush( RGB( 255, 0, 255 ) );
Увидеть документация для получения дополнительной информации и примеров.return (LRESULT)someBrush
для оконной процедуры, или return (INT_PTR)someBrush
для диалогового окна).WM_DESTROY
с DeleteObject(someBrush);
вызов. Я настоятельно советую вам сделать удаление в ответ на WM_DESTROY
вместо WM_CLOSE
потому что это сообщение, которое ваше окно всегда будет получать, а WM_CLOSE
иногда может быть пропущен (поиск в Интернете, чтобы найти примеры для этого сценария).
Надеюсь, это поможет, если у вас есть дополнительные вопросы, оставьте комментарий, и я постараюсь помочь. С наилучшими пожеланиями.