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 |