是这样的,一般都是用drawicon直接把HICON对象画出来,
但是有人说可以使用gdi的函数实现同样的功能
图标对象(彩色)里面有两幅位图
就是分别先and再xor这两幅就行我试勒一下,是画出来勒,但是背景都变成黑色了,不知道怎么做成透明的我的代码:
HICON hicon;
hicon = this->icon;
ICONINFO iconinfo;
HBITMAP andbm,xorbm;
int nWidth = rect.Width();
int nHeight = rect.Height();
         CDC memdc3;
GetIconInfo(hicon,&iconinfo);
andbm = iconinfo.hbmMask;
xorbm = iconinfo.hbmColor;

memdc3.CreateCompatibleDC(pDC);
memdc3.SelectObject(andbm);
memdc3.StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCAND);
memdc3.SelectObject(xorbm);
memdc3.StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCINVERT);
pDC->StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCCOPY);

解决方案 »

  1.   

    对于图标,可以这样
    CImageList m_il;
    m_il.Create(...);LoadImage(...);  //装图标,作为位图
    m_il.Add((CBitmap &bmp), RGB(...)); //这里设置透明色。m_il.Draw(...) 画图
      

  2.   

    我需要对图表里头的位图进行操作,比如拉伸,旋转,CImageList类的成员函数好像不提供这些功能吧,我想我的问题其实是
    如何利用图标对象内含的位图来做图,达到图标的效果
    现在该透明的地方都是黑的,该怎么让它透明!!??
      

  3.   

    Bitmap也可以,两个反色的图片。
      

  4.   

    来,拿着这个 if (nBmpID == 0) //图片名,cstring
    return; CDC *dc = GetDC(); CDC cdcTemp, 
    cdcBackGround, 
    cdcBitMask, 
    cdcMemory, 
    cdcScreenBits; COLORREF   clrrefBkColor; CBitmap   cbmNewBitmap,
          cbmCopyBitMask, 
          cbmCopyMemory, 
          cbmCopyBackGround, 
          cbmScreenBits;
     
    CBitmap * cbmOldBitmap; 
    CBitmap * cbmBackGroundOld; 
    CBitmap * cbmBitMaskOld;
    CBitmap * cbmMemoryOld;
    CBitmap * cbmScreenBitsOld; BITMAP bm;
    CRect rect;//图片区域 cdcTemp.CreateCompatibleDC(dc); cbmNewBitmap.LoadBitmap(nBmpID);
    // Select the bitmap into the dc cbmOldBitmap = cdcTemp.SelectObject(&cbmNewBitmap); GetObject(HBITMAP(cbmNewBitmap), 
    sizeof(BITMAP), 
    (LPSTR)&bm); // Get the pointer to the message bar 
    // of the application
    rect = targetRect;
    rect.right = rect.left + bm.bmWidth;
    rect.bottom = rect.top + bm.bmHeight; // Create dc's in which to move our bitmap around
    // so we can back out background
    cdcBackGround.CreateCompatibleDC(dc);
    cdcMemory.CreateCompatibleDC(dc);
    cdcScreenBits.CreateCompatibleDC(dc);
    cdcBitMask.CreateCompatibleDC(dc);

    // Create the bitmaps for each of our dc's
    //单色
    cbmCopyBackGround.CreateBitmap(rect.Width(), 
    rect.Height(), 1, 1, NULL);
    cbmCopyBitMask.CreateBitmap(rect.Width(), 
    rect.Height(), 1, 1, NULL);
    //彩色
    cbmCopyMemory.CreateCompatibleBitmap(dc, 
    rect.Width(), rect.Height());
    cbmScreenBits.CreateCompatibleBitmap(dc, 
    rect.Width(), rect.Height());

    // Select the bitmaps just created into each of the dc's
    cbmBackGroundOld = 
    cdcBackGround.SelectObject(&cbmCopyBackGround);
    cbmBitMaskOld = 
    cdcBitMask.SelectObject(&cbmCopyBitMask);
    cbmMemoryOld = 
    cdcMemory.SelectObject(&cbmCopyMemory);
    cbmScreenBitsOld = 
    cdcScreenBits.SelectObject(&cbmScreenBits);

    // Copy out the are of the screen that is about
    // to be overwritten
    //将图片(cdcTemp)拷贝到cdcScreenBits保存
    //cdcTemp SRCCOPY cdcScreenBits
    cdcScreenBits.BitBlt(0, 0, rect.Width(),
    rect.Height(), &cdcTemp, 0, 0, SRCCOPY); // Set the background color to white
    // This was the color chosen to be transparent
    //选择白色背景色
    clrrefBkColor = cdcTemp.SetBkColor(RGB( 255, 255, 255));

    // Create mask for your bitmap
    //创建黑白图片(白色背景,黑色前景)(cdcBitMask)
    //cdcTemp SRCCOPY cdcBitMask
    cdcBitMask.BitBlt(0, 0, rect.Width(),
    rect.Height(), &cdcTemp, 0, 0,
          SRCCOPY);

    // Put the original background color back
    cdcTemp.SetBkColor(clrrefBkColor);

    // Create the reverse of the mask you just made
    //创建黑白图片(黑色背景,白色前景)(cdcBackGround)
    //cdcBitMask NOTSRCCOPY cdcBackGround
    cdcBackGround.BitBlt(0, 0, rect.Width(),
    rect.Height(), &cdcBitMask, 0, 0,
        NOTSRCCOPY);

    // Copy in the background of the paint dc first
    //拷贝原窗口图象(cdcMemory)
    //屏幕 SRCCOPY cdcMemory
    cdcMemory.BitBlt(0, 0, rect.Width(),
    rect.Height(), dc,  rect.left,
    rect.top, SRCCOPY);

    // Copy in the mask for the bitmap
    //叠合产生黑色前景的透明图片(cdcMemory)
    //cdcBitMask SRCAND cdcMemory
    cdcMemory.BitBlt(0, 0, rect.Width(),
    rect.Height(), &cdcBitMask, 0, 0, SRCAND);
       
    // Mask out the bits we have determined to be 
    // transparent (white ones)
    //叠合产生彩色前景,黑色背景的图片(cdcTemp)
    //cdcBackGround SRCAND cdcTemp
    cdcTemp.BitBlt(0, 0, rect.Width(),
    rect.Height(), &cdcBackGround, 0, 0, SRCAND); // Blend in the background
    //叠合产生彩色前景的透明图片(cdcMemory),操作完成
    //cdcTemp SRCPAINT cdcMemory
    cdcMemory.BitBlt(0, 0, rect.Width(),
    rect.Height(), &cdcTemp, 0, 0, SRCPAINT); WaitForSingleObject(m_hPaintEvent, INFINITE);
    ResetEvent(m_hPaintEvent);
    // Now put it all on the display
    dc->BitBlt(rect.left, rect.top, 
    rect.Width(), rect.Height(), &cdcMemory, 
    0, 0, SRCCOPY); SetEvent(m_hPaintEvent); cdcTemp.SelectObject(cbmOldBitmap);
    cdcBackGround.SelectObject(cbmBackGroundOld);
    cdcBitMask.SelectObject(cbmBitMaskOld);
    cdcMemory.SelectObject(cbmMemoryOld);
    cdcScreenBits.SelectObject(cbmScreenBitsOld); cdcTemp.DeleteDC();
    cdcBackGround.DeleteDC();
    cdcBitMask.DeleteDC();
    cdcMemory.DeleteDC();
    cdcScreenBits.DeleteDC(); DeleteObject(&clrrefBkColor); // Bitmap objects for copying the masks, original,
    // and so forth back and forth
    DeleteObject(&cbmNewBitmap);
    DeleteObject(&cbmCopyBitMask);
    DeleteObject(&cbmCopyMemory);
    DeleteObject(&cbmCopyBackGround);
    DeleteObject(&cbmScreenBits);
      

  5.   

    其实就是透明位图,楼上的麻烦勒,我已经解决勒,thx all!