为什么 GetDC 功能不起作用?

Why GetDC function does not works?

我正在用 Win32 创建一个游戏 API 并试图用下面的代码自己绘制一个按钮:

HWND button = CreateWindow("BUTTON", "", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 100, 100, 250, 40, hwnd, NULL, instance, NULL);
HDC dc = GetWindowDC(button);
TextOut(dc, 10, 10, "test", 5);
ReleaseDC(button, dc);

我想给大家说明一下,我已经尝试了很多情况和各种函数,像FillRect, MoveTo, DrawText ...重点是在WM_CTLCOLORBTN,在这里我使用 wParam 获取按钮的 HDC。我不明白为什么它不起作用。也许 GetDC 功能有问题?我应该使用哪个功能? 我指定我尝试使用其他函数,例如 GetDC 或 BeginPaint/EndPaint。 我需要做什么??

使用 BS_OWNERDRAW 样式时,您需要处理(并执行绘图)WM_DRAWITEM message in the parent window's windproc. This is explicitly stated in the Button Styles documentation:

BS_OWNERDRAW
Creates an owner-drawn button. The owner window receives a WM_DRAWITEM message when a visual aspect of the button has changed. Do not combine the BS_OWNERDRAW style with any other button styles.

WM_DRAWITEM message is a pointer to a DRAWITEMSTRUCT 结构的 lParam,其中包含必须用于绘图等的 HDC

hDC
A handle to a device context; this device context must be used when performing drawing operations on the control.