如何在标准按钮 WinApi 上绘图
Posted
技术标签:
【中文标题】如何在标准按钮 WinApi 上绘图【英文标题】:How to draw on standart button WinApi 【发布时间】:2021-07-10 06:55:07 【问题描述】:我想在按钮上画一个简单的正方形。
我在其中创建了一个常规窗口和一个常规按钮。现在,在我的窗口的窗口过程中,在WM_PAINT
消息中,我得到了我的按钮的HDC
并绘制了一个正方形:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (message == WM_PAINT)
PAINTSTRUCT ps;
HDC my_hdc = BeginPaint(hWnd, &ps);
//---------------------------------------------
HDC my_button_HDC = GetDC(GetDlgItem(hWnd, 11)); //Get HDC my button
Rectangle(my_button_HDC, 5, 5, 30, 30);
//---------------------------------------------
EndPaint(hWnd, &ps);
WinMain()
//standart code create window and button...
创建窗口时,按钮上不会出现正方形。仅当我将窗口向下移到屏幕外并将其抬起时才会出现。
但是,只要我调整窗口大小或单击按钮,方块就会再次消失。
我不明白为什么会这样。
【问题讨论】:
Subclassing Controls. IInspectable,遗憾的是不明白它是如何解决问题的,问题是什么。 问题是按钮会自己绘制并抹掉您绘制的内容。要更改控件的外观,您需要对其进行子类化,以便拦截绘画消息并修改其行为。 Jonathan Potter,谢谢,请告诉我,我在哪里可以看到一个例子,需要截取什么消息以及如何重新配置? Subclassing the Window Class of an Existing Control. 【参考方案1】:只有在绘制其父窗口时,您才在按钮上绘图(另外,您正在泄漏按钮的HDC
)。调整窗口大小并不总是会触发重绘。
但即使它这样做了,当按钮本身绘制自身时,它也会绘制你已经绘制的任何东西。
在标准 Win32 按钮上绘制的正确方法是:
给按钮BS_OWNERDRAW
样式,然后让它的父窗口处理WM_DRAWITEM
消息。
如果正在使用ComCtl32.dll
v6(请参阅Enabling Visual Styles),父窗口可以代替处理NM_CUSTOMDRAW
消息,不需要BS_OWNERDRAW
。详情请见Custom Draw。
【讨论】:
以上是关于如何在标准按钮 WinApi 上绘图的主要内容,如果未能解决你的问题,请参考以下文章