VS2010 Win32开发应用——Duilib简单配置

Home / Hackintosh MrLee 2015-5-19 5087

原来在写MFC的时候感觉界面太丑太单调了,想自己弄一个好看一点的APP,大多皮肤要么收费要么不好用。后来看到Duilib皮肤库,果然很强大。下面看下简介 国内首个开源 的directui 界面库,开放,共享,惠众,共赢,遵循bsd协议,可以免费用于商业项目,目前支持Windows 32 、Window CE、Mobile等平台。 Duilib 是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率。提供所见即所得的开发工具UIDesigner。使用DirectUI后将使得我们的设计人员彻底解 放,不会受到开发的束缚,可以充分地发挥其设计能力来设计软件界面,并参与到用户界面开发过程中。 Duilib 目前支持Windows 32 、Window CE、Mobile等平台,使用C++开发,遵循BSD协议,可以免费用于商业项目 。 DirectUI界面库 取名自微软的一个窗口类名“DirectUIHWND”,意为Paint on parent dc directly。 即子窗口不以窗口句柄的形式创建,只是逻辑上的窗口,绘制在父窗口之上。 DirectUI界面库使用XML来描述界面风格,界面布局,可 以很方便的构建高效,绚丽的,非常易于扩展的界面。从而很好的将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。
认识了这玩意儿现在开始动手吧,首先创建一个Win32工程,名字任意,注意:Windows应用程序。然后把相关的头文件复制到工程的Duilib目录(便于区分),如图:

QQ截图20150519150035


然后在stdafx.h头文件末尾加上以下代码:
// TODO: 在此处引用程序需要的其他头文件
#include //一定要加此头文件,uirichedit.h 报错:error C2143: 语法错误 : 缺少“;”(在“*”的前面)
#include "Duilib\UIlib.h"
using namespace DuiLib;
#ifdef _DEBUG
#pragma comment(lib, "DuiLib_d.lib")//debug
#else
#pragma comment(lib, "DuiLib.lib")//release
#endif
我用的是Unicode工程,库也是UNICODE格式编译的。如果你是多字符集就需要重新编译Duilib工程。然后在CPP中实现DUILIB的界面类
// DUIDemo.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "DUIDemo.h"
class CFrameWindowWnd : public CWindowWnd, public INotifyUI
{
public:
	CFrameWindowWnd()
	{
	}
	~CFrameWindowWnd()
	{
	}
	LPCTSTR GetWindowClassName() const 
	{ 
		return _T("UIMainFrame");
	}
	UINT GetClassStyle() const 
	{ 
		return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; 
	}
	void OnFinalMessage(HWND /*hWnd*/) 
	{ 
		delete this; 
	}
	void Init() 
	{
	}
	void Notify(TNotifyUI& msg)
	{
	}
	LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
	{
		if( uMsg == WM_CREATE ) {
			m_pm.Init(m_hWnd);
			CDialogBuilder builder;
			CControlUI* pRoot = builder.Create(_T("DuiLib.xml"), (UINT)0, NULL, &m_pm);
			ASSERT(pRoot && "Failed to parse XML");
			m_pm.AttachDialog(pRoot);
			m_pm.AddNotifier(this);
			Init();
			return 0;
		}
		else if( uMsg == WM_DESTROY ) {
			::PostQuitMessage(0L);
		}
		else if( uMsg == WM_ERASEBKGND ) {
			return 1;
		}
		LRESULT lRes = 0;
		if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
		return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
	}
public:
	CPaintManagerUI m_pm;
};

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	CPaintManagerUI::SetInstance(hInstance);
	CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
	HRESULT Hr = ::CoInitialize(NULL);
	if( FAILED(Hr) ) 
		return 0;
	CFrameWindowWnd* pFrame = new CFrameWindowWnd();
	if( pFrame == NULL ) 
		return 0;
	pFrame->Create(NULL, _T("DuiLib"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
	pFrame->CenterWindow();
	pFrame->ShowWindow(true);
	CPaintManagerUI::MessageLoop();
	::CoUninitialize();
	return 0;
}

本文链接:https://www.it72.com/2947.htm

推荐阅读
最新回复 (0)
返回