C++轻量级界面库DuiLib简介(二)—使用DuiLib

来源:互联网 发布:编程一小时网站 编辑:程序博客网 时间:2024/05/20 23:05

书接上文。

前面我们已经建立好test.xml文件了,现在要做的是把刚建好的xml文件和所用到的图标文件打包形成一个压缩包(test.zip)。在VS 编译器中导入这个test.zip的资源。我这里最后形成的ID是IDR_ZIPRES。一切准备就绪,下面就开始代码部分的说明了。

二、创建Dialog

新建一个win32项目,在_tWinMain函数中加入以下代码:

CPaintManagerUI::SetInstance(hInstance);CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());   // 设置资源的默认路径(此处设置为和exe在同一目录)CTestUIDlg *pFrame = new CTestUIDlg(_T("test.xml"));pFrame->Create(NULL, _T("这是一个最简单的测试用exe,修改test.xml就可以看到效果"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);pFrame->CenterWindow();pFrame->ShowModal();CPaintManagerUI::MessageLoop();//!消息循环

以上代码用于创建出一个对话框并居中显示。


三、对话框类的介绍

上面代码中CTestUIDlg即是我们的对话框类,它继承于WindowImplBase类,WindowImplBase类是一个XML的包装类,封装了常用操作,以方便大家使用。 它是以XML作为界面描述的,所以用它的时候,我们必须将界面描述写到XML里。

下面是CTestUIDlg类的定义:

using namespace DuiLib;class CTestUIDlg: public WindowImplBase{public:virtual ~CTestUIDlg(void);virtual LPCTSTR GetWindowClassName() const{return _T("TestButtonDlg");}virtual CDuiString GetSkinFile(){return m_strXMLPath;}virtual CDuiString GetSkinFolder(){return _T("");}virtual LPCTSTR GetResourceID() const{return MAKEINTRESOURCE(IDR_ZIPRES);}virtual UILIB_RESOURCETYPE GetResourceType() const{return UILIB_ZIPRESOURCE; }explicitCTestUIDlg(LPCTSTR pszXMLPath);virtualvoid InitWindow();virtualCControlUI* CreateControl(LPCTSTR pstrClassName);virtualvoid Notify(TNotifyUI& msg);virtualLRESULT HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam);private:CButtonUI*m_BtnOk;CButtonUI*m_BtnCancel;CButtonUI*m_BtnClose;CPaintManagerUIm_pm;CDuiStringm_strXMLPath;};

CTestUIDlg类前面实现了一些父类的虚函数,用于返回一些基本信息。最重要的是下面的5个函数,下面为你一一解析。

1、explicit  CTestUIDlg(LPCTSTR pszXMLPath);构造函数,同其他构造函数一样,做一些初始化操作。传入的参数是xml文件路径,也就是test.xml的路径。具体代码如下:

CTestUIDlg::CTestUIDlg( LPCTSTR pszXMLPath ):m_strXMLPath(pszXMLPath),m_BtnOk(NULL),m_BtnCancel(NULL),m_BtnClose(NULL){}


2、void InitWindow();初始化窗口信息,根据前面xml文件中我们说的控件唯一标识,创建空间,其余功能相当于MFC下的OnInitDialog(),用于一些控件的初始化之类的。具体代码如下:

void CTestUIDlg::InitWindow(){m_pm= this->m_PaintManager;CenterWindow();m_BtnOk= static_cast<CButtonUI*>(m_pm.FindControl(_T("btnTest")));m_BtnCancel = static_cast<CButtonUI*>(m_pm.FindControl(_T("btnTest2")));m_BtnClose= static_cast<CButtonUI*>(m_pm.FindControl(_T("btnClose")));m_BtnClose->SetEnabled(false);}
3、CControlUI* CreateControl(LPCTSTR pstrClassName);用于自定义控件的创建,暂时先return NULL,后面会为大家介绍到。

4、void Notify(TNotifyUI& msg);操作消息响应,一般用于点击操作等的响应。用于处理duilib自己定义的一套消息,其消息类型请参见duilib的UIDefine.h。具体代码如下:

void CTestUIDlg::Notify( TNotifyUI& msg ){if( msg.sType == _T("click") ) {if(msg.pSender==m_BtnOk){MessageBox(NULL,"点击确定按钮","sure",MB_OK);}else if (msg.pSender==m_BtnCancel){MessageBox(NULL,"点击取消定按钮","cancel",MB_OK);}if(msg.pSender==m_BtnClose){PostQuitMessage(0);}}}


5、LRESULT HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam);消息响应,类似于MFC的DefWindowProc()。部分代码如下:

LRESULT CTestUIDlg::HandleMessage( UINT uMsg,WPARAM wParam,LPARAM lParam ){LRESULT lRes = 0;BOOL bHandled = TRUE;switch(uMsg){case WM_SIZE:          lRes = OnSize(uMsg, wParam, lParam, bHandled); break;case WM_NCPAINT:       lRes = OnNcPaint(uMsg, wParam, lParam, bHandled); break;case WM_GETMINMAXINFO: lRes = OnGetMinMaxInfo(uMsg, wParam, lParam, bHandled); break;case WM_SYSCOMMAND:    lRes = OnSysCommand(uMsg, wParam, lParam, bHandled); break;case WM_NCCALCSIZE:    lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled); break;}return WindowImplBase::HandleMessage(uMsg,wParam,lParam);}


理解了以上部分,就可以自己写一个Demo来看看DuiLib的使用啦,快自己实现看看DuiLib为我们带来的便捷和美观吧。







0 0
原创粉丝点击