NSIS自定义页面中Markdown文件内容正确显示的实现求助
解决NSIS自定义页面中Markdown文件内容无法换行显示的问题
问题根源分析
你的代码存在两个核心问题:
- 变量冲突:
ReadMarkdownFile函数用$0存储读取到的文件内容,但后续创建RichEdit控件时,Pop $0将控件句柄覆盖了$0里的文件内容,导致设置文本时传递的是无效值。 - RichEdit控件缺少必要样式:默认创建的RichEdit未启用多行显示和滚动功能,即便内容包含换行符也无法正确渲染。
修正后的完整代码
;-------------------------------- ;Pages Function ReadMarkdownFile ; Open the file for reading FileOpen $R0 "path\Changelog.md" r ${If} $R0 == "" MessageBox MB_OK|MB_ICONSTOP "Failed to open the file!" Abort ${EndIf} ; 改用$1存储文件内容,避免和后续控件句柄冲突 StrCpy $1 "" ; Read the file contents line by line loop: FileRead $R0 $R1 ${If} $R1 == "" ; Reached the end of the file Goto done ${EndIf} ; 保留原文件的换行,同时转换为Windows标准的\r\n换行符 StrCpy $1 "$1$R1$\r$\n" Goto loop done: FileClose $R0 FunctionEnd Function myPageCreate !insertmacro MUI_HEADER_TEXT "App" "LastUpdate" nsDialogs::Create 1018 Pop $0 ${If} $0 == error Abort ${EndIf} ; Call the function to read the Markdown file Call ReadMarkdownFile ; 创建RichEdit时添加ES_MULTILINE、ES_AUTOVSCROLL、WS_VSCROLL样式,启用多行和滚动 ${NSD_CreateRichEdit} ${ES_MULTILINE}|${ES_AUTOVSCROLL}|${WS_VSCROLL}|${ES_READONLY} 0 13u 100% -13u Pop $2 ; 用$2存储控件句柄,避免覆盖其他变量 ; 设置RichEdit的内容,使用之前存储在$1的文件内容 ${NSD_SetText} $2 $1 nsDialogs::Show FunctionEnd !insertmacro MUI_PAGE_WELCOME Page custom myPageCreate !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES ;!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;--------------------------------
关键修改点说明
- 变量分离:将存储文件内容的变量从
$0改为$1,避免与控件句柄变量冲突,确保文件内容不会被覆盖。 - RichEdit样式增强:添加
${ES_MULTILINE}(允许多行显示)、${ES_AUTOVSCROLL}(自动垂直滚动)、${WS_VSCROLL}(显示垂直滚动条)、${ES_READONLY}(设为只读)这些必要样式。 - 换行处理:读取文件时保留每行内容并追加
$\r$\n,确保Windows控件能识别换行符。
如果不需要RichEdit的格式支持,也可以用普通文本控件替代,只需把${NSD_CreateRichEdit}换成${NSD_CreateText},同时添加相同的多行和滚动样式即可。
内容的提问来源于stack exchange,提问作者Jo_
相关产品推荐
相关产品推荐

