ActiveX绘制透明背景图片的问题

waltsin 2009-04-24 02:39:35
我想使用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);

以上代码执行了以后什么都没显示,求高人指点。
...全文
218 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
shukinwg 2009-04-29
  • 打赏
  • 举报
回复
我知道,可你上面的代码只是ondraw的代码,它只负责图形的绘制。在你的容器中加入图片不是通过AddOLEControl实现的吗?
waltsin 2009-04-29
  • 打赏
  • 举报
回复
我的实现方法在上面有代码,谢谢您的提示
一开始的回忆 2009-04-29
  • 打赏
  • 举报
回复
刚学,还不太会
waltsin 2009-04-28
  • 打赏
  • 举报
回复
不好意思,不是!
shukinwg 2009-04-28
  • 打赏
  • 举报
回复
你是通过AddOLEControl加入图片的吧,在此语句后面加入方法ZOrder。再试试是否透明。
vieriwin 2009-04-27
  • 打赏
  • 举报
回复
MemDC.CreateCompatibleDC(NULL);

上面这行肯定有问题,
另外创建内存图画好后还得用 BILBIT or strenth××× 函数绘制到显示设备上去
我记的内存图方式肯定是非透明的,如果想透明,那就绘制前先把底色图贴上去

那两函数可能写的不对,查查帮助吧
Elliyu 2009-04-27
  • 打赏
  • 举报
回复
用PS做无背景的不是更方便吗?
jnkandy 2009-04-26
  • 打赏
  • 举报
回复
网上有类似的帖子:
http://topic.csdn.net/t/20060503/16/4729002.html
http://topic.csdn.net/t/20040406/10/2930670.html
waltsin 2009-04-25
  • 打赏
  • 举报
回复
楼上的高手,如果不麻烦的话可不可以帮我看看我贴出来的代码
执行了MemDC.CreateCompatibleDC(pdc)后,MemDC为空,到pOldBitmap = MemDC.SelectObject(&bmpFace)的时候就异常了
waltsin 2009-04-25
  • 打赏
  • 举报
回复
我是在Render后加的TransparentBlt,不知道加的地方对不对
waltsin 2009-04-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jameshooo 的回复:]
你还要把MemDc再TransparentBlt到目标DC
[/Quote]
这个我加过,但是加上之后也是不行
把这句:
MemDC.CreateCompatibleDC(NULL);
改成
MemDC.Attach(pdc);
之后就可以显示了,但是显示的图片背景不透明
加了TransparentBlt也不行
不知道是不是我上面的代码有问题
jameshooo 2009-04-25
  • 打赏
  • 举报
回复
对,pdc就是传递给你的目标DC,你就是要在这个DC上绘制
waltsin 2009-04-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jameshooo 的回复:]
CreateCompatibleDC的参数应该是目标DC而不是NULL
[/Quote]
不太明白“目标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吗?
jameshooo 2009-04-25
  • 打赏
  • 举报
回复
CreateCompatibleDC的参数应该是目标DC而不是NULL
jameshooo 2009-04-24
  • 打赏
  • 举报
回复
你还要把MemDc再TransparentBlt到目标DC
waltsin 2009-04-24
  • 打赏
  • 举报
回复
自己冒个泡,呵呵
xghuzd 2009-04-24
  • 打赏
  • 举报
回复
ActiveX没用过
帮顶一个.
waltsin 2009-04-24
  • 打赏
  • 举报
回复
以上代码是写在OnDraw里面的

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧