我使用WinAPI GDI方法创建HPEN:
HPEN hPen = CreatePen(PS_DOT, 1, color);
然后使用方法MoveToEx
和LineTo
绘制线条。
实际上绘制的线是虚线。 3个像素为空,3个像素为彩色 - 虚线。
为什么PS_DOT样式不会绘制虚线? 如何使用WinAPI绘制dotten线?
答案 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);
}