DuiLib项目个人维护版本,回归std::string,使用C++20,支持控件绑定
OTHER License
此项目是DuiLib的一个个人维护版本,使用Modern C++重写了整个项目。(至少需C++20支持,但部分代码还未完全使用C++20特性)
大众所熟知的DuiLib主分支处于较少更新的状态,几年前的激进更新派DuiLib_Ultimate、DuiLib_Redrain等也渐渐变成了保守派,也降低了更新速度,然而这个优秀的库也渐渐的无法满足当今的需要。
此仓库建立的目的是,对DuiLib做出较激进的更新优化,使得它能更好的满足当今开发的需要。
此项目的更新方式为,一方面项目自身激进的更新,另一方面原分支仓库有更新时,根据需要将更新内容同步至此仓库。
项目使用示例:易大师网络工具箱
此项目目前只支持vs2017环境下编译,如果使用clang、gcc或其他版本编译器需要自行建立项目文件。
注意:因将CDuiString替换为std::string,动态链接方式编译将会出现严重的编译警告。我最近我正在尝试解决这个问题
使用动态链接的程序需在程序目录保留DuiLib*.dll,否则程序无法运行。
用法:主程序内引用如下代码
#if (defined _UNICODE) && (defined _DEBUG) && (defined _WIN64)
# pragma comment (lib, "../lib/DuiLib_64d.lib")
#elif (defined _UNICODE) && (defined _DEBUG) && (!defined _WIN64)
# pragma comment (lib, "../lib/DuiLib_d.lib")
#elif (defined _UNICODE) && (!defined _DEBUG) && (defined _WIN64)
# pragma comment (lib, "../lib/DuiLib_64.lib")
#elif (defined _UNICODE) && (!defined _DEBUG) && (!defined _WIN64)
# pragma comment (lib, "../lib/DuiLib.lib")
#elif (!defined _UNICODE) && (defined _DEBUG) && (defined _WIN64)
# pragma comment (lib, "../lib/DuiLibA_64d.lib")
#elif (!defined _UNICODE) && (defined _DEBUG) && (!defined _WIN64)
# pragma comment (lib, "../lib/DuiLibA_d.lib")
#elif (!defined _UNICODE) && (!defined _DEBUG) && (defined _WIN64)
# pragma comment (lib, "../lib/DuiLibA_64.lib")
#elif (!defined _UNICODE) && (!defined _DEBUG) && (!defined _WIN64)
# pragma comment (lib, "../lib/DuiLibA.lib")
#endif
静态链接具有诸多好处:依赖关系更少、程序体积更小等。极端的追求程序体积可以使用这种链接方式,使用VC_LTL优化项目引用并缩小程序体积,最后使用upx对程序进行压缩。
用法:主程序内引用如下代码
#if (defined _UNICODE) && (defined _DEBUG) && (defined _WIN64)
# pragma comment (lib, "../lib/DuiLib_64sd.lib")
#elif (defined _UNICODE) && (defined _DEBUG) && (!defined _WIN64)
# pragma comment (lib, "../lib/DuiLib_sd.lib")
#elif (defined _UNICODE) && (!defined _DEBUG) && (defined _WIN64)
# pragma comment (lib, "../lib/DuiLib_64s.lib")
#elif (defined _UNICODE) && (!defined _DEBUG) && (!defined _WIN64)
# pragma comment (lib, "../lib/DuiLib_s.lib")
#elif (!defined _UNICODE) && (defined _DEBUG) && (defined _WIN64)
# pragma comment (lib, "../lib/DuiLibA_64sd.lib")
#elif (!defined _UNICODE) && (defined _DEBUG) && (!defined _WIN64)
# pragma comment (lib, "../lib/DuiLibA_sd.lib")
#elif (!defined _UNICODE) && (!defined _DEBUG) && (defined _WIN64)
# pragma comment (lib, "../lib/DuiLibA_64s.lib")
#elif (!defined _UNICODE) && (!defined _DEBUG) && (!defined _WIN64)
# pragma comment (lib, "../lib/DuiLibA_s.lib")
#endif
看需求加入预处理器定义UILIB_STATIC,然后将编译选项分别设置为/MT、/MTd即可。
需将所有的这种代码:
// InitWindow里面
CEditUI *ctrl = dynamic_cast<CEditUI*> (parent->find_control (_T ("ctrl_name")));
替换为:
// 任意位置
BindEditUI ctrl { _T ("ctrl_name") };
// 多窗口推荐传入m_pm,避免出现无法找到控件的问题
BindEditUI ctrl { _T ("ctrl_name"), &m_pm };
需注意:
假设XML节点为<UserCtrl name="ctrl_name" />,那么类名必须风格统一,为CUserCtrlUI;然后在头文件中加入以下代码:
#ifdef DEF_BINDCTRL
DEF_BINDCTRL (UserCtrl);
#endif //DEF_BINDCTRL
大功告成,此时可以用以下代码实现自定义控件绑定
BindUserCtrlUI ctrl { _T ("ctrl_name") };