请教如何用画笔(HPEN)画一条半透明的线条?

解决方案 »

  1.   

    画好了以后,把区域BITBLT到一个DC,然后用
    AlphaBlend(
    dc->m_hDC,
    0,0,
    i_bmpWidth,//
    i_bmpHeight,//
    dcMem->m_hDC,
    0,
    0,
    i_bmpWidth,
    i_bmpHeight,
    m_bf);
    先声明这个变量
    BLENDFUNCTION m_bf; m_bf.BlendOp = AC_SRC_OVER;
    m_bf.BlendFlags = 0;
    m_bf.SourceConstantAlpha =100;
    m_bf.AlphaFormat = 0 ;
      

  2.   

    to howard(十方天地.天地十方):
    你这个方法等于是画完线之后再将图片透明化AlphaBlend,不是我想的实现方式,我是想在画线的过程中看到的线条就有透明的效果。
      

  3.   

    半透明效果的形成原理:每个点的原始颜色值*(透明度/255)
    例如:
        newr=GetRValue(oldcolor)*alpha/255;
        newg=......
        newb=....
    然后自己写画线函数,得到直线方程,用SetPixel用新得到的RGB值去描绘直线上每个点
    就可以实现半透明效果
    重要是写画线函数,看起来比较简单,但若想使画出来的线跟MFC函数画出来的一模一样,有很多需要推敲的地方,就是边界制的问题,可以比较着来
      

  4.   

    Alpha混合即可
    比如一个点RGB(250,250,250),下面背景对应点RGB(0,0,0)
    混合其实是按照不同的透明度处理
    如不透明:RGB(250,250,250)
      半透明:RGB(125,125,125)
      

  5.   

    TO BBirdlyh(BBird):
    有点难度啊
      

  6.   

    SORRY,SORRY,写错了,半透明算法应该是
      newr=(GetRValue(oldcolor)*alpha+GetRValue(bkcolor)*(255-alpha))/255;
        newg=......
        newb=....
    算法就是这样的,不过会不会达到你想要的效果就不一定了,而且对一些颜色来说可能不是太明显,你可以选个亮点的背景色
    关于画线的算法,我正好有一个,跟MFC的基本一致,你把透明色那部分加上就行了void CPictureStatic::PenLine(/*begin point*/CPoint b,/*end point*/CPoint e,CDC* pDC,COLORREF rgb)
    {
    //y=fa*x+fb
    float fa=(float)(e.y-b.y)/(e.x-b.x);    
    float fb=(float)(b.y*e.x-b.x*e.y)/(e.x-b.x);
    float fe;
    int x,y;
    int i,j;
    if(b.x==e.x&&b.y==e.y)  return;         //始末点重叠不画
        if(e.x<0||e.x>=320||e.y<0||e.y>=240)  return;
    if(b.x<0||b.x>=320||b.y<0||b.y>=240)  return; else if(b.x==e.x)                       //垂直线
    {
    x=b.x;
    for(j=min(b.y,e.y);j<=max(e.y,b.y);j++)  //标准的画线函数中不描述最末一点故不用j<=max()
    {
    y=j;
    pDC->SetPixel(CPoint(x,y),rgb);
    }
    }
    else if(b.y==e.y)                       //水平线
    {
    y=b.y;
    for(i=min(b.x,e.x);i<=max(e.x,b.x);i++)
    {
    x=i;
    pDC->SetPixel(CPoint(x,y),rgb);
    }
    }
    else                                      //一般情况
    {
    if(abs(b.x-e.x)>abs(b.y-e.y))         //趋近于水平的线用X坐标误差小
    {
    for(i=min(b.x,e.x);i<=max(e.x,b.x);i++)
    {
    x=i;
    fe=(float)fa*x+fb;            
    y=(int)fe;
    if(fe+0.5>=y+1)  y++;         //四舍五入
    pDC->SetPixel(CPoint(x,y),rgb);
    }
    }
    else                                  //趋近于垂直的线用Y坐标误差小
    {
    for(j=min(b.y,e.y);j<=max(e.y,b.y);j++)
    {
    y=j;
    fe=(float)(y-fb)/fa;          
    x=(int)fe;
    if(fe+0.5>=x+1)  x++;        //四舍五入
    pDC->SetPixel(CPoint(x,y),rgb);
    }
    }
    }
    }
      

  7.   

    不能COPY的,里面很多是俺程序里的东西。基本思想就在我那里面文字说明