2015-01-17 11:23:05|?次阅读|上传:wustguangh【已有?条评论】发表评论
本文我们介绍另一种方案,使用ATL的容器CAxWindow引用WebBrowser控件,下面给出完整的实现代码:
#include "stdafx.h" #include <atlbase.h> CComModule _Module; #include <atlwin.h> #include <windows.h> #pragma comment(lib,"atl") #pragma comment(lib,"User32.lib") LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { RECT rc; IWebBrowser2* iWebBrowser; VARIANT varMyURL; static CAxWindow WinContainer; //LPOLESTR pszName=OLESTR("shell.Explorer."); //LPOLESTR pszName=OLESTR("shell.Explorer.2"); LPOLESTR pszName=OLESTR("{8856F961-340A-11D0-A96B-00C04FD705A2}"); GetClientRect(hWnd, &rc); switch(message) { case WM_CREATE: WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE); WinContainer.CreateControl(pszName); WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser); VariantInit(&varMyURL); varMyURL.vt = VT_BSTR; varMyURL.bstrVal = SysAllocString(_T("http://www.vcsos.com")); iWebBrowser-> Navigate2(&varMyURL,0,0,0,0); VariantClear(&varMyURL); iWebBrowser-> Release(); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (int)DefWindowProc(hWnd,message,wParam,lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { static TCHAR szAppName[]=TEXT("WebBrowser"); static TCHAR szClassName[]=TEXT("WebBrowser"); HWND hWnd; MSG msg; WNDCLASS wndclass; wndclass.style=CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(hInstance, IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szClassName; if(!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("Error!"),szAppName,MB_ICONERROR); return 0; } hWnd=CreateWindow(szClassName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL); ShowWindow(hWnd,nShowCmd); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
代码总共包含两个函数,WinMain函数用来初始化WNDCLASS类并实现消息循环,WndRroc响应消息并完成Web Browser浏览器容器的创建。使用了CAxWindow作为ActiveX控件的容器,Create函数用来创建该容器,它是父类CWindow的成员函数。CreateControl是CAxWindow的成员函数,用来创建一个ActiveX控件,将其初始化,并将其承载于指定的窗口。下面是该函数的相关说明:
CAxWindow::CreateControl 创建一个ActiveX控件,将其初始化,并将其承载于指定的窗口。 HRESULT CreateControl( LPCOLESTR lpszName, IStream* pStream = NULL, IUnknown** ppUnkContainer = NULL ); HRESULT CreateControl( DWORD dwResID, IStream* pStream = NULL, IUnknown** ppUnkContainer = NULL ); 参数 lpszName 用于创建控件的字符串的指针。 以下列方式之一必须设置:
一个ProgID (如“MSCAL.Calendar.7” 一个CLSID (“{8E27C92B-1264-101C-8A2F-040224009C02}”,该ID可以通过MFC导入ActiveX控件查看。 一个URL (例如“http://www.microsoft.com” 为活动状态的引用文档例如“file:// documents MyDoc.doc” HTML 片段如“MSHTML:<HTML><BODY>这是一行文本</BODY></HTML>” 说明说明 “MSHTML:”必须在 HTML 片段之前,以便被指定为 MSHTML 流。 仅ProgID和CLSID在Windows Mobile平台支持。 Windows CE嵌入平台,除Windows Mobile之外使用CE IE支持对所有类型包括ProgID,CLSID,URL,引用活动文档和HTML的片段。 pStream [out]一个指向用于初始化控件的属性的流的指针。 可以是 NULL。 ppUnkContainer [out]将接收容器的 IUnknown 指针的地址。 可以是 NULL。 dwResID HTML资源的ID。 webbrowser控件具有指定的资源将创建并填充。 返回值 标准 HRESULT 值。 要求 Header: atlwin.h |