最新消息:想得多,做的少。一天到晚瞎鸡巴搞。

duilib源码剖析 day1 CWindowWnd和CPaintManagerUI

曲径通幽 阿虚 131浏览 0评论

.      调试工程TestApp1从WinMain开始。删除掉不必要的就可以开始F10大法了。

int APIENTRY WinMain(
    HINSTANCE hInstance, 
    HINSTANCE /*hPrevInstance*/, 
    LPSTR /*lpCmdLine*/, 
    int nCmdShow)
{
    CPaintManagerUI::SetInstance(hInstance);
    CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());

    HRESULT Hr = ::CoInitialize(NULL);
    if( FAILED(Hr) ) return 0;
     
    CWndShadow::Initialize(hInstance);

    //UI
    CFrameWindowWnd* pFrame = new CFrameWindowWnd();
    if( pFrame == NULL ) 
        return 0;
    pFrame->Create(
        NULL, 
        _T("这是一个最简单的测试用exe,修改test1.xml就可以看到效果"), 
        UI_WNDSTYLE_FRAME|WS_CLIPCHILDREN, 
        WS_EX_WINDOWEDGE);
    pFrame->CenterWindow();
    pFrame->ShowWindow(true);
    CPaintManagerUI::MessageLoop();

    ::CoUninitialize();
    return 0;
}

.      从WinMain1~2行调用的是的两个静态成员变量。

//全局静态,设置窗口实例句柄
CPaintManagerUI::SetInstance(hInstance);
//设置资源路径,且CPaintManagerUI::GetInstancePath()返回的是当前EXE程序所在的完整路径
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());

.      接下来是3~5行代码

//初始化COM组件,暂时不清楚为什么要初始化它
HRESULT Hr = ::CoInitialize(NULL);
//失败就退出
if( FAILED(Hr) ) return 0;
    
//这个初始化暂里面注册了一个窗口,但是暂时还不知道他是干什么的。先放过
CWndShadow::Initialize(hInstance);

.      接下来看到开始new程序的界面类以及对界面的创建、居中、显示和消息循环

//UI窗体类
CFrameWindowWnd* pFrame = new CFrameWindowWnd();
if( pFrame == NULL ) 
    return 0;
//创建窗体
pFrame->Create(
    NULL, 
    _T("这是一个最简单的测试用exe,修改test1.xml就可以看到效果"), 
    UI_WNDSTYLE_FRAME|WS_CLIPCHILDREN, 
    WS_EX_WINDOWEDGE);
//窗体居中
pFrame->CenterWindow();
//显示窗体
pFrame->ShowWindow(true);
//消息循环
CPaintManagerUI::MessageLoop();

.      根据官方的自定义的UI需要继承CWindowWnd、INotifyUI两个类和包含CPaintManagerUI类的成员变量。窗体CFrameWindowWnd类继承了CWindowWnd、INotifyUI、CDwm、CDPI四个类。CDwm和CDPI因为是在app里面添加的而不是Core中的内容暂且不管。

.      先看CWindowWnd类,它的定义不在是其他类的子类,观察他的成员函数和成员变量都是和窗口创建有关的成员函数,大致看了下成员函数名,顺序为从上至下源码我就不贴了。公开部分:获取窗口句柄、注册窗口类、创建窗体、窗口子类化、显示窗体、模态化对话框、关闭窗体、窗体桌面居中、设置ICON、Send/PostMessage、重设客户端大小、保护部分:虚函数(获取窗体名称、获取子类化窗体名称、获取窗体风格、接受消息事件、销毁窗体)静态(窗体消息事件、子类化窗体消息事件)。这个类感觉没什么特别复杂的。

.      INotifyUI类是事件响应类,暂时的看了下它的流程感觉挺复杂的。先放放。

.      CPaintManagerUI类,这个类非常复杂。所以决定先不直接看成员函数和变量。进入了那个成员函数或者使用了那个成员变量在具体观察干了什么。

转载请注明:虚无 » duilib源码剖析 day1 CWindowWnd和CPaintManagerUI

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址