void DrawBMP(HDC hdc , CBitmap * bgbmp ,  CBitmap * bmp , CBitmap * bmpmask , POINT pt , int num)
{
CDC dc;
CDC mdc,mdc1;
dc.Attach(hdc);
mdc.CreateCompatibleDC(&dc);
mdc1.CreateCompatibleDC(&dc); SIZE bgbmpsize = GetBMPSize(bgbmp); //GetBMPSize()为获得Bmp图的宽和高 mdc1.SelectObject(bgbmp);
mdc.BitBlt(0,0,bgbmpsize.cx,bgbmpsize.cy,&mdc1,0,0,SRCCOPY); 

SIZE bmpsize = GetBMPSize(bmp);
mdc1.SelectObject(bmp);
mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,bmpsize.cx/4*num,0,SRCAND);
mdc1.SelectObject(bmpmask);
mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,0,0,SRCPAINT);

dc.BitBlt(0,0,GetBMPSize(bgbmp).cx,GetBMPSize(bgbmp).cy,&mdc,0,0,SRCCOPY);

}

解决方案 »

  1.   

    到了mdc1.SelectObject(bgbmp);调试过不去
      

  2.   

    CDC dc;///这里dc没有初始化
    memDC.Attach(hdc);///
    ...
    memDC.Detach();
    总之,我认为问题出在这里。
      

  3.   

    bgbmp.CreateCompatibleBitmap(&dc,nW,nH);///nW:宽;nH:高不知道bgbmp是否已经用兼容的DC初始化,你试试吧
    不过看起来你好像已经正确地初始化了,看不出别的问题
      

  4.   

    bgbmp.CreateCompatibleBitmap试了这句也通不过
      

  5.   

    GetBMPSize(bgbmp)里是否有改变了bgbmp的操作。
      

  6.   

    你要画透明位图,其实有很多方法,
    要得到Bmp的大小,你试试
    BITMAP bt;
    bgbmp.getobject(&bt);
    bt.width
    bt.height;
      

  7.   

    try itBOOL TransparentBlt(
    HDC hdcDest,      // 目标DC
    int nXOriginDest,   // 目标X偏移
    int nYOriginDest,   // 目标Y偏移
    int nWidthDest,     // 目标宽度
    int hHeightDest,    // 目标高度
    HDC hdcSrc,         // 源DC
    int nXOriginSrc,    // 源X起点
    int nYOriginSrc,    // 源Y起点
    int nWidthSrc,      // 源宽度
    int nHeightSrc,     // 源高度
    UINT crTransparent  // 透明色,COLORREF类型
    );api函数,用来画透明位图,工程中加入msimg32.lib
      

  8.   

    bgbmp.CreateCompatibleBitmap试了这句也通不过
    -------------------------------------------应该是DC没有初始化吧,传递的参数hdc有没有问题?
      

  9.   

    To:xinyu() 
    我是在OnPaint中传递hdc的,代码如下
    CClientDC dc(this)
    DrawBMP(dc.GetSaftHDC(),bgbmp,.....);//后面的省略了To:wjqname(ccw) 、cnjj(待业王子)
    我的代码你们没看懂这个函数,我不是画透明位图而是画遮照位图To:Mackz(在相互)、wjqname(ccw)
    GetBMPSize(bgbmp)方法没问题实现和wjqname(ccw)写的一样只不过返回给一个SIZE变量
      

  10.   

    CDC dc;
    mdc.CreateCompatibleDC(&dc);
    .......
    还能正确吗?
      

  11.   

    void DrawBMP(HDC hdc , CBitmap * bgbmp ,  CBitmap * bmp , CBitmap * bmpmask , POINT pt , int num)
    {
    CDC dc;
    CDC mdc,mdc1;
    dc.Attach(hdc);
    mdc.CreateCompatibleDC(&dc);
    mdc1.CreateCompatibleDC(&dc); SIZE bgbmpsize = GetBMPSize(bgbmp); //GetBMPSize()为获得Bmp图的宽和高 CBitmap* pOldBMP = mdc1.SelectObject(bgbmp);
    mdc.BitBlt(0,0,bgbmpsize.cx,bgbmpsize.cy,&mdc1,0,0,SRCCOPY); 

    SIZE bmpsize = GetBMPSize(bmp);
    mdc1.SelectObject(pOldBMP);
    pOldBMP = mdc1.SelectObject(bmp);
    mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,bmpsize.cx/4*num,0,SRCAND);
    mdc1.SelectObject(pOldBMP);
    pOldBMP = mdc1.SelectObject(bmpmask);
    mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,0,0,SRCPAINT);
    mdc1.SelectObject(pOldBMP);
    dc.BitBlt(0,0,GetBMPSize(bgbmp).cx,GetBMPSize(bgbmp).cy,&mdc,0,0,SRCCOPY);
    dc.Detach();
    }
      

  12.   


    1.bgbmp.CreateCompatibleBitmap试了这句也通不过
    -------------------------------------------你给出的代码没有这句话,所以我估计是DC的问题,现在好像不是2.到了mdc1.SelectObject(bgbmp);调试过不去
    ---------------------------------------- 
    按说应该是这句话mdc1.SelectObject(bmp);调试不过去,因为你前面已经mdc1.SelectObject(bgbmp);再此调用SelectObject需要释放原来的资源,所以同意楼上, 也可以在BitBlt完后,DeleteObject。
      

  13.   

    错了,DeleteObject不是CDC的函数
      

  14.   

    试试下面这样:void DrawBMP(HDC hdc , CBitmap * bgbmp ,  CBitmap * bmp , CBitmap * bmpmask , POINT pt , int num)
    {
    CDC *dc;
    CDC mdc,mdc1;
    dc = CDC::FromHandle(hdc);
    mdc.CreateCompatibleDC(dc);
    mdc1.CreateCompatibleDC(dc); //SIZE bgbmpsize = GetBMPSize(bgbmp); //GetBMPSize()为获得Bmp图的宽和高 mdc.SelectObject(bgbmp);
    //mdc.BitBlt(0,0,bgbmpsize.cx,bgbmpsize.cy,&mdc1,0,0,SRCCOPY); 

    SIZE bmpsize = GetBMPSize(bmp);
    mdc1.SelectObject(bmp);
    mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,bmpsize.cx/4*num,0,SRCAND);
    mdc1.SelectObject(bmpmask);
    mdc.BitBlt(pt.x,pt.y,bmpsize.cx/4,bmpsize.cy,&mdc1,0,0,SRCPAINT);

    dc->BitBlt(0,0,GetBMPSize(bgbmp).cx,GetBMPSize(bgbmp).cy,&mdc,0,0,SRCCOPY);

    }