visual c++ 在 presubclass 按钮中绘制一个高质量的图标

Posted

技术标签:

【中文标题】visual c++ 在 presubclass 按钮中绘制一个高质量的图标【英文标题】:visual c++ draw a good quality icon in a presubclass button 【发布时间】:2016-05-19 08:04:48 【问题描述】:

与许多开发人员一样,我尝试在按钮上加载不同的图像以实现按钮的不同状态(正常、悬停和单击)。 我开始包含一个 64x64 尺寸

的图标

我定义了自己的控制按钮,尺寸为 35x35

CONTROL         "INV",IDC_SENSINV,"Button",BS_OWNERDRAW | WS_TABSTOP,75,106,35,35

我定义了一个预子类按钮,在 drawItem 函数中,我得到了矩形、加载图标和绘制图标:

void CimageButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem; //rect of 53x57 ??
UINT state = lpDrawItemStruct->itemState;

hIcon = (HICON)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(i_iconeNormal)

DrawIconEx(*pDC,
    0,
    2,
    (HICON)hIcon,
    53,
    53,
    0, NULL, DI_NORMAL);

我的问题是绘制的图标质量不好,我不明白为什么

我的按钮大小为 35x35,矩形为 53x57 图标应该是哪个尺寸(比按钮小或大) 获得最佳绘制图标质量的方法是什么

希望能说清楚,提前感谢帮助。

【问题讨论】:

最好为按钮图像使用位图。 【参考方案1】:

改用LoadImage。使用您想要的确切图标大小。例如 32x32。如果您的图标是 48x48,则改为使用它,这将阻止图标调整大小。

hIcon被绘制后就不需要了,所以销毁它以防止资源泄漏。

HICON hIcon = (HICON)LoadImage(GetModuleHandle(NULL), 
    MAKEINTRESOURCE(i_iconeNormal), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);

DrawIconEx(*pDC, 0, 2, hIcon, 32, 32, 0, NULL, DI_NORMAL);
DestoryIcon(hIcon);

【讨论】:

你是对的,最好的图标大小等于矩形以获得最佳质量。如果你想调整你的图标大小,你需要注意你的图标大小具有相同的垂直和水平调整系数。【参考方案2】:

LoadIcon 总是以默认大小(通常为 32x32)加载图标。因此,图标在绘制时缩小,然后再次展开。

始终使用LoadImage 来检索具有不同大小的图标。 也踩docs

【讨论】:

以上是关于visual c++ 在 presubclass 按钮中绘制一个高质量的图标的主要内容,如果未能解决你的问题,请参考以下文章

visual c++是啥?

visual c++是啥?

如何在visual c++中使用OpenGL

visual c++ 6.0编译时总有一个错误是怎么回事?

我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?

Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?