(2)輕鬆構建DuiLib HelloWorld By DuiCreator(下)

轉自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文件,雙擊打開它,

  1. #ifndef CMAINWINDOW_H
  2. #define CMAINWINDOW_H

  3. #include <Windows.h>
  4. #include <objbase.h>
  5. #include <UIlib.h>
  6. using namespace DuiLib;

  7. class CMainWindow : public WindowImplBase
  8. {
  9. public:
  10.     CMainWindow(const CDuiString& m_uiFolderName,const CDuiString& sUiFileName);

  11.     virtual ~CMainWindow();

  12.     void setWindowTitle(const CDuiString& sTitle);
  13.     CLabelUI* m_titleLabel;

  14. protected:
  15.     virtual LPCTSTR GetWindowClassName() const;

  16.     virtual CDuiString GetSkinFile();

  17.     virtual void InitWindow();
  18.     virtual CDuiString GetSkinFolder();

  19.     void OnFinalMessage(HWND hwnd);

  20.     virtual CControlUI* CreateControl(LPCTSTR pstrClass);
  21.     void Notify(TNotifyUI& msg);

  22. private:
  23.     CDuiString m_uiFileName;
  24.     CDuiString m_uiFolderName;

  25.     CButtonUI* m_minBtn;
  26.     CButtonUI* m_maxBtn;
  27.     CButtonUI* m_restoreBtn;
  28.     CButtonUI* m_closeBtn;
  29. };
  30. #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

  1. #define WIN32_LEAN_AND_MEAN
  2. #define _CRT_SECURE_NO_SEPRECATE

  3. #include "cmainwindow.h"

  4. int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
  5. {
  6.     CPaintManagerUI::SetInstance(hInstance);
  7.     CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());

  8.     CMainWindow* pFrame = new CMainWindow(L"skin",L"CMainWindow.xml");

  9.     pFrame->Create(NULL,L" Hello DuiLib",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
  10.     pFrame->CenterWindow();
  11.     pFrame->ShowWindow();

  12.     CPaintManagerUI::MessageLoop();
  13.     delete pFrame;
  14.     return 0;
  15. }
複製代碼
首先包含了#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程序了。

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章