轉自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程序了。