(4)用DuiCreator的DuiLib類嚮導,加速多窗口程序製作

轉自DuiLib中文網 http://www.duilibcn.com/duicreator/97.html


在前面的例子中,使用DuiCreator已經能輕鬆開發一個簡單單窗口應用,但是一個完整的程序可能是需要多個窗口的,比如點擊一個按鈕需要彈出登錄界面,那麼就需要另外的窗體了。DuiCreator的DuiLib類添加嚮導能輕而易舉的做出多個窗體。
首先用DuiCreator新建一個DuiLib EXE程序,建好後在工程上點擊右鍵,選擇“添加新”,或者按快捷鍵 CTRL + N,彈出類嚮導,這裏選擇,DuiLib Windows C++ Class,之所以還有個DuiLib Contrl C++ Class是因爲DuiLib的窗體類和控件類的基類是不一樣的。
 
Class Name 填寫新類的名稱,這裏就叫LoginDialog好了。完成之後工程裏多了logindialog.h,logindialog.cpp,logindialog.xml3個文件

  1. #ifndef LOGINDIALOG_H
  2. #define LOGINDIALOG_H


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

  7. class LoginDialog : public WindowImplBase
  8. {
  9. public:
  10.     LoginDialog(const CDuiString& m_uiFolderName,const CDuiString& sUiFileName);
  11.     virtual ~LoginDialog();

  12.     //設置窗口標題
  13.     void setWindowTitle(const CDuiString& sTitle);
  14.     CLabelUI* m_titleLabel;

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

  17.     virtual CDuiString GetSkinFile();

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

  20.     void OnFinalMessage(HWND hwnd);

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

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

  26.     CButtonUI* m_minBtn;
  27.     CButtonUI* m_maxBtn;
  28.     CButtonUI* m_restoreBtn;
  29.     CButtonUI* m_closeBtn;
  30. };


  31. #endif // LOGINDIALOG_H
複製代碼
LoginDialog 和 CMainWindow一樣同樣繼承自WindowImplBase。
打開 CMainWindow.cpp 添加LoginDialog的頭文件#include "logindialog.h"編輯如下代碼
  1. void CMainWindow::Notify(TNotifyUI &msg)
  2. {
  3.     if(msg.sType == DUI_MSGTYPE_CLICK)
  4.     {
  5.         //(*
  6.         if(msg.pSender == m_minBtn)
  7.         {this->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, NULL);}
  8.         if(msg.pSender == m_maxBtn)
  9.         {this->SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, NULL);}
  10.         if(msg.pSender == m_restoreBtn)
  11.         {this->SendMessage(WM_SYSCOMMAND, SC_RESTORE, NULL);}
  12.         if(msg.pSender == m_closeBtn)
  13.         {::PostQuitMessage(0L);}
  14.         //*)

  15.         if(msg.pSender->GetName() == L"button1")
  16.         {
  17.             //::MessageBoxW(NULL,L"Hello DuiLib",L"ok",MB_OK);
  18.             LoginDialog* dlg = new LoginDialog(L"skin",L"LoginDialog.xml");
  19.             dlg->Create(m_hWnd,L" 登錄",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
  20.             dlg->ShowModal();

  21.         }
  22.     }
  23. }
複製代碼
編譯運行程序,如果出現編譯錯誤,執行qmake,然後再重新構建項目,看一下我們的模態窗口是否出來了呢? 
注意,如果登錄對話框的標題是亂碼,需要用NotePad++改變CMainWindow.cpp的編碼爲UTF-8編碼。
LoginDialog* dlg = new LoginDialog(L"skin",L"LoginDialog.xml"); 說明LoginDialog的皮膚文件也是在skin文件夾裏,窗體佈局文件則是LoginDialog.xml。
dlg->Create(m_hWnd,L" 登錄",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE); 這句話創建了登錄窗體,它的上級是m_hWnd,也就是CMainWindow,如果置NULL,則登錄對話框就不是模態的了。
dlg->ShowModal(); 這句就是顯示模態對話框了。

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