绘制折线导致像素化线

时间:2012-06-13 09:13:44

标签: c++ winapi gdi

我正在尝试创建自己的Native win32 C ++ Checkbox,它可以具有透明背景。我们的想法是使窗口/窗口小部件看起来与Windows XP样式复选框完全相同,只是它可以具有透明背景。

我的问题:当我为我的文本框绘制勾号时,'tick'行看起来像素化和锯齿状 - 请参阅下面的图片了解它的外观。它看起来不像实际的复选框那样平滑。

左边的复选框是我的,右边是我试图复制的默认窗口: enter image description here

如何使我的刻度平滑而不像素化。什么是Win32 GDI函数,我可以使用它绘制刻度线。我应该使用位图图像而不是在GDI中绘制勾号吗?目前我使用PolylineTo()绘制刻度线。也许我应该使用PolylineToEx()?

非常感谢任何建议。

用于绘制刻度的代码(此代码在WM_PAINT中):

 HGDIOBJ hPen      = CreatePen(PS_SOLID, 2, RGB(45,45,45)); //ExtCreatePen(PS_COSMETIC, dwPenStyle[i], 1, &lb, 0, NULL); 
 HGDIOBJ hPenOld   = SelectObject(hdc, hPen); 
 POINT tickPnts[3] = {{3,((height-CHECK_RECTH)/2)+6}, {5,((height-CHECK_RECTH)/2)+9}, {9,((height-CHECK_RECTH)/2)+2}};
 MoveToEx(hdc, tickPnts[0].x, tickPnts[0].y, NULL);
 PolylineTo(hdc, tickPnts, 3);
 SelectObject(hdc, hPenOld); 
 DeleteObject(hPen); 

2 个答案:

答案 0 :(得分:2)

Windows使用Marlett字体来呈现复选框刻度,窗口框架按钮和其他可伸缩的UI元素。您可以使用消除锯齿渲染字体以获得平滑边缘。

(无论如何这当然是真的;我不确定Windows 7中的新窗口框架按钮是否使用该字体,但字体仍然存在。)

GDI没有做任何抗锯齿,这就是为什么你的线看起来是锯齿状的。

答案 1 :(得分:-1)

标准复选框可以是透明的。请参阅此页面以获取示例:

http://us.generation-nt.com/answer/transparent-background-color-checkbox-help-27571202.html

在Winforms中,您只需将背景颜色设置为Transparent