转自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(); 这句就是显示模态对话框了。