如何在标准按钮 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 上绘图的主要内容,如果未能解决你的问题,请参考以下文章

如何找出winapi的主要鼠标按钮?

WinAPI:如何强制 DATETIMEPICKER 使用标准日历而不是本地日历设置

如何使用在单击按钮上创建的用户触发放大和缩小绘图图表?

使用 WINAPI 如何更改复选框按钮的值?

如何在我的 GUI 上绘图

单击按钮时如何保存画布绘图并显示它