第二章 duilib库框架介绍

duilib库类图

第二章 duilib库框架介绍_第1张图片

Duilib组件

工具库

第二章 duilib库框架介绍_第2张图片

·        UI相关:CPoint / CSize /CDuiRect

·        简单容器:CStdPtrArray /CStdValArray / CStdString / CStdStringPtrMap

控件库

第二章 duilib库框架介绍_第3张图片

上面这些类看名字就基本能够理解其具体的含义了,当然除了基本的基础库,还有一些和窗口使用相关的工具的封装,如窗口工具:WindowImplBase,这个工具我们在这里不详述,后面使用中会经常用到。

1.2 控件库

第二章 duilib库框架介绍_第4张图片

控件库在duilib的实现中被分为了两块:CoreControl

·        Core中包含的是所有控件公用的部分,里面主要是一些基类和绘制的封装。

·        Control中包含的就是各个不同的控件的行为了。

这当中尤其要注意控件基类CControlUI和容器基类CContainerUI,这是duilib核心类(如下图所示)中是很重要的两部分:

第二章 duilib库框架介绍_第5张图片

1.2.1. 控件基类:CControlUI

        CControlUI在整个控件体系中非常重要,它是所有控件的基类,也是组成控件树的基本元素,控件树中所有的节点都是一个CControlUI
       
它基本包括了所有控件公共的属性,如:位置,大小,颜色,是否有焦点,是否被启用等等。当然这个类中还提供了非常多的基础函数,用于重载来实现子控件,如获取控件名称和ClassName,是否显示等等。
       
另外为了方便从XML中直接解析出控件的各个属性,这个类中还在提供了一个SetAttribute的方法,传入字符串的属性名称和值对特定的属性进行设置,内部其实就是挨个比较字符串去完成的,所以平时使用的时候就还是不要使用的比较好了,因为每个属性实际上都有特定的方法来获取和设置。
       
另外每个控件中还有几个事件管理的对象——CEventSource,这些对象会在特定的时机被触发,如OnInit,调用其中保存的各个回调函数。

1.2.2. 容器基类:CContainerUI

        有了基本的控件基类之后,我们就需要容器来将他管理起来,这个容器就是CContainerUI,其内部用一个数组来保存所有的CControlUI的对象,后续的所有工作,就都是基于这个对象来进行的了。
这样在CContainerUI里面,主要实现了一下几个功能:

·        子控件的查找:CContainerUI::FindControl

·        子控件的生命周期管理:是否销毁(在Remove的时候自动销毁) / 是否延迟销毁(交给CPaintMangerUI去一起销毁)。

·        滚动条:所有的容器都支持滚动条,在其内部会对键盘和鼠标滚轮事件进行处理(CContainerUI::DoEvent),对其内部所有的元素调整位置,最后在绘制的时候实现滚动的效果

·        绘制:由于容器中有很多元素,所以为了加快容器的绘制,绘制的时候会获取其真正需要绘制的区域,如果子控件不在此区域中,那么就不予绘制了

而对于这些控件的绘制实现以及相关使用,在后续具体进一步学习中再深入详解。

框架基本流程

框架的基本流程实际上类似Win32创建窗口流程,如果对于Win32比较熟悉,这部分可以很快掌握。

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   // 实例句柄与渲染类关联
   CPaintManagerUI::SetInstance(hInstance);
   CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));
   // 初始化COM库, 为加载COM库提供支持
   HRESULT Hr = ::CoInitialize(NULL);                  
   if( FAILED(Hr) ) 
        return 0;
   // 创建窗口类
   CMainFrameWnd* pFrame = new CMainFrameWnd();    
   if( pFrame == NULL ) 
        return 0;
    // 注册窗口类与创建窗口
    //  实际上这里调用Create操作和Win32创建窗体一样,内部实际上做了以下操作:
    //  RegisterSuperclass (注册一个超类)
    //  RegisterWindowClass (注册窗口类)
    //  ::CreateWindowEx (创建窗口,此时触发 WM_CREATE 消息)
   //  HandleMessage  ( WM_CREATE消息处理OnCreate)
  pFrame->Create(NULL, _T("主程序"), UI_WNDSTYLE_FRAME, 0L, 0, 0, 800, 600);
    // 窗口居中显示    
  pFrame->CenterWindow();          
  ::ShowWindow(*pFrame, SW_SHOW);
  // 处理消息循环
  CPaintManagerUI::MessageLoop();
  // 退出程序并释放COM库
  ::CoUninitialize();
             
  return 0;
}


你可能感兴趣的:(duilib)