WinAPI - 如何绘制虚线?

时间:2009-02-12 13:13:26

标签: windows winapi gdi

我使用WinAPI GDI方法创建HPEN:

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

然后使用方法MoveToExLineTo绘制线条。

实际上绘制的线是虚线。 3个像素为空,3个像素为彩色 - 虚线。

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

4 个答案:

答案 0 :(得分:5)

这是我在CodeProject上找到的MaxHacher的精彩解决方案 (http://www.codeproject.com/KB/GDI/DOTTED_PEN.aspx

LOGBRUSH LogBrush;
LogBrush.lbColor = color;
LogBrush.lbStyle = PS_SOLID;
HPEN hPen = ExtCreatePen( PS_COSMETIC | PS_ALTERNATE, 1, &LogBrush, 0, NULL );

效果很好!

答案 1 :(得分: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'位。它运作良好,增加了有用的线条。

答案 2 :(得分:0)

我没试过这个,但是可能值得查看

的结果

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

笔宽度为零会导致GDI始终使笔宽一个像素,无论与设备上下文关联的缩放比例如何。这可能足以得到你想要的点。

答案 3 :(得分: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);
}