You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSIS自定义页面中Markdown文件内容正确显示的实现求助

解决NSIS自定义页面中Markdown文件内容无法换行显示的问题

问题根源分析

你的代码存在两个核心问题:

  1. 变量冲突:ReadMarkdownFile函数用$0存储读取到的文件内容,但后续创建RichEdit控件时,Pop $0将控件句柄覆盖了$0里的文件内容,导致设置文本时传递的是无效值。
  2. 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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:43:12