c++ UI框架

一 MFC

1.六大关键技术:

①:MFC程序的初始化过程

②:RTTI(Runtime Type Information) 运行时类型识别

③:Dynamic Creation 动态创建

④:Persistence 永久保存

⑤:Message Mapping 消息映射

⑥:Message Routing 消息传递

MFC程序的初始化过程

c++ UI框架_第1张图片

CMyWinApp theApp;

void main(){

        CWinApp* pApp = AfxGetApp();

        pApp->InitApplication();

        pApp->InitInstance();

        pAPP->Run();

}

构造、析构次序:

CObject 构造->CCmdTarget构造->CWinThread构造->CWinApp构造->CMyWinApp构造

CMyWinApp析构->CWinApp析构->CWinThread析构->CCmdTarget析构造->CObject 析构

main执行顺序:

CWinApp::InitApplication->CMyWinApp::InitInstance->CMyFrameWnd::CMyFrameWnd->CFrameWnd::Create->CWnd::CreateEx->CFrameWnd::PreCreateWindow->CWinApp::Run->CWinThread::Run

RTTI(运行时识别)

每一个类都有一个CRuntimeClass成员变量,并以类型型录链表连接管理。

struct CRuntimeClass

{

      LPCSTR  m_lpszClassName;

      int  m_nObjectSize;

      UINT   m_wSchema;

      CObect*  (PASCAL*  m_pfnCreateObject)();

      CRuntimeClass*   m_pBaseClass;            //基类

      static  CRuntimeClass *  pFirstClass;        //链表头指针

      CRuntimeClass*  m_pNextClass;              //下一个注册类

};

c++ UI框架_第2张图片

命名规则(例如在类名称之前冠以“class”作为它的名称),然后,经由某种手段将整个类库建构好之后,“类别型录”能呈现类似这样的风貌:

c++ UI框架_第3张图片

DECLARE_DYNAMIC
IMPLEMENT_DYNAMIC

动态创建
DECLARE_DYNCREATE
IMPLEMENT_DYNCREATE

永久保存
DECLARE_SERIAL
IMPLEMENT_SERIAL

MFC的连续存储(serialize)机制俗称串行化。

Message Map
DECLARE_MESSAGE_MAP
BEGIN_MESSAGE_MAP
ON_COMMAND
END_MESSAGE_MAP

c++ UI框架_第4张图片

Command Routing
WM_COMMAND消息(其他消息沿基类传递)
CFrameWnd消息:CView/CDocument/CFrameWnd/CWinApp
CView消息:Cview/Cdocument

代码执行流程:
AfxWndProc()
AfxCallWndProc()
CWnd::WindowProc()
CFrameWnd::OnCommand()
CWnd::OnCommand()
CFrameWnd::OnCmdMsg()
CFrameWnd::GetActiveView()
CView::OnCmdMsg()
CCmdTarget::OnCmdMsg()

二 Duilib

c++ UI框架_第5张图片

三 cef3嵌入html

CEF框架定义了一整套开发框架,它允许应用程序通过继承和重载相应的接口实现功能的多态。比如,我们需要控制浏览器初始开窗的行为,可以重载CefBrowserProcessHandler这个基类;VC和JS的交互逻辑是在Render中实现的,这里我们需要重载CefRenderProcessHandler,注册自己的JS函数,由前端页面发起调用。

c++ UI框架_第6张图片

cef类介绍:

CefApp,每个进程对应一个CefApp接口。此接口用来传递到CefInitialize(),和允许应用程序定制全局,如资源加载,代理。一些功能是由所有进程共享的,有些必须实现浏览器的过程中,必须在渲染过程中执行。见详情头文件的注释。

CefClient:是主浏览器窗口的代表接口,处理浏览器页面的各种回调信息,包括Browser的生命周期,右键菜单,对话框,状态通知显示,下载事件,拖拽事件,焦点事件,键盘事件,离屏渲染事件。这个接口做为参数传递给CreateBrowser()

CefBrowser:主要的浏览器窗口类,每一个CefBrowser对应一个CefClient接口。可以用静态的函数CreateBrowser() 和CreateBrowserSync() 来创建一个新的浏览器窗口,公开由浏览器提供的功能。包括前进后退导航,来源检索,加载请求等。

      CefFrame 代表一个浏览器窗口的框架,每个浏览器窗口有一个顶层的主框架,而这个主框架可以用GetMainFrame() 方法得到。

      CefBrowser和CefFrame对象被用来发送命令给浏览器以及在回调函数里获取状态信息。每个CefBrowser对象包含一个主 CefFrame对象,主CefFrame对象代表页面的顶层frame;同时每个CefBrowser对象可以包含零个或多个的CefFrame对象, 分别代表不同的子Frame。例如,一个浏览器加载了两个iframe,则该CefBrowser对象拥有三个CefFrame对象(顶层frame和两 个iframe)。      

      CefRequest:代表URL,方法,发送数据和头文件等这样的请求。

      CefSchemeHandleFactory:被用来处理像myscheme://mydomain类似客户计划的请求

      CefReadHandler和CefWriteHandle是一个读写数据的简单接口。

      CefV8Handler,CefV8Value和CefV8Context是被用来创建和访问JavaScript对象。

      CefBrowserHost:有关运行browser进程中唯一可用的browser窗口的功能。例如,检索本地父窗口句柄,或销毁browser窗口。

CefBrowserProcessHandler:对应浏览器进程的回调

CefRenderProcessHandler:渲染进程回调,WebKit和V8对渲染进程中应用程序的集成能力。通过CefApp返回此对象的一个​​实例。

      CefCookie:处理cookie的功能。

使用CEF3开发的过程中,CefClient使用最频繁的,了解cefclient中的回调类是很有必要的。所谓回调类,就是浏览器相关的动作发生时,去回调一些事件函数,用户可以在事件中获取或修改相关的信息。

cefclient中的回调类包括:

CefContextMenuHandler,回调类,主要用于处理 Context Menu 事件。

CefDialogHandler,回调类,主要用来处理对话框事件。

CefDisplayHandler,回调类,处理与页面状态相关的事件,如页面加载情况的变化,地址栏变化,标题变化等事件。

GetDragHandler,回调类,处理拖拽相关的事件,如从外边拖入浏览器事件

CefDownloadHandler,回调类,主要用来处理文件下载。

CefFocusHandler,回调类,主要用来处理焦点事件。

CefGeolocationHandler,回调类,用于申请 geolocation 权限。

CefJSDialogHandler,回调类,主要用来处理 JS 对话框事件。

CefKeyboardHandler,回调类,主要用来处理键盘输入事件。

CefLifeSpanHandler,回调类,主要用来处理与浏览器生命周期相关的事件,与浏览器对象的创建、销毁以及弹出框的管理。

CefLoadHandler,回调类,主要用来处理浏览器页面加载状态的变化,如页面加载开始,完成,出错等。

CefRenderHandler,回调类,主要用来处在在窗口渲染功能被关闭的情况下的事件。

CefRequestHandler,回调类,主要用来处理与浏览器请求相关的的事件,如资源的的加载,重定向等。

CEF3的CefBrowser类是实现浏览器最主要的一个类。主要由以下实现类组成:

CefMainDelegate实现通用进程的引导逻辑。

CefContentClient实现所有进程中共同的ContentAPI回调。

CefContext代表全局CEF内容在browser进程中。单个CefContext对象由CefInitialize()创建并由CefShutdown()销毁。

CefBrowserMainParts实现browser进程中的引导逻辑。

CefContentBrowserClient实现browser进程的ContentAPI回调。

CefBrowserHostImpl实现在browser进程中CefBrowser和CefBrowserHost的接口。提供粘合代码和工具的接口来和RenderViewHost通信。

CefContentRendererClient实现渲染进程中的ContentAPI回调。

CefBrowserImpl实现渲染进程中的CefBrowser接口。提供粘合代码和工具的借口来和RenderView通信。

在Browser进程中包含如下主要的线程:

  • TID_UI 线程是浏览器的主线程。如果应用程序在调用调用CefInitialize()时,传递CefSettings.multi_threaded_message_loop=false,这个线程也是应用程序的主线程
  • TID_FILE 线程负责与文件系统交互。
  • TID_IO 线程主要负责处理IPC消息以及网络通信。

c++ UI框架_第7张图片

c++与js交互

在客户端执行JS最简单的方法是使用CefFrame::ExecuteJavaScript()函数,该函数在浏览器和渲染进程中都可以使用,并且能在JS上下文之外使用。

CefRefPtr browser = ...;
CefRefPtr frame = browser->GetMainFrame();
frame->ExecuteJavaScript("alert('ExecuteJavaScript works!');",
    frame->GetURL(), 0);

上边简单的实例返回的结果是弹出('ExecuteJavaScript works!');运行在browser的主Frame中。

ExecuteJavaScript()函数可以用来与函数和变量交互框架的JS上下文,为了JS返回结果到客户端应用,可以使用窗口绑定或扩展

你可能感兴趣的:(UI,ui)