【问题标题】:How to draw checkbox without 3d frame如何在没有 3d 框架的情况下绘制复选框
【发布时间】:2018-05-29 21:49:23
【问题描述】:

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

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

这是结果:

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

如果我将 DFCS_FLAT 标志传递给 DrawFrameControl 函数,那么我会得到一个粗体框:

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

【问题讨论】:

  • 视觉外观是用户设置。尊重它,不要对抗它。如果您确实需要完全控制外观(我强烈反对),请使用custom or owner-drawn controls

标签: c++ winapi checkbox controls draw


【解决方案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"

【讨论】:

  • 这如何回答“有没有办法绘制一个带有 1 像素边框的复选框?”这个问题? OP所说的?
  • @DavidRector 此方法绘制一个带有 1 像素边框的复选框。这是除了使用Rectangle API 手动绘制矩形之外的唯一方法
【解决方案2】:

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

为什么我不想使用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));

我得到了想要的结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2014-05-07
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多