Вам необходимо создать кисть и следить за ней. Затем вы возвращаете эту кисть вместо 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
, чтобы «сказать», что мы хотим, чтобы фон текста соответствовал фону управления.
В вашем случае я использовал кисть, потому что вам не нужно отслеживать ее, и вам не нужно ее удалять после того, как она больше не понадобится.
Тем не менее, могут быть случаи, когда вам понадобится другой цвет. В этом случае здесь является то, что вы должны сделать:
- Создать глобальную переменную или
HBRUSH
static 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
иногда могут быть пропущены (поиск в Интернете, чтобы найти примеры для этого сценария).
Надеюсь, что это поможет, если у вас возникнут дополнительные вопросы, оставьте комментарий, и я постараюсь помочь. С наилучшими пожеланиями.
Я рекомендую вам посмотреть 'WM_CTLCOLORSTATIC' –
Прочтите статью MSDN, в которой говорится о возврате кисти. –