我使用 WinAPI GDI 方法创建 HPEN:
HPEN hPen = CreatePen(PS_DOT, 1, color);
然后使用方法MoveToEx
和画线LineTo
。
事实上画线是虚线。3 个空像素,3 个带颜色像素——虚线。
为什么 PS_DOT 样式不画虚线?如何使用 WinAPI 绘制虚线?
这是我在 CodeProject
( http://www.codeproject.com/KB/GDI/DOTTED_PEN.aspx )上找到的 MaxHacher 的绝妙解决方案
LOGBRUSH LogBrush;
LogBrush.lbColor = color;
LogBrush.lbStyle = PS_SOLID;
HPEN hPen = ExtCreatePen( PS_COSMETIC | PS_ALTERNATE, 1, &LogBrush, 0, NULL );
它运作良好!
我过去也有这个问题。我求助于使用 LineDDA 和回调过程。
struct LineData{
CDC* pDC;
COLORREF crForegroundColor;
COLORREF crBackgroundColor;
};
.
.
.
LineData* pData = new LineData;
pData->crForegroundColor = crForegroundColor;
pData->crBackgroundColor = crBackgroundColor;
pData->pDC = pdc;
LineDDA(nStartx, nStarty, nEndPointX, nEndPointY, LineDDAProc, (LPARAM) pData);
delete pData;
.
.
.
void
LineDDAProc(int x, int y, LPARAM lpData)
{
static short nTemp = 0;
LineData* pData = (LineData*) lpData;
if (nTemp == 1)
pData->pDC->SetPixel(x, y, pData->crForegroundColor);
else
pData->pDC->SetPixel(x, y, pData->crBackgroundColor);
nTemp = (nTemp + 1) % 2;
}
可能不是最有效的绘图算法,但您现在也可以完全控制点间距。我采用这种方法是因为我使用了其他非原生笔样式来进行线条渲染,它们使用了位模式。然后我走位并使用 setpixel 作为“on”位。它运行良好并增加了有用的线条样式。
我还没有尝试过,但可能值得检查结果
HPEN hPen = CreatePen(PS_DOT, 0, color);
笔宽为零会导致 GDI 始终使笔宽 1 个像素,而不管与设备上下文相关的缩放比例如何。这可能足以获得您想要的点。
我用这个而不是上面的来避免连续两个像素
void LineDDAProc(int x, int y, LPARAM lpData)
{
LineData* pData = (LineData*) lpData;
if (x%2!=y%2)
pData->pDC->SetPixel(x, y, pData->crForegroundColor);
}