转自DuiLib中文网 http://www.duilibcn.com/duicreator/95.html
在(1)轻松构建DuiLib HelloWorld By DuiCreator(上)中我轻松的用DuiCreator构建了一个DuiLib EXE程序。你可能会有疑问,DuiLib在什么地方?DuiLib在DuiCreator中已经编译好了,默认是静态编译的,因为这样有利于发布我们的程序。它的位置在D:\vc2010\sdk\duilib,里面有链接库和头文件。
编译器使用的是VC2010,之所以使用它是因为VC2010默认编译的程序即可在WindowsXP下运行,不像VC2013那样还需要改link参数。DuiCreator是基于QtCreator构建的,因此它的项目文件管理也是使用qmake,项目管理也可以使用cmake,前提是你的机器已经安装了cmake,并且在path路径中能找到cmake,但是
我没使用过cmake来管理QtCreator的项目,所以这里就不再多说。
.pro文件是项目文件,包含了链接文件和头文件搜索路径,源代码的文件列表,exe图标和版本文件app.rc等。
首先要分析的是cmainwindow.h文件,双击打开它,
- #ifndef CMAINWINDOW_H
- #define CMAINWINDOW_H
-
- #include <Windows.h>
- #include <objbase.h>
- #include <UIlib.h>
- using namespace DuiLib;
-
- class CMainWindow : public WindowImplBase
- {
- public:
- CMainWindow(const CDuiString& m_uiFolderName,const CDuiString& sUiFileName);
-
- virtual ~CMainWindow();
-
- void setWindowTitle(const CDuiString& sTitle);
- CLabelUI* m_titleLabel;
-
- protected:
- virtual LPCTSTR GetWindowClassName() const;
-
- virtual CDuiString GetSkinFile();
-
- virtual void InitWindow();
- virtual CDuiString GetSkinFolder();
-
- void OnFinalMessage(HWND hwnd);
-
- virtual CControlUI* CreateControl(LPCTSTR pstrClass);
- void Notify(TNotifyUI& msg);
-
- private:
- CDuiString m_uiFileName;
- CDuiString m_uiFolderName;
-
- CButtonUI* m_minBtn;
- CButtonUI* m_maxBtn;
- CButtonUI* m_restoreBtn;
- CButtonUI* m_closeBtn;
- };
- #endif // CMAINWINDOW_H
-
复制代码
可以看到它继承自WindowImplBase,同时有两个参数m_uiFolderName是皮肤文件夹的名称,这里是"skin",在main.cpp里可以看到,sUiFileName是它的XML界面文件。
因为是自绘标题栏,所以它有一个void setWindowTitle(const CDuiString& sTitle);成员函数,
这里为什么还有一个public CLabelUI* m_titleLabel的成员函数呢?
为了对标题栏的控制更加彻底,用m_titleLabel可以控制标题栏的颜色字体等。
void Notify(TNotifyUI& msg);函数已经被构建,可以响应界面内控件的某些事件。
virtual CControlUI* CreateControl(LPCTSTR pstrClass); 也已被构建,用它可以实现自绘控件功能。
再看main.cpp
- #define WIN32_LEAN_AND_MEAN
- #define _CRT_SECURE_NO_SEPRECATE
-
- #include "cmainwindow.h"
-
- int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
- {
- CPaintManagerUI::SetInstance(hInstance);
- CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
-
- CMainWindow* pFrame = new CMainWindow(L"skin",L"CMainWindow.xml");
-
- pFrame->Create(NULL,L" Hello DuiLib",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
- pFrame->CenterWindow();
- pFrame->ShowWindow();
-
- CPaintManagerUI::MessageLoop();
- delete pFrame;
- return 0;
- }
-
复制代码
首先包含了#include "cmainwindow.h"头文件
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
这两句就无需多解释了,设置资源路径。
CMainWindow* pFrame = new CMainWindow(L"skin",L"CMainWindow.xml");
这句创建了一个实例类,两个参数分别是皮肤文件夹路径和XML界面文件
pFrame->CenterWindow();窗口居中
pFrame->ShowWindow();显示窗体
CPaintManagerUI::MessageLoop();消息循环
项目切换到release,然后重新编译项目,在项目设置里可以看到构建目录,打开它,进入到release目录
是不是看到编译好的EXE了呢?,skin为皮肤目录,把生成EXE和skin文件夹拷贝给我们的小伙伴,他们是否能运行呢?
应该是可以的,因为我们使用静态编译的DuiLib和/MT编译的程序。
项目中app.rc为EXE的版本和版权文件,包含了EXE的图标ico文件,修改它们,你也可以制作属于自己的DuiLib程序了。