轉自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的窗體類和控件類的基類是不一樣的。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5ybv1WayomM6JzavpWa6RTd0ADO0MTMvwVNw8CXyETNxAjMvwVb1J3bm9CX05WZth2YhRHdh9CXhRXYk9CXt92Yu42YilGbpVHZvw1LcpDc0RHaiojIsJye.png)
Class Name 填寫新類的名稱,這裡就叫LoginDialog好了。完成之後工程裡多了logindialog.h,logindialog.cpp,logindialog.xml3個檔案
- #ifndef LOGINDIALOG_H
- #define LOGINDIALOG_H
- #include <Windows.h>
- #include <objbase.h>
- #include <UIlib.h>
- using namespace DuiLib;
- class LoginDialog : public WindowImplBase
- {
- public:
- LoginDialog(const CDuiString& m_uiFolderName,const CDuiString& sUiFileName);
- virtual ~LoginDialog();
- //設定視窗标題
- 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 // LOGINDIALOG_H
複制代碼 LoginDialog 和 CMainWindow一樣同樣繼承自 WindowImplBase。
打開 CMainWindow.cpp 添加 LoginDialog的頭檔案 #include "logindialog.h" , 編輯如下代碼
- void CMainWindow::Notify(TNotifyUI &msg)
- {
- if(msg.sType == DUI_MSGTYPE_CLICK)
- {
- //(*
- if(msg.pSender == m_minBtn)
- {this->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, NULL);}
- if(msg.pSender == m_maxBtn)
- {this->SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, NULL);}
- if(msg.pSender == m_restoreBtn)
- {this->SendMessage(WM_SYSCOMMAND, SC_RESTORE, NULL);}
- if(msg.pSender == m_closeBtn)
- {::PostQuitMessage(0L);}
- //*)
- if(msg.pSender->GetName() == L"button1")
- {
- //::MessageBoxW(NULL,L"Hello DuiLib",L"ok",MB_OK);
- LoginDialog* dlg = new LoginDialog(L"skin",L"LoginDialog.xml");
- dlg->Create(m_hWnd,L" 登入",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
- dlg->ShowModal();
- }
- }
- }
複制代碼 編譯運作程式,如果出現編譯錯誤,執行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(); 這句就是顯示模态對話框了。