天天看點

(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的窗體類和控件類的基類是不一樣的。

(4)用DuiCreator的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,然後再重新建構項目,看一下我們的模态視窗是否出來了呢?

(4)用DuiCreator的DuiLib類向導,加速多視窗程式制作

注意,如果登入對話框的标題是亂碼,需要用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(); 這句就是顯示模态對話框了。