#winapi #colors #windows-10 #groupbox
#winapi #Цвет #windows-10 #groupbox
Вопрос:
Я обрабатываю WM_CTLCOLORSTATIC
это так:
case WM_CTLCOLORSTATIC:
{
HWND fromHwnd = (HWND) lParam;
if(fromHwnd == hGroupBox)
{
HDC hdcStatic = (HDC) wParam;
SetTextColor(hdcStatic, RGB(255, 255, 0));
SetBkMode(hdcStatic, TRANSPARENT);
return (LRESULT) bckBrush;
}
}
break;
Он использует возвращенную кисть в качестве цвета фона, но SetTextColor()
не имеет никакого эффекта вообще. Чего мне не хватает?
Вот весь мой код:
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "Comctl32.lib")
#pragma comment(lib, "Gdi32.lib")
#define WIN32_LEAN_AND_MEAN
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <Commctrl.h>
#include <crtdbg.h>
#include <strsafe.h>
#include <string.h>
#include <assert.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HWND hGroupBox;
HBRUSH bckBrush;
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PWSTR pCmdLine, int nCmdShow)
{
MSG msg = {0};
HWND hwnd;
WNDCLASSW wc = {0};
wc.lpszClassName = L"Window";
wc.hInstance = hInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(0, IDC_ARROW);
if(!RegisterClass(amp;wc)) {
assert(!"register class error");
}
bckBrush = CreateSolidBrush(RGB(0, 128, 0));
int width = 500;
int height = 350;
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
int cx = (screenWidth - width) / 2;
int cy = (screenHeight - height) / 2;
hwnd = CreateWindowW(wc.lpszClassName, L"Window",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
cx, cy, width, height, NULL, NULL,
hInstance, NULL);
while (GetMessage(amp;msg, NULL, 0, 0))
{
if (!IsDialogMessage(hwnd, amp;msg))
{
TranslateMessage(amp;msg);
DispatchMessage(amp;msg);
}
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
CreateWindowW(L"Static", L"This is label 1...",
WS_VISIBLE | WS_CHILD | WS_TABSTOP,
50, 10, 130, 25, hwnd, (HMENU) 18, NULL, NULL);
CreateWindowW(L"Static", L"This is label 2...",
WS_VISIBLE | WS_CHILD | WS_TABSTOP,
50, 40, 130, 25, hwnd, (HMENU) 19, NULL, NULL);
hGroupBox =
CreateWindowW(L"button", L"Pick a city",
WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_GROUPBOX,
50, 75, 200, 150, hwnd,
(HMENU) 20, NULL, NULL);
break;
case WM_CTLCOLORSTATIC:
{
HWND fromHwnd = (HWND) lParam;
if(fromHwnd == hGroupBox)
{
HDC hdcStatic = (HDC) wParam;
SetTextColor(hdcStatic, RGB(255, 255, 0));
SetBkMode(hdcStatic, TRANSPARENT);
return (LRESULT) bckBrush;
}
}
break;
case WM_DESTROY:
DeleteObject(bckBrush);
bckBrush = NULL;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Комментарии:
1. Код сработал для меня, вы добавили проверку ошибок
SetTextColor
и убедились, что виртуализация явно включена.2. Я добавил проверку ошибок: `assert(SetTextColor(hdcStatic, RGB(255, 255, 0)) != CLR_INVALID); assert(SetBkMode(hdcStatic, ПРОЗРАЧНЫЙ) != 0);` все проходит нормально. На какую именно виртуализацию вы ссылаетесь? Я не запускаю это на виртуальной машине, а только на обычных окнах
3. Вы можете проверить, включена ли виртуализация в Performance в диспетчере задач. Если он не включен, вам нужно включить его в BIOS.
4. Зачем мне это нужно для запуска этого простого пользовательского приложения с использованием WINAPI? Всем ли, использующим это приложение, тоже нужно это включить?
5. Вы запускали программу в других тестовых средах? Я протестировал его в нескольких системных средах, и у меня это сработало. Возможно, из-за некоторых настроек шрифт отображался неправильно.