`
wx1569567608
  • 浏览: 71235 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

wxWidgets wrap wtl browser

 
阅读更多

首先我们必须了解wxWidgets框架有自己的消息处理体系,WTL也有自己的消息处理体系,现在我们是wxWidgets wrap wtl,主消息循环是wxwidgets的,我们可以通过一个线程启动wtl消息循环,我们看下atlapp.h里面CAppModule一个函数的代码就会了解:

 BOOL AddMessageLoop(CMessageLoop* pMsgLoop)
 {
  CStaticDataInitCriticalSectionLock lock;
  if(FAILED(lock.Lock()))
  {
   ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddMessageLoop.\n"));
   ATLASSERT(FALSE);
   return FALSE;
  }

  ATLASSERT(pMsgLoop != NULL);
  ATLASSERT(m_pMsgLoopMap->Lookup(::GetCurrentThreadId()) == NULL);   // not in map yet

  BOOL bRet = m_pMsgLoopMap->Add(::GetCurrentThreadId(), pMsgLoop);

  lock.Unlock();

  return bRet;
 }

再看WTL SDK sample中例子工程TabBrowser里面的启动函数:

int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
 CMessageLoop theLoop;
 _Module.AddMessageLoop(&theLoop);

 CMainFrame wndMain;

 if(wndMain.CreateEx() == NULL)
 {
  ATLTRACE(_T("Main window creation failed!\n"));
  return 0;
 }

 wndMain.ShowWindow(nCmdShow);

 int nRet = theLoop.Run();

 _Module.RemoveMessageLoop();
 return nRet;
}

标注红色的第一行代码表示wtl的消息循环是线程安全的,也就是说我们不能从wxwidgets主线程中直接使用wtl体系里面的UI。另外又由于CAppModule派生于ATL::CComModule,我们把有关WTL的功能封装成一个独立的DLL。

下面我们介绍wrap wtl browser的详细步骤:

我们先新建一个DLL工程,然后把WTL SDK sample中例子工程TabBrowser中的两个文件TabBrowser.cpp和BrowserView.h拷贝过来使用,注意,我们要继续使用CBrowserView来实现browser的视图展现。

1、设计dll接口

1)启动wtl消息循环接口

该接口实现是创建一个线程,通过这个线程启动wtl消息循环,线程函数实现很简单,我们只要稍微修改一下TabBrowser.cpp里面的_tWinMain入口函数就可以了,首先,把函数名改掉如改为InitWTL,参数只保留第一个参数,如下:

int InitWTL(HINSTANCE hInstance)
{
 HRESULT hRes = ::CoInitialize(NULL);
 ATLASSERT(SUCCEEDED(hRes));

 AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES | ICC_USEREX_CLASSES);

 hRes = _Module.Init(NULL, hInstance);
 ATLASSERT(SUCCEEDED(hRes));

 AtlAxWinInit();

 int nRet = Run();

 _Module.Term();
 ::CoUninitialize();

 return nRet;
}

当然。Run函数也要修改一下,如下:

static CBrowserView* G_View= NULL;

int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
 CMessageLoop theLoop;
 _Module.AddMessageLoop(&theLoop);

G_View = new CBrowserView;
G_View->Create(NULL, rcDefault, NULL,  WS_DISABLED);

 int nRet = theLoop.Run();

 _Module.RemoveMessageLoop();
 return nRet;
}

注意红色字体的部分,我们通过这个隐藏的window来实现与wxwidgets交互的消息。

另外要注意CBrowserView要添加一个基类CMessageFilter,OnCreate函数里面添加如下代码:

// register object for message filtering and idle updates
  CMessageLoop* pLoop = _Module.GetMessageLoop();
  ATLASSERT(pLoop != NULL);
  pLoop->AddMessageFilter(this);

OnDestroy函数里面添加如下代码:

CMessageLoop* pLoop = _Module.GetMessageLoop();
  ATLASSERT(pLoop != NULL);
  pLoop->RemoveMessageFilter(this);

该接口调用可以放在dll attach的时候,也可以在wxwidgets程序里面调用。

2)创建browser的接口

首先该接口要有一个参数就是HWND类型的,作为我们new CBrowserView 的父窗口句柄;第二个参数就是RECT类型的,视图的位置大小;第三个参数就是URL,我们要打开的网页的地址。有这三个参数就足够了,当然你也可以添加其他参数如果必要。

该函数的实现要注意了,由于我们是要new一个CBrowserView ,该函数要有wxwidgets程序调用,所以我们不能直接在该函数里面New,要通过发送windows的消息,首先我们在BrowserView.h里面自定义一个windows消息(先前已经有两个自定义消息了):

#define WM_BROWSERSCREATE   (WM_APP + 3)

接口实现如下:

void CreateWtlBrowser(HWND parent, RECT& rect, LPCTSTR strURL)

{

if (G_View && G_View->IsWindow())

{

WTLPARAMINFO *info = new WTLPARAMINFO;//我们定义的一个传递参数的结构体,使用后不要忘记delete

info->m_hWnd = parent;

info->rect = rect;

info->m_url = strURL;

::PostMessage(G_View->m_hWnd, WM_BROWSERSCREATE, (WPARAM)info ,0);//注意,此处只能用Post,不能用send,否则等于是直接调用了

}

}

然后我们在BrowserView.h里来添加实现WM_BROWSERSCREATE消息的映射函数就可以了,如:

LRESULT OnBrowserCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {

WTLPARAMINFO *info = (WTLPARAMINFO *)wParam;

if (info)

{

   CBrowserView* pView = new CBrowserView;
   pView->Create(info->m_hWnd, info->rect, info->m_url, WS_CHILD | WS_VISIBLE |  WS_VSCROLL | WS_HSCROLL);

}

  bHandled=FALSE;
  return 1;
 }

实际上,在wxwidgets程序里面,我们仅仅知道一个父窗口的句柄,其他都封装在了一个DLL里面,wxwidgets里面对browser的所有操作只能通过这个窗口句柄,所以我们要在DLL里面保持一个hash表,用来可以通过这个消息句柄找到对应的CBrowserView实例。

OK了,其他诸如重新刷新窗口大小,前进,后退,刷新,停止等接口照着这个接口实现就可以了。

2、消息接口设计

这个消息接口指的是从dll里面反映到wxwidgets程序里面的消息,例如浏览器状态,标题变化及NewWindow事件等的通知。当然,这个实现我们也通过自定义windows消息,通过在wxWidgets里面接收消息就OK了。

 

介绍结束,只要注意关键的几个点就不会有难度了!

转载于:https://my.oschina.net/u/2332347/blog/637837

分享到:
评论

相关推荐

    使用wxwidgets进行跨平台程序开发(中文版)_wxWidgets学习_wxWidgets_

    **wxWidgets 概述** wxWidgets 是一个开源的 C++ 库,它允许开发者使用标准的 C++ 编程语法创建跨平台的图形用户界面(GUI)应用程序。这个库提供了丰富的控件集和功能,使得开发者可以编写一次代码,就能在多个...

    嵌入式图像开发wxWidgets

    嵌入式图像开发中,wxWidgets是一个至关重要的工具,它为开发者提供了强大的跨平台能力,使得应用程序可以在多种操作系统上运行,如Linux、Windows以及macOS等。wxWidgets库的使用,简化了C++程序员创建GUI(图形...

    wxWidgets中文教程带实例.zip

    **wxWidgets 概述** wxWidgets 是一个开源的跨平台 C++ 库,它使得开发者能够用 C++ 创建原生的 GUI(图形用户界面)应用程序。这个库支持多个操作系统,包括 Windows、Linux 和 macOS,因此程序员可以编写一次代码...

    wxWidgets-2.8.0.zip_Accel.cpp_wxDynamicLibrary_wxWidgets_wxwidge

    《wxWidgets-2.8.0:跨平台GUI框架的深度解析》 wxWidgets是一个开源的、免费的、跨平台的图形用户界面(GUI)库,它的版本2.8.0是一个重要的里程碑,广泛应用于软件开发领域。这个压缩包中的`Accel.cpp`文件和`...

    wxWidgets和MFC混合编程

    wxWidgets和MFC混合编程 wxWidgets和MFC混合编程是指在一个程序中同时使用wxWidgets和MFC这两种技术。wxWidgets是一个跨平台的GUI库,而MFC是微软公司提供的一种应用程序框架。虽然两者都可以用来开发图形用户界面...

    wxWidgets跨平台程序开发

    全书共有20章,第·1·章简要介绍了·wxWidgets·的发展历史和框架结构,第2章介绍了wxWidgets的程序框架及其实现,第3章深入剖析了wxWidgets的事件处理机制,第4~11章详细讲述了wxWidgets的图形用户界面、数据结构...

    wxWidgets教程(中文)

    【wxWidgets教程(中文)】是一份详细的指南,旨在帮助开发者理解和使用wxWidgets库进行跨平台的图形用户界面(GUI)编程。wxWidgets是开源的C++库,它提供了原生的GUI支持,允许程序员使用一种语言和API在多个操作...

    WTL_81_and_90

    虽然WTL的学习曲线可能比使用一些高级的图形用户界面框架如Qt或wxWidgets陡峭,但一旦掌握,它能提供对Windows底层机制的直接控制,从而实现更为精细的定制和优化。 在实际项目中,可以利用WTL创建各种类型的...

    wxWidgets入门 深入 查询

    **wxWidgets入门与深入查询** **一、wxWidgets概述** wxWidgets是一款强大的开源跨平台GUI库,它允许开发者使用C++编写一次代码,即可在多种操作系统上构建原生的图形用户界面,包括Windows、Linux、macOS等。...

    使用wxWidgets进行跨平台程序开发 pdf

    wxWidgets是一个成熟的跨平台C++库,它允许开发者使用一套代码来创建图形用户界面(GUI)程序,这些程序能够在Windows、Linux、Mac OS X等多个操作系统上运行。在深入了解如何使用wxWidgets进行程序开发之前,有必要...

    wxWidgets-3.1.4_wxWidgets_wxwidgetsversion_

    【wxWidgets】是一个开源的C++库,专为构建跨平台的图形用户界面应用程序而设计。这个库使得开发者能够在不同的操作系统上使用相同的代码基础进行开发,包括Windows、Linux、macOS等。标题中的"wxWidgets-3.1.4_...

    wxWidgets 参考手册

    想用wxWidgets 进行界面开发,苦于wxWidgets 的参考资料很少,几乎只有一本书——《使用wxWidgets进行跨平台程序开发》,但是这本不适合用作参考手册,即想找那个函数就可以很快找到的那种。最后在wxWidgets官网找到...

    wxWidgets3.1.2源代码

    **wxWidgets 3.1.2 源代码详解** `wxWidgets` 是一个功能强大的C++库,它为开发者提供了跨平台的图形用户界面(GUI)开发能力。这个源代码包是`wxWidgets`的3.1.2版本,意味着它包含了最新稳定版的所有功能和改进。...

    配置好的CodeBlocks20.03+wxWidgets3.14

    配置CodeBlocks与wxWidgets的集成,可以让你在CodeBlocks中创建和管理使用wxWidgets库的项目。以下是一个详细步骤的概述: 1. **安装CodeBlocks**:首先,你需要在D盘解压缩`codeblocks-20.03`文件,确保不改变其...

    VS2019+wxWidgets-3.1.4的配置的模板工程(wxProject.zip)

    在本文中,我们将深入探讨如何使用Visual Studio 2019与wxWidgets 3.1.4进行项目配置。wxWidgets是一个开源的C++库,它允许开发人员创建跨平台的GUI应用程序,支持Windows、Linux、Mac OS X等多个操作系统。VS2019是...

    CodeBlocks编译wxWidgets设置

    ### CodeBlocks编译wxWidgets设置详解 在深入探讨如何在CodeBlocks中编译wxWidgets之前,我们先简要了解一下这两个工具的基本概念。 #### CodeBlocks简介 CodeBlocks是一款免费且开源的集成开发环境(IDE),主要...

    wxWidgets编程全套手册

    **wxWidgets编程全套手册** **概述** wxWidgets 是一个开源的C++库,它允许开发者创建能在多个操作系统上运行的图形用户界面(GUI)应用程序,包括Windows、macOS、Linux等。这个编程全套手册提供了全面的指导,...

    wxWidgets 串口在visual stdio 2010环境下的实现

    在本项目中,我们将探讨如何在Visual Studio 2010环境下,利用wxWidgets框架来实现串口功能,具体是通过wxctb-0.9这个库进行操作。以下是对这些知识点的详细说明: **wxWidgets框架**: wxWidgets是一个开源的C++库...

    wxWidgets-3.1.1源码安装包

    wxWidgets(/wɪksˈwɪdʒɪts/,原名wxWindows[1])是一個開放原始碼且跨平台的物件工具集(widget toolkit),其函式庫可用來建立基本的圖形使用者介面(GUI)。wxWidgets由Julian Smart於1992年首先開發。 ...

    wxWidgets安装+教程

    wxWidgets安装+教程wxWidgets安装+教程wxWidgets安装+教程wxWidgets安装+教程wxWidgets安装+教程wxWidgets安装+教程wxWidgets安装+教程wxWidgets安装+教程wxWidgets安装+教程

Global site tag (gtag.js) - Google Analytics