NSIS搭配Graphical Installer动态修改Label文字重叠如何解决
NSIS结合Graphical Installer动态修改Label文本重叠问题解决方案
这个文字重叠问题是Graphical Installer的自定义渲染机制导致的:它给nsDialogs控件做了主题皮肤适配,Label控件默认使用透明背景,原生${NSD_SetText}只会更新文本内容,不会主动擦除控件区域原有的绘制内容,因此旧文本会残留在界面上,和新文本重叠。
解决步骤
- 首先确认
$lblContents是全局变量,避免回调函数中无法正确获取Label控件句柄 - 修改文本前先触发Label背景擦除,修改完成后除了调用
${GraphicalInstallerRedrawLabel},额外触发一次控件完整重绘,你代码里的${GraphicalInstallerRedrawLabel}宏是必须的,不能省略,它负责通知Graphical Installer重新渲染Label的自定义皮肤样式。
修正后的回调函数代码示例:
Function NextFeature ; 先发送消息擦除Label原有区域的内容 SendMessage $lblContents ${WM_ERASEBKGND} 0 0 ${NSD_SetText} $lblContents "To show the next tip of new-feature" ${GraphicalInstallerRedrawLabel} $lblContents ; 强制控件区域完整重绘,彻底清除残留旧内容 System::Call 'user32::RedrawWindow(i $lblContents, i 0, i 0, i 0x0001 | 0x0002 | 0x0400)' FunctionEnd Function PrevFeature SendMessage $lblContents ${WM_ERASEBKGND} 0 0 ${NSD_SetText} $lblContents "To show the previous tip of new-feature" ${GraphicalInstallerRedrawLabel} $lblContents System::Call 'user32::RedrawWindow(i $lblContents, i 0, i 0, i 0x0001 | 0x0002 | 0x0400)' FunctionEnd
如果上述方案依然有内容残留,可以在创建Label时显式设置非透明背景,将色值替换为你的安装页面实际背景色即可:
${NSD_SetBkColor} $lblContents 0xFFFFFF
内容的提问来源于stack exchange,提问作者fajir moin
相关产品推荐
相关产品推荐

