大家好:我在写一个ActiveX控件,希望使用Flash做界面,为了让Flash和我的控件更好地结合,
我并没有创建一个窗口专门绘制Flash,而是创建了一个无窗口的Flash(IOleInPlaceObjectWindowless),
并且使用Flash的IViewObject接口,用OleDraw方法,绘制Flash的内容到一个HDC上面:
OleDraw(flashView, DVASPECT_TRANSPARENT, hDC, &rc);在VC的控件测试程序中(ActiveX Control Test Container) ,一切表现正常,Flash的内容被正确地绘制到了我指定的HDC上,
但在IE上使用时,用OleDraw绘制结果都是白色,看上去好像什么也没有绘制,我把OleDraw绘制结果保存到了一个BMP文件中,也是白色。我又测试了MiniIE和遨游浏览器,他们都表现正常。
而且我google搜索也看到有人问类似的问题,所以我估计应该不是我绘制代码的错误,而是IE的一些安全性限制。总结起来,我的猜测是:一个ActiveX创建并使用另一个ActiveX时,IE会阻止他们之间的交互。
具体到我的例子就是:我的ActiveX创建一个无窗口的Flash,IE会阻止他们的交互导致OleDraw绘制失败。我的猜测对么?还是有别的原因?
如果真是IE做了什么限制,我有什么解决方法??诚请高手赐教,非常感谢!!
我并没有创建一个窗口专门绘制Flash,而是创建了一个无窗口的Flash(IOleInPlaceObjectWindowless),
并且使用Flash的IViewObject接口,用OleDraw方法,绘制Flash的内容到一个HDC上面:
OleDraw(flashView, DVASPECT_TRANSPARENT, hDC, &rc);在VC的控件测试程序中(ActiveX Control Test Container) ,一切表现正常,Flash的内容被正确地绘制到了我指定的HDC上,
但在IE上使用时,用OleDraw绘制结果都是白色,看上去好像什么也没有绘制,我把OleDraw绘制结果保存到了一个BMP文件中,也是白色。我又测试了MiniIE和遨游浏览器,他们都表现正常。
而且我google搜索也看到有人问类似的问题,所以我估计应该不是我绘制代码的错误,而是IE的一些安全性限制。总结起来,我的猜测是:一个ActiveX创建并使用另一个ActiveX时,IE会阻止他们之间的交互。
具体到我的例子就是:我的ActiveX创建一个无窗口的Flash,IE会阻止他们的交互导致OleDraw绘制失败。我的猜测对么?还是有别的原因?
如果真是IE做了什么限制,我有什么解决方法??诚请高手赐教,非常感谢!!
解决方案 »
- 想在button控件onmousemove方法之前先调用自己的方法
- 请帮忙把href链接<a href="http://www.bcagps.com/XX/X.html">链接</a>转换为信箱链接地址
- sendto为什么会发送arp包
- 广度优先搜索,程序有问题请高手分析(高分)
- 请教高手:如何从excel表格文件中读取数据???(急!!)(给分)
- 如何得到exe所在的路径?
- 为什么我的程序Debug运行没问题,Release运行的时候出错了?
- 求win2000屏幕保护源代码,1000分
- 改变窗口大小的问题
- 如何写扫描仪驱动
- vc++ 浮动窗口联动的实现
- 结构体 struct 是值类型,还是"引用类型"呀?
虽然我没有尝试,但我猜测,这样做从原理上应该和不打包没什么区别,
也许我对你说的打包理解不正确,
但更重要的是Flash10a.ocx本身3.7M,我的控件本身也不到1M,打进去有点不太划算。
to: sys0008:
IE版本: 6.0.2900
系统版本: winxp sp2
版本都比较低,测试没有通过,尚未测试IE高版本。MiniIE版本:1.6
遨游浏览器版本:2.5
这两个浏览器都没问题
BOOL bRet = UpdateLayeredWindow(hwnd, NULL, &p, &sz, m_hdcBack, &p2, 0, &bf, m_iBPP == 32 ? ULW_ALPHA : ULW_OPAQUE);
//*zhiqiang++
static int i = 0;
for(;i<10;++i)
{
std::wstring strFileName;
CTime m_CurDT;
m_CurDT=CTime::GetCurrentTime();
strFileName = string_helper::string_format(L"./%d-%d-%d-%d.bmp",m_CurDT.GetYear(),m_CurDT.GetMonth(),m_CurDT.GetDay(), i); SaveBitmapToFile(m_hdcBack, CopyScreenToBitmap(m_hdcBack, &rTotal), strFileName.c_str());
}OLECONTAINER(HBITMAP)::CopyScreenToBitmap(HDC hdcBack, LPRECT lpRect)
{
HDC hMemDC;
HBITMAP hBitmap,hOldBitmap;
int nX, nY, nX2, nY2;
int nWidth, nHeight;
int xScrn, yScrn; if (IsRectEmpty(lpRect))
return NULL;
// hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hdcBack); nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom; xScrn = GetDeviceCaps(hdcBack, HORZRES);
yScrn = GetDeviceCaps(hdcBack, VERTRES); if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
hBitmap=CreateCompatibleBitmap(hdcBack,nWidth,nHeight);
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
BitBlt(hMemDC,0,0, nWidth,nHeight,hdcBack, nX, nY, SRCCOPY); hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); //DeleteDC(hMemDC); return hBitmap;
} OLECONTAINER(BOOL)::SaveBitmapToFile(HDC hdcBack, HBITMAP hBitmap, LPCTSTR lpFileName)
{
// HDC hDC;
// CDC dc;
int iBits; // Bits per pixel in current resolution
WORD wBitCount; // Bits per pixel in bitmap
DWORD dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten;
BITMAP Bitmap;
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh, hDib, hPal;
HPALETTE hOldPal = NULL; // Compute use bits per pixel of bitmap
// dc.CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hdcBack, BITSPIXEL) * GetDeviceCaps(hdcBack, PLANES);
// DeleteDC(dc); if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else if (iBits <= 32)
wBitCount = 32; // Compute palette size
if (wBitCount <= 8)
dwPaletteSize=(1<<wBitCount);
// Set bitmap header
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = -Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0; dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight; // Allocate memory for bitmap
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi; /*zhiqiang--
// Process palette
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
//## hdcBack = ::GetDC(NULL);
hOldPal = SelectPalette(hdcBack,(HPALETTE)hPal,FALSE);
RealizePalette(hdcBack);
}
//*/ // Gain pixel value in new palette
GetDIBits(hdcBack,hBitmap,(UINT)(Bitmap.bmHeight), 0,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi,DIB_RGB_COLORS); /*zhiqiang--
// Restore palette
if (hOldPal)
{
SelectPalette(hdcBack, hOldPal, TRUE);
RealizePalette(hdcBack);
::ReleaseDC(NULL, hdcBack);
}
//*/ // Create bitmap file
fh = CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh==INVALID_HANDLE_VALUE)
return FALSE; // Set bitmap file header
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize=sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize+sizeof(BITMAPFILEHEADER);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize; // Write bitmap file header
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // Write bitmap body
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
&dwWritten, NULL); // Memory release
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return TRUE;
}