我想使用ActiveX控件实现这样的功能:从图片文件中读取图片信息,在注册了控件的机器上显示该图片,在没注册的机器上不显示。我的图片背景是白色的,图片上有红色黄色等颜色,当显示的时候让白色透明,只显示其他颜色,部分代码如下:
IStream *pIStream;
CPictureHolder m_pic;
CDC  MemDC;
CBitmap   bmpFace;
CBitmap *pOldBitmap;//读取图片数据到char型数组中
//使用char型数组创建Stream对象
OleLoadPicture(pIStream, picturebufferlength, TRUE, IID_IPicture,(LPVOID*)&m_pic.m_pPict);
//得到图片的宽度和高度  
SIZE   sizeInHiMetric,   sizeInPix;  
m_pic.m_pPict->get_Width(&sizeInHiMetric.cx);  
m_pic.m_pPict->get_Height(&sizeInHiMetric.cy); //Calculate Its Size On a "Standard" (96 DPI) Device   Context  
sizeInPix.cx = MulDiv(sizeInHiMetric.cx, 96, HIMETRIC_INCH);  
sizeInPix.cy = MulDiv(sizeInHiMetric.cy, 96, HIMETRIC_INCH); MemDC.CreateCompatibleDC(NULL);
bmpFace.CreateCompatibleBitmap(&MemDC, sizeInPix.cx, sizeInPix.cy);
//将这幅图片选入内存DC  
pOldBitmap = MemDC.SelectObject(&bmpFace); m_pic.m_pPict->Render(MemDC.GetSafeHdc(), 0, 0, sizeInPix.cx, sizeInPix.cy,    
0, sizeInHiMetric.cy, sizeInHiMetric.cx, -sizeInHiMetric.cy, &rcBounds);以上代码执行了以后什么都没显示,求高人指点。

解决方案 »

  1.   

    你还要把MemDc再TransparentBlt到目标DC
      

  2.   

    这个我加过,但是加上之后也是不行
    把这句:
    MemDC.CreateCompatibleDC(NULL); 
    改成
    MemDC.Attach(pdc);
    之后就可以显示了,但是显示的图片背景不透明
    加了TransparentBlt也不行
    不知道是不是我上面的代码有问题
      

  3.   

    我是在Render后加的TransparentBlt,不知道加的地方对不对
      

  4.   

    CreateCompatibleDC的参数应该是目标DC而不是NULL
      

  5.   

    不太明白“目标DC”的意思,看MSDN上的解释:
    If this handle is NULL, the function creates a memory DC compatible with the application's current screen. 
    我的控件在别的应用程序中绘图,是不是可以传NULL呢?另外:
    void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
    这个pdc是什么dc呢,目标dc吗?
      

  6.   

    对,pdc就是传递给你的目标DC,你就是要在这个DC上绘制
      

  7.   

    楼上的高手,如果不麻烦的话可不可以帮我看看我贴出来的代码
    执行了MemDC.CreateCompatibleDC(pdc)后,MemDC为空,到pOldBitmap = MemDC.SelectObject(&bmpFace)的时候就异常了
      

  8.   

    网上有类似的帖子:
    http://topic.csdn.net/t/20060503/16/4729002.html
    http://topic.csdn.net/t/20040406/10/2930670.html
      

  9.   

    MemDC.CreateCompatibleDC(NULL); 上面这行肯定有问题,
    另外创建内存图画好后还得用 BILBIT or strenth××× 函数绘制到显示设备上去
    我记的内存图方式肯定是非透明的,如果想透明,那就绘制前先把底色图贴上去那两函数可能写的不对,查查帮助吧 
      

  10.   

    你是通过AddOLEControl加入图片的吧,在此语句后面加入方法ZOrder。再试试是否透明。
      

  11.   

    我知道,可你上面的代码只是ondraw的代码,它只负责图形的绘制。在你的容器中加入图片不是通过AddOLEControl实现的吗?