使用CAxWindow在程序中引用 ActiveX 控件

2015-01-17 11:23:05|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++|来源:唯设编程网

本文我们介绍另一种方案,使用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

发表评论0条 】
网友评论(共?条评论)..
使用CAxWindow在程序中引用 ActiveX 控件