ms 浏览器控件的获取控件内容大小问题
我的目标是使用浏览器控件打开一个网页,获取内容的大小,然后调用IID_IViewObject2接口draw到一个图片的dc中,再保存到文件.即把网页转存为一个大图片.
过程如下
1. 创建一个基于对话框的mfc项目
2.通过 project->Add to Project->Components and contols->Registered Activex Controls插入WEB浏览器控件,会自动生成一个CWebBrowser2类,控件栏上多了对应的控件图片。
3.拖动控件到对话框,映射成对话框的成员变量m_ie;
4.添加一个按钮,处理代码如下
void CTe2Dlg::OnButton1()
{
IViewObject *pViewObject = NULL;
IOleObject *pOleObject = NULL;
HRESULT hret;
HDC hDrawDC;
HBITMAP hBmp, hBmpOld;
int iWidth, iHeight;
SIZEL hmSizeL;
SIZEL pxSizeL;
RECTL rectL;
CRect rect;
GetClientRect(rect);
LPDISPATCH DispatchPtr;
VARIANT vInfo;
vInfo.vt=VT_EMPTY;
m_ie.Navigate("e:\\aa.htm",&vInfo,&vInfo,&vInfo,&vInfo);
DispatchPtr = m_ie.GetDocument();
if(DispatchPtr == NULL)
{
return ;
}
hret = DispatchPtr->QueryInterface(IID_IViewObject2, (void**)&pViewObject);
if(FAILED(hret))
{
return ;
}
hret = DispatchPtr->QueryInterface(IID_IOleObject,(void**)&pOleObject);
if(FAILED(hret))
{
pViewObject->Release();
return ;
}
hret = pOleObject->GetExtent(DVASPECT_CONTENT,&hmSizeL);
if(!SUCCEEDED(hret))// != S_OK)
{
pViewObject->Release();
pOleObject->Release();
return ;
}
AtlHiMetricToPixel(&hmSizeL, &pxSizeL);
iWidth = pxSizeL.cx;
iHeight = pxSizeL.cy;
rectL.top = 0;
rectL.left = 0;
rectL.right = iWidth;
rectL.bottom = iHeight;
CWnd * hwnd = GetDlgItem(IDC_PIC); //IDC_PIC为图片控件ID
CDC* pDC = hwnd->GetDC();//->m_hDC;//this->GetWindowDC();
hDrawDC = ::CreateCompatibleDC(pDC->m_hDC);
pDC->TextOut(0,0,"hello");
int bpp = GetDeviceCaps(hDrawDC,BITSPIXEL);
int planes = GetDeviceCaps(hDrawDC,PLANES);
int printwidth = GetDeviceCaps(pDC->m_hDC,HORZRES);
int printheight = GetDeviceCaps(pDC->m_hDC,VERTRES);
hBmp = ::CreateCompatibleBitmap(hDrawDC,iWidth,iHeight);
hBmpOld = (HBITMAP)::SelectObject(hDrawDC,hBmp);
hret = pViewObject->Draw(DVASPECT_CONTENT, //Aspect to draw - we always want content
-1, //Always -1
NULL, //We don't use pvAspect
NULL, //We don't need to specify a target device
NULL, //We don't need a target HIC
pDC->m_hDC,//hDrawDC, //The DC to draw on
&rectL, //The bounding box to draw in
NULL, //Only for metafiles
NULL, //Not using a callback
0 ); //Not using a callback
tagRECT dstRect;
hwnd->GetClientRect(&dstRect);
::StretchBlt(pDC->m_hDC,0,0,printwidth,printheight,hDrawDC,0,0,iWidth,iHeight,+SRCCOPY );
if(hret != S_OK)
{
pViewObject->Release();
pOleObject->Release();
::SelectObject(hDrawDC,hBmpOld);
::DeleteDC(hDrawDC);
::DeleteObject(hBmp);
return ;
}
}
问题:
1.现在控件可以正常显示我想要的htm页面内存,但是hret = pOleObject->GetExtent(DVASPECT_CONTENT,&hmSizeL); 获取的hmSizeL 是{1,1}, AtlHiMetricToPixel(&hmSizeL, &pxSizeL)转换后pxSizeL为{0,0}; 导致画不出内容.
2.如果强行改下这个大小坐标值,画出来的是一片黑色.
请熟悉的大虾指正一下!