使用GDI绘图,背景为黑色,用CPen、LineTo画线。
第一次画了一条红色的线;
第二次画了一条绿色的线;
这两条线段有交叉点。
问:如何使交叉点为“叠加色”?(注:现在交叉点被覆盖成绿色了)叠加色的计算公式应用别人的方法:
第一步:分解rgb分量,得到,r1,g1,b1和r2,g2,b2 
第二步:确定百分比,例如:为y1为0.3,y2为0.7 
第三步:计算合成色的rgb分量:r3=r1*0.3+r2*0.7:g3=g1*0.3+g2*0.7:b3=b1*0.3+b2*0.7 
第四步:合成颜色,更具rgb值得到颜色值

解决方案 »

  1.   

    不好意思,刚在U盘里发现我原来有这个代码,给你贴上void Sprite::DrawTransAlpha(HDC hdcBack,int nXBack,int nYBack,int nWidthBack,int nHeightBack,
    int nXFore,int nYFore,int nAlpha,COLORREF crTrans)
    {
    if(m_hbm!=NULL)
    {
    HDC hdcMem=CreateCompatibleDC(hdcBack); RECT rBackRect={nXBack,nYBack,nWidthBack,nHeightBack};
    HBITMAP hbmTmp=CreateCompatibleBitmap(hdcBack,nWidthBack,nHeightBack); HBITMAP hbmBK=(HBITMAP)SelectObject(hdcBack,hbmTmp); RECT rForeRect={nXFore,nYFore,nXFore+m_nWidth,nYFore+m_nHeight};
    RECT rTransRect,rTransRect2; if(IntersectRect(&rTransRect,&rBackRect,&rForeRect))
    {
    BITMAP bm,bmBK;
    GetObject(m_hbm,sizeof(BITMAP),&bm); BYTE *px=new unsigned char[bm.bmHeight*bm.bmWidthBytes];
    GetBitmapBits(m_hbm,bm.bmHeight*bm.bmWidthBytes,px); GetObject(hbmBK,sizeof(BITMAP),&bmBK);
    BYTE *pxBK=new unsigned char[bmBK.bmHeight*bmBK.bmWidthBytes]; GetBitmapBits(hbmBK,bmBK.bmHeight*bmBK.bmWidthBytes,pxBK); rTransRect2=rTransRect;
    OffsetRect(&rTransRect2,-rForeRect.left,-rForeRect.top); int pb=bm.bmBitsPixel/8;
    int pbBK=bmBK.bmBitsPixel/8; int dx1,dx2,dy1,dy2;
    for(dy1=rTransRect.top,dy2=rTransRect2.top;dy1<rTransRect.bottom;dy1++,dy2++)
    for(dx1=rTransRect.left,dx2=rTransRect2.left;dx1<rTransRect.right;dx1++,dx2++)
    {
    int nBackRGB_B=dy1*bmBK.bmWidthBytes+dx1*pbBK;
    int nForeRGB_B=dy2*bm.bmWidthBytes+dx2*pb; if(RGB(px[nForeRGB_B+2],px[nForeRGB_B+1],px[nForeRGB_B])!=crTrans)
    {
    pxBK[nBackRGB_B]=(px[nForeRGB_B]*nAlpha+pxBK[nBackRGB_B]*
    (256-nAlpha))/256;
    pxBK[nBackRGB_B+1]=(px[nForeRGB_B+1]*nAlpha+pxBK[nBackRGB_B+1]*
    (256-nAlpha))/256;
    pxBK[nBackRGB_B+2]=(px[nForeRGB_B+2]*nAlpha+pxBK[nBackRGB_B+2]*
    (256-nAlpha))/256;
    }
    } SetBitmapBits(hbmTmp,bmBK.bmHeight*bmBK.bmWidthBytes,pxBK);
    HBITMAP hbmOld=(HBITMAP)SelectObject(hdcMem,hbmTmp);
    BitBlt(hdcBack,0,0,rBackRect.right,rBackRect.bottom,hdcMem,0,0,SRCCOPY); delete[]px;
    delete[]pxBK;
    SelectObject(hdcMem,hbmOld);
    }
    DeleteObject(hbmTmp);
    DeleteObject(hdcMem);
    }
    }
      

  2.   

    说明一下,这是我在一本资料书上看到的,DrawTransAlpha()函数的功能就是绘制通明镂空图,函数体代码中有2幅位图的叠加部分像素运算代码。其中,
    BYTE *px=new unsigned char[bm.bmHeight*bm.bmWidthBytes];语句是建立一个存储像素RGP值的数组而
    GetBitmapBits(m_hbm,bm.bmHeight*bm.bmWidthBytes,px);语句就是将位图像素存如PX[]数组中这就是你需要的关键代码。
      

  3.   

    to lvyexian:
        Thank you very much! I'll try it.