WinAPI - 如何绘制虚线?

发布于 2024-07-13 17:31:52 字数 262 浏览 4 评论 0原文

我使用 WinAPI GDI 方法创建 HPEN:

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

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

事实上,绘制的线是虚线。 3 个像素为空,3 个像素为颜色——虚线。

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

I create HPEN using WinAPI GDI method:

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

Then draw line using the methods MoveToEx and LineTo.

In fact drawn line is dashed. 3 pixels empty, 3 pixels with color -- dashed line.

Why PS_DOT style doesn't draw dotted line?
How to draw dotten line using WinAPI?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

迷荒 2024-07-20 17:31:52

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

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

效果很好!

Here is wonderful solution by MaxHacher that I've found on CodeProject
(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 );

It works well!

小红帽 2024-07-20 17:31:52

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

I too had this problem in the past. I resorted to using LineDDA and a callback proc.

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;
}

Might not be the most efficient drawing algorithm, but you're now in complete control of dot spacing as well. I went with this approach because there were other non-native pen styles I was using for line rendering which used a bit pattern. I then walked the bit and used setpixel for the 'on' bits. It worked well and increased the useful linestyles.

执手闯天涯 2024-07-20 17:31:52

我还没有尝试过这个,但可能值得检查

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

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

I haven't tried this, but it might be worth checking the results from

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

A pen width of zero causes GDI to always make the pen one pixel wide, regardless of the scaling associated with the device context. This may be enough to get the dots you want.

眼睛会笑 2024-07-20 17:31:52

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

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

   if (x%2!=y%2)
    pData->pDC->SetPixel(x, y, pData->crForegroundColor);
}

I used this instead of the above to avoid two pixels in a row

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

   if (x%2!=y%2)
    pData->pDC->SetPixel(x, y, pData->crForegroundColor);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文