如何绘制没有3d框架的复选框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何绘制没有3d框架的复选框相关的知识,希望对你有一定的参考价值。

我使用DrawFrameControl函数绘制一个复选框:

DrawFrameControl(hdc, &r, DFC_BUTTON,  DFCS_CHECKED);

这是结果:

enter image description here

但我不需要3D框架,我需要一个简单的1像素框架,如下所示:

enter image description here

如果我传递给DrawFrameControl函数一个DFCS_FLAT标志,那么我得到一个大胆的框架:enter image description here

有没有办法绘制一个1像素边框的复选框?

答案

使用DrawThemeBackground绘制不同状态的复选框。

也可以看看 Parts and States Visual Styles Reference

HTHEME htheme = OpenThemeData(hwnd, L"BUTTON");
if(htheme)
{
    DrawThemeBackground(htheme, hdc, BP_CHECKBOX, CBS_CHECKEDNORMAL, &rc, 0);
    CloseThemeData(htheme);
}

必填标题和图书馆:

<Uxtheme.h>
<vsstyle.h>
"Uxtheme.lib"
另一答案

我需要绘制一个与网络适配器属性窗口中看起来完全相同的复选框图像,例如:

enter image description here

为什么我不想使用DrawThemeBackground功能?首先,我需要绘制与上述完全相同的复选框的外观。其次,DrawThemeBackground函数仅在启用Windows主题时才有效,并且复选框将显示为主题。

DrawFrameControl函数使用复选框绘制3d边框。这不合适。所以我决定使用RectangleMoveToExLineTo函数编写复选框绘图代码:

HPEN old_pen = (HPEN)SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(128, 128, 128)));
HBRUSH old_brush = (HBRUSH)SelectObject(hdc, CreateSolidBrush(RGB(255, 255, 255)));

Rectangle(hdc, 0, 0, 11, 11);
DeleteObject(SelectObject(hdc, old_pen));
DeleteObject(SelectObject(hdc, old_brush));

old_pen = (HPEN)SelectObject(hdc, CreatePen(PS_SOLID, 2, RGB(0, 0, 0)));

MoveToEx(hdc, 1, 4, NULL);
LineTo(hdc, 5, 8);
MoveToEx(hdc, 4, 7, NULL);
LineTo(hdc, 9, 2);

DeleteObject(SelectObject(hdc, old_pen));
old_pen = (HPEN)SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(255, 255, 255)));

MoveToEx(hdc, 1, 3, NULL);
LineTo(hdc, 1, 6);
MoveToEx(hdc, 1, 6, NULL);
LineTo(hdc, 4, 9);
MoveToEx(hdc, 4, 9, NULL);
LineTo(hdc, 9, 4);
MoveToEx(hdc, 9, 4, NULL);
LineTo(hdc, 9, 1);

DeleteObject(SelectObject(hdc, old_pen));

我得到了理想的结果:

enter image description here

以上是关于如何绘制没有3d框架的复选框的主要内容,如果未能解决你的问题,请参考以下文章

ImGUI 1.87 绘制D3D外部菜单

如何在Android上使用OpenGL ES 2.0绘制点

如何在没有 QCheckBox 框的情况下绘制本机复选标记

Android:如何在 FrameLayout 元素中绘制?

three.js入门——画一个3D正方体

D3D11:如何将 GDI 文本绘制到 GXDI 表面? (没有 D2D)