之前写过微信Windows隐藏的深色模式,
后来微信真的实现深色模式,但界面框架不再是Duilib而是QT。
最新版本的企业微信也支持了深色模式,界面框架还是Duilib,好奇背后的思路,简单分析一下。
XML里面的是'@'开头
具体的数值写在xml里面
XML里面的值是'!'开头
解析的时候多了GetColorAttribute
GetColorAttribute判断是不是'!'开头
最终GetWWColor根据是不是深色模式返回不同的值
具体地的值直接在Duilib里面代码写死成map
核心思路还是一样,XML里面的固定值变成一个变量值,然后解析的时候多了一步取值的过程,只不过个人微信是配置在XML里面,而企业微信是写死在代码里。企业微信的思路看起来简单粗暴,工作量其实不少,效果还不错。
textcolor="@color:Text_1"
textcolor="@color:Text_1"
浅色:theme\default\theme.xml
<!-- color -->
<IncludeTheme source="weui/Theme/default/colors.xml" />
<!-- 文字颜色 -->
<Color id="Text_1" opacity="1" color="#161616" /> // 浅色模式的文字比较深
深色:theme\dark\theme.xml
<!-- color -->
<IncludeTheme source="weui/Theme/dark/colors.xml" />
<!-- 文字颜色 -->
<Color id="Text_1" opacity="1" color="#F7F7F7" /> // 深色模式的文字比较浅
浅色:theme\default\theme.xml
<!-- color -->
<IncludeTheme source="weui/Theme/default/colors.xml" />
<!-- 文字颜色 -->
<Color id="Text_1" opacity="1" color="#161616" /> // 浅色模式的文字比较深
深色:theme\dark\theme.xml
<!-- color -->
<IncludeTheme source="weui/Theme/dark/colors.xml" />
<!-- 文字颜色 -->
<Color id="Text_1" opacity="1" color="#F7F7F7" /> // 深色模式的文字比较浅
bkcolor="!bg_gray_desktop_3"
bkcolor="!bg_gray_desktop_3"
void __thiscall DuiLib::CControlUI::SetAttribute(DuiLib::CControlUI *this, wchar_t *String1, wchar_t *String)
if ( !wcscmp(String1, L"bkcolor") || !wcscmp(String1, L"bkcolor1") )
ColorAttribute = DuiLib::GetColorAttribute(String, 0, (bool)v61);
DuiLib::CControlUI::SetBkColor(this, ColorAttribute);
void __thiscall DuiLib::CControlUI::SetAttribute(DuiLib::CControlUI *this, wchar_t *String1, wchar_t *String)
if ( !wcscmp(String1, L"bkcolor") || !wcscmp(String1, L"bkcolor1") )
ColorAttribute = DuiLib::GetColorAttribute(String, 0, (bool)v61);
DuiLib::CControlUI::SetBkColor(this, ColorAttribute);
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2025-4-15 10:59
被GhHei编辑
,原因: