绘制折线导致像素化线

Posted

技术标签:

【中文标题】绘制折线导致像素化线【英文标题】:Drawing Polyline results in pixelated line 【发布时间】:2012-06-13 09:13:43 【问题描述】:

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

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

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

我怎样才能使我的刻度平滑而不像素化。 什么是我可以用来绘制刻度的 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); 

【问题讨论】:

我的 GDI+ 非常生锈,但我怀疑您可能想查看纹理画笔的使用情况,并使用带有 alpha 混合边缘的小圆形纹理。您可以从画笔创建一支笔,然后像以前一样绘制多段线。 【参考方案1】:

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

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

GDI 不做任何抗锯齿,这就是为什么你的线条看起来参差不齐的原因。

【讨论】:

感谢您的信息。有没有一种 WinAPI C++ 方法可以使用 Marlett 字体绘制刻度? 使用 CreateFont 创建字体句柄,将其选择到设备上下文中并使用 TextOut 写入文本。小写的“a”和“b”是 Marlett 中的记号。【参考方案2】:

标准复选框可以是透明的。有关示例,请参见此页面:

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

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

【讨论】:

以上是关于绘制折线导致像素化线的主要内容,如果未能解决你的问题,请参考以下文章

Unity性能优化 - Overdraw篇

Linux 绘制像素缓冲区

从代码(PaintCode)绘制的视图是像素化的,缩放时非常像素化

canvas使用图像(绘制图、图像平铺、图像剪裁、像素处理、绘制文字)

OpenGL - 将像素绘制到屏幕上?

试图制作一个绘制像素的着色器