轉自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個文件
-
#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(); 這句就是顯示模態對話框了。