4

我使用 WinAPI GDI 方法创建 HPEN:

HPEN hPen = CreatePen(PS_DOT, 1, color);

然后使用方法MoveToEx和画线LineTo

事实上画线是虚线。3 个空像素,3 个带颜色像素——虚线。

为什么 PS_DOT 样式不画虚线?如何使用 WinAPI 绘制虚线?

4

4 回答 4

5

这是我在 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 );

它运作良好!

于 2009-02-12T14:00:10.723 回答
1

我过去也有这个问题。我求助于使用 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”位。它运行良好并增加了有用的线条样式。

于 2009-02-12T13:27:43.640 回答
0

我还没有尝试过,但可能值得检查结果

HPEN hPen = CreatePen(PS_DOT, 0, color);

笔宽为零会导致 GDI 始终使笔宽 1 个像素,而不管与设备上下文相关的缩放比例如何。这可能足以获得您想要的点。

于 2009-02-12T13:22:19.020 回答
0

我用这个而不是上面的来避免连续两个像素

void LineDDAProc(int x, int y, LPARAM lpData)
{
   LineData* pData = (LineData*) lpData;

   if (x%2!=y%2)
    pData->pDC->SetPixel(x, y, pData->crForegroundColor);
}
于 2018-10-16T13:58:18.843 回答