打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
WIN32 应用程序内嵌IE浏览器(注意非MFC)

#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.2");
 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.163.com/"));
  iWebBrowser-> Navigate2(&varMyURL,0,0,0,0);
  VariantClear(&varMyURL); 
  iWebBrowser-> Release(); 
  break;
 case WM_SIZE:
  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;
 }

 //HRESULT hRes = _Module.Init(NULL, hInstance);
 GUID guid; 
 HRESULT hRes = _Module.Init(NULL, hInstance, &guid);

 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;
}

 

工程:很简单,我用的是 VS2005 建立一个WIN32工程,注意是空项目,建立后,什么也没有!这时候你可以向里面增加一个CPP文件,然后将代码拷贝过去!编译运行!

需要注意:项目->右键->属性->配置属性选项下 ->ATL属性下 选择"静态链接到ATL"

解析:

黑色字体的地方就不解释了,如果不熟悉去看下Win32的搭建(不要看MFC,MFC将这些封装的死死的,你很不容易看见的,遇见不熟悉的的语句,可以去百度或者GOOGLE搜索一下,你懂的)

彩色字体的地方

CComModule _Module; 
GUID guid; 
 HRESULT hRes = _Module.Init(NULL, hInstance, &guid);

以上就是COM模块的初始化,具体干些什么我也不懂,有朋友解释一下最好!如果没有他的话会报错误"就是那种初始化的错误(当然,我是指你使用ATL静态链接的时候)",还有接下来我们需要使用ATL的一些东西,所有,还是需要初始化这个模块的!

红色字体部分

IWebBrowser2* iWebBrowser;  浏览器的核心,获取的这个指针,你就相当于控制了整个IE,比如IE的基本操作,跳转,向前,向后,等等!其实怎么获取它,是我们的一个难题!它就是一个ACTIVE对象!

 static CAxWindow WinContainer; ACTIVE对象的容器,这个容器存放ACTIVE对象,重要的是,我认为,他可以将ACTIVE和WIN32窗口关联起来,这可是个纽带啊!

WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE); 看见了吧,hWnd正是你这个Win32窗口的句柄

LPOLESTR pszName=OLESTR("shell.Explorer.2");   这个是通过那个字符串获取了IE的字符串,有兴趣的同学需要梳理一下这里,GUID ,CLSID, LIBID, IID, CATID 看下有好处的,我回过头来也应该看看这些,弄清晰些!注册表啊,注册表!

WinContainer.CreateControl(pszName);  这里开始创建该类名对应的Actvie控件了

WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);这里要查询并获取IWebBrowser2这个指针了!__uuidof这个关键字很强大啊,他可以根据类名获取其对应的ID号。注意我这里只是获取IWebBrowser指针,你当然可以获取其他的Active对象指针!只不过第一个参数的ID和第二个对象要对应上哦!当然还要跟你CreateControl所创建Active对象有关喽。你要创建什么Active对象,找好对应关系吧啊!我是这样理解的!

VariantInit(&varMyURL);
  varMyURL.vt = VT_BSTR; 
  varMyURL.bstrVal = SysAllocString(_T("
http://www.163.com/"));
  iWebBrowser-> Navigate2(&varMyURL,0,0,0,0);
  VariantClear(&varMyURL); 

这些就是该对应的具体应用了!
  iWebBrowser-> Release();  //计数减少!就这样吧!这个应该不用写到这里吧! 

如果你开始写Active或者做相关这方面的工作,相信,上面的你应该能大概看懂的吧!有错误的请指教哈!

大家一起加油哦!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆,且每隔四分之一周期,圆的填充色和圆的周边颜色都发生变化,同时圆的半径在四分之一周期之内由正弦曲线幅值的0.2倍至0.6倍线性增长。
谁有C语言编写的病毒源代码?
孙鑫VC视频教程笔记之第一课“Windows程序的内部运行原理”
windows窗口的创建
Win32编程基础知识_天空总是蓝色的
windows编程——背景图片和透明特效的使用2
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服