Duilib
| 请阅读免责声明。删除百科只是中文维基百科被删除条目的存档。 | ||
Duilib是一个开源的DirectUI界面库,使用C++语言开发,运行于windows平台。该库为开源项目,遵循BSD许可证[1][2]。
简介
Duilib由中国大陆开发者"当个傻瓜蛋"基于viksoe的windowless开发[3],并且开源。该库使用c++语言开发,使用流行的DirectUI技术构建用户界面,采用纯Win32 API,不依赖MFC等大型类库,部署体积小。
项目成员
- 当个傻瓜蛋:项目创建者[4]
- 踏雪流云:Duilib UI设计器开发者
- achellies:Duilib开发者,Duilib WinCE移植版维护者
- tojen:Duilib开发者,维护者
- 李军辉:Duilib开发者,维护者
应用案例
已知的有一定影响力的应用案例有“华为网盘客户端”、“酷我音乐”。
快速入门
下载并编译Duilib
使用SVN客户端从 http://duilib.googlecode.com/svn/trunk/ 下载最新代码,用Visual Studio(6,2005或2010)打开DuiLib.sln并生成解决方案。
HelloWorld
- 创建一个win32空项目,命名为helloworld,复制Duilib项目文件下的bin\duilib*.dll、bin\duilib*.lib、duilib\UI*.h、duilib\WebBrowserEventHandler.h到helloworld项目目录下
- 添加helloworld.h
#pragma once
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的信息
#include <windows.h>
#include <objbase.h>
#include "UIlib.h"
using namespace DuiLib;
#ifdef _DEBUG
# ifdef _UNICODE
# pragma comment(lib, "Duilib_ud.lib")
# else
# pragma comment(lib, "Duilib_d.lib")
# endif
#else
# ifdef _UNICODE
# pragma comment(lib, "Duilib_u.lib")
# else
# pragma comment(lib, "Duilib.lib")
# endif
#endif
//声明一个窗体类
class CMainForm : public CWindowWnd, public INotifyUI
{
public:
CMainForm() { };
LPCTSTR GetWindowClassName() const { return _T("UIMainForm"); };
UINT GetClassStyle() const { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; };
void OnFinalMessage(HWND /*hWnd*/) { delete this; };
void Notify(TNotifyUI& msg);
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
public:
CPaintManagerUI m_pm;
};
- 添加helloworld.cpp
#include "helloworld.h"
//实现窗体类方法:Duilib消息处理
void CMainForm::Notify(TNotifyUI& msg)
{
if( msg.sType == _T("click") ) {
if( msg.pSender->GetName() == _T("btnClose") ) {
Close();
}
}
}
//实现窗体类方法:Windows消息处理
LRESULT CMainForm::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if( uMsg == WM_CREATE ) {
m_pm.Init(m_hWnd);
CControlUI *pButton = new CButtonUI; //动态创建一个按钮
pButton->SetName(_T("btnClose"));
pButton->SetBkColor(0xFFFF0000);
pButton->SetText(_T("点击我关闭窗体"));
m_pm.AttachDialog(pButton);
m_pm.AddNotifier(this);
return 0;
}
else if( uMsg == WM_DESTROY ) {
::PostQuitMessage(0);
}
LRESULT lRes = 0;
if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
}
//程序入口及Duilib初始化部分
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
{
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
HRESULT Hr = ::CoInitialize(NULL);
if( FAILED(Hr) ) return 0;
CMainForm* pMainForm = new CMainForm();
if( pMainForm == NULL ) return 0;
pMainForm->Create(NULL, _T("Helloworld"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
pMainForm->ShowWindow(true);
CPaintManagerUI::MessageLoop();
::CoUninitialize();
return 0;
}
- 按F5运行
UI设计
响应事件
换肤
API参考
消息类型
| 消息 | 说明 | Sender |
|---|---|---|
| click | 鼠标点击 | CButtonUI[5] |
| dropdown | 下拉显示 | CComboUI[6] |
| headerclick | 点击列标题 | CListHeaderItemUI[7] |
| itemactivate | CListElementUI[8]、CListContainerElementUI[9] | |
| itemclick | 单击选项 | CListLabelElementUI[10]、CListContainerElementUI[11] |
| itemselect | 选择选项 | CComboUI[12]、CListUI[13] |
| killfocus | 失去焦点 | CControlUI[14] |
| link | CTextUI[15]、CListTextElementUI[16] | |
| menu | CButtonUI[17]、CControlUI[18] | |
| return | 回车 | CEditWnd、CRichEditUI |
| scroll | 滚动 | CScrollBarUI |
| selectchanged | 变更选项 | COptionUI |
| setfocus | 获得焦点 | CControlUI |
| showactivex | CActiveXUI | |
| textchanged | 文本被改变 | CEditWnd |
| tabselect | 标签页被选中 | CTabLayoutUI |
| timer | CControlUI | |
| valuechanged | 值发生变化 | CSliderUI |
| windowinit | 窗体初始化 |
Q&A
范例
外部链接
参考资料
- ↑ Duilib版权说明
- ↑ Duilib license.txt
- ↑ Google Code Duilib项目说明
- ↑ Duilib官网 About us
- ↑ UICommonControls.cpp(r305,line321)
- ↑ UICombo.cpp(r305,line492)
- ↑ UIList.cpp(r305,line1346)
- ↑ UIList.cpp(r305,line1597)
- ↑ UIList.cpp(r305,line2147)
- ↑ UIList.cpp(r305,line1752)
- ↑ UIList.cpp(r305,line2204)
- ↑ UICombo.cpp(r305,line276)
- ↑ UIList.cpp(r305,line377)
- ↑ UICombo.cpp(r305,line1263,line1293)
- ↑ UICommonControls.cpp(r305,line806)
- ↑ UIList.cpp(r305,line1939)
- ↑ UICommonControls.cpp(r305,line291)
- ↑ UIControl.cpp(r305,line679)