我一直在寻找问题的答案,但似乎找不到适合我的解决方案...可能是因为我可能认为这全错了。
我正在尝试创建一个基本的窗口,该窗口使用C++中的WIN32 API以大红色字体弹出一串文本。
我曾尝试在WindowProcedure中使用WM_CTLCOLORSTATIC控件,但似乎无法使文本更改颜色。但是,我能够使用WM_CREATE创建文本,所以我对自己做错了感到困惑...
这是我到目前为止所写的。
#include <iostream>
#include <windows.h>
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
HWND textfield;
HDC hdc;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nccmdshow) {
WNDCLASSW wc = { 0 };
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hInstance = hInst;
wc.lpszClassName = L"myWindowClass";
wc.lpfnWndProc = WindowProcedure;
if (!RegisterClassW(&wc))
return -1;
CreateWindowW(L"myWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 500, 200, 1000, 500,
NULL, NULL, NULL, NULL);
MSG msg = {0};
while (GetMessage(&msg, NULL, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_CREATE:
textfield = CreateWindow(L"STATIC", L"DEBOODAH!", WS_VISIBLE | WS_CHILD , 500, 100, 300, 25, hWnd, NULL, NULL, NULL);
break;
case WM_CTLCOLORSTATIC:
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProcW(hWnd, msg, wp, lp);
}
}
任何帮助将不胜感激!
最佳答案
WM_CTLCOLORSTATIC消息在wParam中获取设备上下文句柄(HDC
)。使用方法如下:
case WM_CTLCOLORSTATIC:
SetTextColor((HDC)wp, RGB(255, 0, 0));
return DefWindowProcW(hWnd, msg, wp, lp);
文字大小是一个完全不同的故事。创建静态窗口后,必须构造字体并将其提供给静态窗口:
case WM_CREATE:
textfield = CreateWindow(/*...*/);
HFONT hf = CreateFont(/*size=*/-12, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L"MS Sans Serif");
SendMessage(textfield, WM_SETFONT, (WPARAM)hf, 0);
break;
也可以按照塞巴斯蒂安的建议画自己的文字。
关于c++ - 如何使用WIN32 API for C++更改文本的颜色和大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61032209/