Устанавливаем цвет элемента окна
Изменение цвета элементов в окне, оказывается, не совсем тривиальная задача. Представленный ниже алгоритм изменения цвета элемента окна не подойдет для кнопок. С кнопками мы будем разбираться в отдельном примере. Важнейшую роль в изменении цвета элемента окна играет сообщени WM_CTLCOLOREDIT, которое приходит на функцию окна, когда одно из полей редактирвания должно быть нарисовано в основном окне. И так рассмотрим пример, который меняет цвет поля редактирования и цвет букв.
#include <Windows.h>
LRESULT CALLBACK winproc( HWND, UINT, WPARAM, LPARAM);
WNDCLASSEXW ws; //струкутра для регистрации класса окон
wchar_t * wn = L"class1"; //имя класса
MSG msg; //для сообщения
HWND hwnd,hb1; //для дескриптора окна
HBRUSH hc;
HINSTANCE h;
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
h=hInstance; ws.cbSize = sizeof(WNDCLASSEXW); ws.cbClsExtra = 0;
ws.cbWndExtra = 0; ws.hIcon = LoadIcon( NULL, IDI_APPLICATION );
ws.hCursor = LoadCursor( NULL, IDC_ARROW );
ws.hbrBackground = CreateSolidBrush(RGB(0, 80, 80));
ws.hIcon = NULL; ws.hInstance = hInstance;
ws.lpszClassName = wn; ws.lpszMenuName = NULL;
ws.lpfnWndProc = (WNDPROC)winproc; ws.style = CS_VREDRAW|CS_HREDRAW;
//зарегистрировать класс окна
if(RegisterClassExW(&ws)==0){
MessageBoxExW(0,L"Ошибка регистрации!",L"Сообщение", 0, 0); return 0;
};
//создать окно
hwnd= CreateWindowExW(0, wn,
L"Окно в 64-битово системе!", WS_OVERLAPPEDWINDOW,
10, 10, 400, 300, NULL, NULL, hInstance, NULL);
//сделать окно видимым
ShowWindow( hwnd, nCmdShow );
//обновить содержимое
UpdateWindow(hwnd );
//цикл обработки сообщений
while ( GetMessage( &msg, NULL, NULL, NULL ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
//выход из программы
return (int)msg.wParam;
}
//функция окна
LRESULT CALLBACK winproc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch ( uMsg ) {
case WM_CREATE:
hc=CreateSolidBrush(RGB(250, 80, 80));
hb1=CreateWindowExW(0,L"Edit", L"",
WS_CHILD | WS_VISIBLE |WS_TABSTOP | ES_AUTOHSCROLL | WS_BORDER,
10, 50, 200, 20, hWnd, 0, h, NULL);
break;
case WM_CTLCOLOREDIT:
if(lParam==(int)hb1){//именно это поле редактирования?
SetTextColor((HDC)wParam,RGB(0,50,100));
SetBkMode((HDC)wParam,TRANSPARENT);
return (BOOL)hc;
}
break;
case WM_DESTROY:
PostQuitMessage(0); break;
}
return DefWindowProc( hWnd, uMsg, wParam, lParam );
};
Программа довольно прозрачна и почти не требует пояснений. Все же сделаем ряд замечаний. Для того, чтобы задать цвет элемента необходимо создать кисть. Мы создаем ее при создании окна: hc=CreateSolidBrush(RGB(250, 80, 80));, но можно было бы создать и раньше, например, в начале программы. Вызов SetBkMode((HDC)wParam,TRANSPARENT); необходим для того, чтобы цвет элемента был задан именно таким, какой возвращается оператом return (BOOL)hc; . Для изменения цвета других элементов окна, необходимо отлавливать другие сообщения. Например, для настройки цвета списка используем сообщение WM_CTLCOLORLISTBOX ну и т.д.

Ну вот пока все. Наслаждайтесь программированием.

 Назад       Заметки       Сайт       Страница-портал       Журнал
(c) Copyright Владислава Юрьевич Пирогов