Я делаю приложение Win32 на C++. У меня статическое окно, и я хочу изменить цвет фона.
Я следил за тем, что предлагается здесь: как программно установить цвет фона статических элементов управления
Но в моем случае WM_CTLCOLORSTATIC никогда не запускается. Вы хоть представляете, что может происходить?
Вот часть моего кода:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case WM_CTLCOLORSTATIC:
hdc = reinterpret_cast<HDC>(wParam);
SetTextColor(hdc, RGB(2000, 50, 100));
SetBkColor(hdc, RGB(20, 150, 100));
if (!hBrushLabel) hBrushLabel = CreateSolidBrush(RGB(20, 150, 100));
return reinterpret_cast<LRESULT>(hBrushLabel);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_CREATE:
hBrushLabel = NULL;
AddBuyButtons(hWnd);
AddText(hWnd);
AddCartonesSlots(hWnd);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code that uses hdc here...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
if (hBrushLabel) DeleteObject(hBrushLabel);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
И моя функция изменения, которую я проверил, называется:
DWORD WINAPI changecolor(HWND h)
{
if (hBrushLabel) {
DeleteObject(hBrushLabel);
hBrushLabel = NULL;
}
InvalidateRect(h, NULL, TRUE);
return 0;
}
Надеюсь, ты сможешь мне помочь!
OMG, я такой глупый. Спасибо!
WM_CTLCOLORSTATIC
- это собственное оконное сообщение, но вы обрабатываете его, как если бы это был идентификатор меню для сообщения WM_COMMAND
. Вам нужно переместить обработчик case WM_CTLCOLORSTATIC
из внутреннего блока switch
во внешний блок switch
:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
}
}
break;
// MOVED HERE!!!
case WM_CTLCOLORSTATIC:
hdc = reinterpret_cast<HDC>(wParam);
SetTextColor(hdc, RGB(2000, 50, 100));
SetBkColor(hdc, RGB(20, 150, 100));
if (!hBrushLabel) hBrushLabel = CreateSolidBrush(RGB(20, 150, 100));
return reinterpret_cast<LRESULT>(hBrushLabel);
break;
case WM_CREATE:
hBrushLabel = NULL;
AddBuyButtons(hWnd);
AddText(hWnd);
AddCartonesSlots(hWnd);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code that uses hdc here...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
if (hBrushLabel) DeleteObject(hBrushLabel);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Вы поместили
case WM_CTLCOLORSTATIC
в неправильный оператор переключения.