研究好久才弄好,注释的比较详细,不明白的函数可以参考MSDN bool TransparentDIB(CBitmap * dib, /*要绘制的位图*/ CDC * pDC, /*目标DC*/ CRect * rct, /*目标矩形*/ COLORREF transColor, /*透明色*/ bool bStretch /*是否拉伸位图以适应目标矩形*/) { //验证参数 if(dib == NULL || pDC == NULL || rct == NULL) return false; int nWidth; int nHeight; //位图信息对象 BITMAP w_bitmap_info; //获取位图信息 dib->GetBitmap(&w_bitmap_info); //新建设备上下文 CDC w_memoryDC; //创建兼容内存DC w_memoryDC.CreateCompatibleDC(pDC); //根据拉伸状态获得图像实际绘制尺寸 if(bStretch) { nWidth = rct->Width(); nHeight = rct->Height(); } else { nWidth = w_bitmap_info.bmWidth; nHeight = w_bitmap_info.bmHeight; } w_memoryDC.SelectObject(dib);//选入位图对象 w_memoryDC.SetBkColor(transColor);//设置透明色 CDC w_maskDC;//创建兼容内存DC作为掩码DC w_maskDC.CreateCompatibleDC(pDC);//创建兼容内存DC作为掩码DC CBitmap w_maskBitmap;//创建新位图作为掩码位图 w_maskBitmap.CreateBitmap(w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,1,1,NULL); //创建新位图作为掩码位图 w_maskDC.SelectObject(&w_maskBitmap);//选入掩码位图 w_maskDC.BitBlt(0,0,w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,&w_memoryDC,0,0,SRCCOPY); //SRCCOPY方式将源位图以原始大小绘制到掩码DC pDC->StretchBlt(0,0,nWidth,nHeight,&w_memoryDC,0,0,w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,SRCINVERT); //SRCINVERT方式将源位图拉伸绘制到窗口DC pDC->StretchBlt(0,0,nWidth,nHeight,&w_maskDC,0,0,w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,SRCAND); //SRCAND方式将掩码位图拉伸绘制到窗口DC pDC->StretchBlt(0,0,nWidth,nHeight,&w_memoryDC,0,0,w_bitmap_info.bmWidth,w_bitmap_info.bmHeight,SRCINVERT); //SRCINVERT方式将源位图拉伸绘制到窗口DC //完成绘制 w_memoryDC.DeleteDC();//删除内存DC w_maskDC.DeleteDC();//删除掩码DC return true; }