WIN32API:所有者绘制的按钮在单击时在文本周围创建白色背景

Posted

技术标签:

【中文标题】WIN32API:所有者绘制的按钮在单击时在文本周围创建白色背景【英文标题】:WIN32API: owner-drawn button creates white background around the text when clicked 【发布时间】:2014-09-06 09:28:25 【问题描述】:

我创建了一个所有者绘制的按钮。我使用 WM_CTLCOLORBTN 消息来绘制它:

//get the text of the button
         wchar_t buttonText[20]; 
         int textLength = SendMessage((HWND)lParam,WM_GETTEXT,20,(LPARAM)buttonText);

         Font FootlightMTLight(L"Footlight MT Light",20,0,false,false,false,L"Black");
         SelectObject((HDC)wParam,FootlightMTLight.getWindowHandle());

         TextOut((HDC)wParam,30,15,buttonText,textLength);
         SetTextColor((HDC)wParam, RGB(0,0,0));
         SetBkColor((HDC)wParam, RGB(229,255,229));

         PatBlt((HDC)wParam,0,0,1,50,BLACKNESS); //x,y,width,height
         PatBlt((HDC)wParam,269/2-1,0,1,50,BLACKNESS);
         PatBlt((HDC)wParam,0,49,269/2,1,BLACKNESS);
         PatBlt((HDC)wParam,0,0,269/2,1,BLACKNESS);

        static HBRUSH handleToButtonBrush = CreateSolidBrush(RGB(229,255,229));
        return (INT_PTR)handleToButtonBrush;

“Font”是我创建的一个对象(我用类等包装了 HFONT 句柄和 CreateFont 函数。getWindowHandle() 基本上返回 HFONT)。

按钮渲染得很好,但按下它会使文本背景变成白色。 我在网上搜索了一个原因和一个解决方案,但我没有找到一个具体的。 提前感谢!

【问题讨论】:

【参考方案1】:

您需要在实际绘制文本之前调用这些行

SetTextColor((HDC)wParam, RGB(0,0,0));
SetBkColor((HDC)wParam, RGB(229,255,229));
TextOut((HDC)wParam,30,15,buttonText,textLength);

【讨论】:

SetBkMode 为透明,这样您就不必记住背景颜色是什么。

以上是关于WIN32API:所有者绘制的按钮在单击时在文本周围创建白色背景的主要内容,如果未能解决你的问题,请参考以下文章

来自子控件的键盘消息

如何在按钮单击时在一个视图控制器中正确启用和禁用约束

如何在 Win32 中使用对话框资源?

win32 C++上的按钮样式

通过按钮将矩形绘制到画布上

单击按钮时在剪贴板中复制文本区域的文本