快乐高四第三课 巨人的垫脚石,DirectUI之DuiLib篇

在前面第十七课,笨笨已经给大家展示了CChart在国产开源DirectUI库炫彩界面库中的使用方法。炫彩界面库的确不错,但从目前看来,另一款国产开源DirectUI库DuiLib更加火,华为、百度、腾讯、金山、360好像都在用,所以笨笨又当了一回小学生,学习了一把DuiLib。这要感谢Alberl大神,写了一篇通俗易懂的教程,教程网址。

学完之后,发现CChart在DuiLib中应用非常容易,下面笨笨就给大家交流这回当小学生的心得。

笨笨一向离不开VC6,不过这次发现,DuiLib真的是不支持VC6,想了很多招都不行。没办法,只好抛却糟糠妻,拥抱白富美,拿起了VS2010。更白更富更美的VS2012笨笨没法消受,因为系统是Xp,装不了。

A3.1 编译DuiLib动态库

按照Alberl大神的方法,用SVN下载了最新的DuiLib,并用VS2010打开DuiLib.sln编译。

为方便,编译完成后,笨笨把4个Dll文件DuiLib.dll、DuiLib_d.dll、DuiLib_u.dll、DuiLib_ud.dll和4个导入库文件DuiLib.lib、DuiLib_d.lib、DuiLib_u.lib、DuiLib_ud.lib集中放置在一个目录中,同时把下载得到的一个DuiLib子目录里面的内容也拷贝到这个目录中,在保持目录结构的同时,删除掉除了.h文件以外的所有文件。这样,笨笨就得到了一个可以独立使用的DuiLib了。

笨笨给大家确认一下,刚才这个目录里面现在有四个lib文件,四个dll文件,一个UIlib.h文件,四个子目录(Control、Core、Layout、Utils),现在笨笨把这个目录命名为DuiLib。

A3.2 CChart编程

第一步,利用VS2010建立一个Win32 Application,名字为LessonA03,在向导中选择Empty Project。

第二步,拷贝刚才建立的DuiLib目录到内层的LessonA03目录。

第三步,拷贝CChart库的Library目录到内层的LessonA03目录,并把这个目录改名为CChart。

第四步,建立一个LessonA03.cpp文件并添加到工程中。

第五步,修改LessonA03.cpp的内容如下。

#pragma once#include "DuiLib\UIlib.h"using namespace DuiLib;#ifdef _DEBUG# ifdef _UNICODE#pragma comment(lib, "DuiLib\\DuiLib_ud.lib")# else#pragma comment(lib, "DuiLib\\DuiLib_d.lib")# endif#else# ifdef _UNICODE#pragma comment(lib, "DuiLib\\DuiLib_u.lib")# else#pragma comment(lib, "DuiLib\\DuiLib.lib")# endif#endif#include "CChart\Chart.h"#ifdef _DEBUG#if defined(_UNICODE) || defined(UNICODE)#pragma comment(lib, "CChart\\PlotDll_ud.lib")#else#pragma comment(lib, "CChart\\PlotDll_d.lib")#endif#else#if defined(_UNICODE) || defined(UNICODE)#pragma comment(lib, "CChart\\PlotDll_u.lib")#else#pragma comment(lib, "CChart\\PlotDll.lib")#endif#endifclass CWndUI: public CControlUI{public:CWndUI(): m_hWnd(NULL){}virtual void SetInternVisible(bool bVisible = true){__super::SetInternVisible(bVisible);::ShowWindow(m_hWnd, bVisible);}virtual void SetPos(RECT rc){__super::SetPos(rc);::SetWindowPos(m_hWnd, NULL, rc.left, rc.top, rc.right – rc.left, rc.bottom – rc.top, SWP_NOZORDER | SWP_NOACTIVATE);}BOOL Attach(HWND hWndNew){if (! ::IsWindow(hWndNew)){return FALSE;}m_hWnd = hWndNew;return TRUE;}HWND Detach(){HWND hWnd = m_hWnd;m_hWnd = NULL;return hWnd;}protected:HWND m_hWnd;};class CDuiFrameWnd : public WindowImplBase{public:virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }virtual CDuiString GetSkinFile(){ return _T("duilib.xml"); }virtual CDuiString GetSkinFolder(){ return _T(""); }CChartWnd m_ChartWnd;virtual CControlUI* CreateControl(LPCTSTR pstrClassName){if (_tcsicmp(pstrClassName, _T("Wnd")) == 0){CWndUI *pUI = new CWndUI;HWND hWnd = CreateWindow(_T("BUTTON"), _T("win32"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 0, 0, 0, 0, m_PaintManager.GetPaintWindow(), NULL, NULL, NULL);pUI->Attach(hWnd);m_ChartWnd.Attach(hWnd, kTypeXY);m_ChartWnd.GetChart()->AddPoint2D(1, 1);m_ChartWnd.GetChart()->AddPoint2D(2, 2);m_ChartWnd.GetChart()->AddPoint2D(3, 2);m_ChartWnd.GetChart()->AddPoint2D(4, 1);return pUI;}//此处原来Alberl大神直接返回NULL,笨笨认为应该修改一下,不知正确否?//return NULL;return WindowImplBase::CreateControl(pstrClassName);}};int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){CPaintManagerUI::SetInstance(hInstance);CDuiFrameWnd duiFrame;duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);duiFrame.CenterWindow();duiFrame.ShowModal();return 0;}

第六步,编译解决方案,将在外层的LessonA03目录下出现一个Debug目录,里面有编译得到的exe文件。

再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。

快乐高四第三课 巨人的垫脚石,DirectUI之DuiLib篇

相关文章:

你感兴趣的文章:

标签云: