【问题标题】:WinAPI - how to draw dotted line?WinAPI - 如何绘制虚线?
【发布时间】:2010-10-07 04:05:54
【问题描述】:

我使用 WinAPI GDI 方法创建 HPEN:

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

然后使用MoveToExLineTo方法画线。

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

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

【问题讨论】:

    标签: windows winapi gdi


    【解决方案1】:

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

    效果很好!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • :( 相同的结果 - 虚线 (3x3)。
        • Drat,我希望这是一个快速的解决方案。在这种情况下,我怀疑您需要使用 SAMills 的答案。
        【解决方案4】:

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

        void LineDDAProc(int x, int y, LPARAM lpData)
        {
           LineData* pData = (LineData*) lpData;
        
           if (x%2!=y%2)
            pData->pDC->SetPixel(x, y, pData->crForegroundColor);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-15
          • 2020-10-24
          • 1970-01-01
          • 2021-04-18
          • 2011-08-31
          • 2019-01-09
          • 2013-02-27
          • 1970-01-01
          相关资源
          最近更新 更多