. 调试工程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类,这个类非常复杂。所以决定先不直接看成员函数和变量。进入了那个成员函数或者使用了那个成员变量在具体观察干了什么。
发表评论