一个最难的问题—关于ActiveX控件背景色透明的问题

时间:2022-12-09 14:50:21
最近做一个设计,需要在word里面添加一个activex控件 使用AddOleControl方法添加进去,
目前主要的问题是背景色不是透明的,总是把文字给遮住了 
我的代码如下:
bool CWordCertOcxCtrl::DrawStamp(CDC *pdc, IPicture *pic, const CRect &rcBounds)
{
//内存DC
if (!pdc)
return true;
// TODO: 用您自己的绘图代码替换下面的代码。
//m_pic.Render(pdc, rcBounds, rcInvalid);

//内存DC

CDC MemDC;
MemDC.CreateCompatibleDC(GetDC(NULL,OLEDC_NODRAW));
//得到图片的宽度和高度
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);
CBitmap bmpFace; 
bmpFace.CreateCompatibleBitmap(pdc, sizeInPix.cx, sizeInPix.cy);
//将这幅图片选入内存DC
CBitmap* pOldBmp = MemDC.SelectObject(&bmpFace);

m_pic.m_pPict->Render(MemDC.GetSafeHdc(), 0, 0, rcBounds.right, rcBounds.bottom, 
0, sizeInHiMetric.cy, sizeInHiMetric.cx, -sizeInHiMetric.cy, &rcBounds);

TransparentBlt(pdc->m_hDC,0, 0, rcBounds.right, rcBounds.bottom, 
MemDC.m_hDC, 0, 0, sizeInPix.cx, sizeInPix.cy, RGB(0, 0, 0));

MemDC.SelectObject(pOldBmp);
bmpFace.DeleteObject();
MemDC.DeleteDC();
   

   return true;

}


void CWordCertOcxCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
IPictureDisp* pdisp = m_pic.GetPictureDispatch();
IPicture* pic;
pdisp->QueryInterface(IID_IPicture, (void**)&pic);
DrawStamp(pdc, pic, rcBounds);
}

画出来的是花的。

10 个解决方案

#1


寻求相关技术合作。。。
愿意以其他模块代码交换。。

#2


try:

pdc->SetBkMode(TRANSPARENT);

#3


是不行的。。
试过了哈  
我现在都找了一周的资料了。。。

#4


不会吧,我现在正在这样用的,没问题呀

#5


在form下面测试是没的问题  
但是一放到word里面去过后就有问题了 
最大化或者最小化过后显示的图象就有桌面或者其他的背景色。

#6


画完后刷新下控件

#7


我使用InvalidateControl()还是不行呢。。。。

#8


使用Application.ScreenUpdating 进行刷新  好象一点效果都没的呢 。。。

#9


如果想要动态刷新背景,我现在找到的最好办法就是取得子窗口下面的背景的DC,然后自己刷到自己的DC上来。   
  简而言之,就是用动态读取父窗口的背景,用来作子窗口背景,看起来就是透明的了。

#10


能实现这个功能也可以。

让嵌入WORD的ActiveX控件可移动、并且透明

#1


寻求相关技术合作。。。
愿意以其他模块代码交换。。

#2


try:

pdc->SetBkMode(TRANSPARENT);

#3


是不行的。。
试过了哈  
我现在都找了一周的资料了。。。

#4


不会吧,我现在正在这样用的,没问题呀

#5


在form下面测试是没的问题  
但是一放到word里面去过后就有问题了 
最大化或者最小化过后显示的图象就有桌面或者其他的背景色。

#6


画完后刷新下控件

#7


我使用InvalidateControl()还是不行呢。。。。

#8


使用Application.ScreenUpdating 进行刷新  好象一点效果都没的呢 。。。

#9


如果想要动态刷新背景,我现在找到的最好办法就是取得子窗口下面的背景的DC,然后自己刷到自己的DC上来。   
  简而言之,就是用动态读取父窗口的背景,用来作子窗口背景,看起来就是透明的了。

#10


能实现这个功能也可以。

让嵌入WORD的ActiveX控件可移动、并且透明