Можно ли изменить цвет фона элемента управления только для чтения

введите описание изображения здесьЯ пытался найти простое решение для изменения цвета элемента управления редактирования, который имеет флаг 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 на моем другом элементе редактирования, он будет работать на нем. Я создаю программу чата и не хочу, чтобы пользователь мог печатать в области чата. И когда он только для чтения, он становится серо-серым, но я хочу белый цвет. Есть ли другой способ сделать это? Кроме того, цвет только окрашивает область, в которой находится текст, а не всю высоту элемента управления для редактирования. Что я делаю неправильно?

6

Решение

Вам нужно создать кисть и следить за ней. Затем вы возвращаете эту кисть вместо 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 иногда может быть пропущен (поиск в Интернете, чтобы найти примеры для этого сценария).

Надеюсь, это поможет, если у вас есть дополнительные вопросы, оставьте комментарий, и я постараюсь помочь. С наилучшими пожеланиями.

7

Другие решения