我看到有些软件里画虚线特别细,好像隔几个像素点再画一个点的.
我自己在CreatePen的时候指定style参数为PS_DOT,宽度为0,画出来的虚线仍然感觉太粗,好像是连续画几个像素,再隔几个不画,然后接着画几个像素这样循环的,不适合做背景坐标线,请问各位还有没有办法画细一点的虚线,就是达到直线上每隔几个像素出现一个显示点,然后再隔几个像素出现一个显示点这种效果

解决方案 »

  1.   

    自己setPixel画线肯定细,1像素,间距自定,而且颜色深浅不同,视觉效果也不同
      

  2.   

    PS_DOT默认是画三个像素再空三个像素的,要实现真实虚线,推荐三种方法:
    1.间距长度固定为两个像素http://www.codeproject.com/KB/GDI/DOTTED_PEN.aspx
    LOGBRUSH LogBrush;
    LogBrush.lbColor = c_colorGridLine;
    LogBrush.lbStyle = PS_SOLID;
    CPen penDotted;
    penDotted.CreatePen( PS_COSMETIC | PS_ALTERNATE , 1, &LogBrush, 0, NULL );
    2.使用GDI+实现任意虚线
    void CExampleView::OnDraw(CDC* pDC)
    {
    CExampleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    using namespace Gdiplus;
    Graphics graphics(pDC->m_hDC);
    float dashValues[] = {1, 5};  //像素长度为1,间距长度为5
    Pen blackPen(Color(0,0,0), 0);
    blackPen.SetDashPattern(dashValues,2);
    graphics.DrawLine(&blackPen, Point(5, 15), Point(225, 15));
    }
    3.如楼上所说的自己用SetPixel描点
      

  3.   

    SetPixel确实效果明显,但是效率会不会比较低?
    我用SDK,GDI来画,
    LOGBRUSH LogBrush;
    LogBrush.lbColor = c_colorGridLine;
    LogBrush.lbStyle = PS_SOLID;
    CPen penDotted;
    penDotted.CreatePen( PS_COSMETIC | PS_ALTERNATE , 1, &LogBrush, 0, NULL );
    这段代码我试了一下,没效果,可能是我转得不对
    我直接CreatePen(PS_COSMETIC | PS_ALTERNATE ,0,RGB(255,0,0));
      

  4.   

    SetPixel效率相当高,可以放心使用,不过我推荐用GDI+
      

  5.   

    gdi+的效率估计慢,自己写函数画线用SetPixel,系统画线用的也是它。
      

  6.   


    应该是:
    ::ExtCreatePen(PS_COSMETIC | PS_ALTERNATE, 1, &log_brush, 0, NULL);