2015-01-01 2 views
5

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

+2

Я рекомендую вам посмотреть 'WM_CTLCOLORSTATIC' –

+2

Прочтите статью MSDN, в которой говорится о возврате кисти. –

ответ

5

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

  • цвет текста
  • фон текста
  • ба элемента управления ckground

Для того, чтобы нарисовать полный контроль в желаемый цвет вы должны вернуть кисть нужного цвета (return (LRESULT)someBrush для оконной процедуры или return (INT_PTR)someBrush диалогового окна для).

Ваш вызов SetBkColor устанавливает цвет текста фона, который отличается от цвета фона элемента управления. Вот почему мы вызываем SetBkMode с параметром TRANSPARENT, чтобы «сказать», что мы хотим, чтобы фон текста соответствовал фону управления.

В вашем случае я использовал кисть, потому что вам не нужно отслеживать ее, и вам не нужно ее удалять после того, как она больше не понадобится.

Тем не менее, могут быть случаи, когда вам понадобится другой цвет. В этом случае здесь является то, что вы должны сделать:

  • Создать глобальную переменную или HBRUSHstatic HBRUSH переменную в файле/диалоговой процедуре окна.
  • Инициализировать эту переменную в ответ на WM_CREATE, если в процедуре окна. Если в диалоговом режиме инициализируйте кисть в WM_INITDIALOG. Что-то вроде someBrush = CreateSolidBrush(RGB(255, 0, 255)); См. documentation для получения дополнительной информации и примеров.
  • верните эту кисть, как я показал вам в приведенном выше примере (return (LRESULT)someBrush для процедуры окна, или return (INT_PTR)someBrush для диалогового окна).
  • Удалите кисть, когда она больше не нужна. Обычно это делается в WM_DESTROY с вызовом DeleteObject(someBrush);.

Я настоятельно советую вам сделать удаление в ответ на WM_DESTROY вместо WM_CLOSE потому, что это сообщение Ваше окно всегда будет получать, в то время как WM_CLOSE иногда могут быть пропущены (поиск в Интернете, чтобы найти примеры для этого сценария).

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

+0

Цитата из MSDN: «Не нужно (но не вредно) удалять объекты запаса, вызывая« DeleteObject ». – 0xC0000022L

Смежные вопросы