反编译 NSIS 的脚本(三)

8. 组件的隐藏和显示
细心的朋友都看到了脚本里面有两个 !insertmacro MUI_PAGE_COMPONENTS,那么组件选择页面就会出现两次,察看 gaydata.ini 就知道第一次显示的是 sec0 到 sec36,第二次显示的是 sec37 到 sec 47。
关于页面的说明请看这里

每个页面都有三个函数: Pre、Show、Leave,分别是预载入、显示、离开,在 MUI 界面可以用定义的方法来插入函数,比如在 !insertmacro MUI_PAGE_COMPONENTS 前(插入上一个页面之后) 定义一个 MUI_PAGE_CUSTOMFUNCTION_PRE 函数就可以插入一个预载入函数。在本次脚本中在第一个组件选择页面作如下定义

!define MUI_PAGE_CUSTOMFUNCTION_PRE ComponentPre
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW ComponentShow

上面定义了 ComponentPre、ComponentShow 函数,当然定义的函数名可以随便起,但一般来说名字都要表达它的含义,便于阅读。

在开始创建这两个函数之前还要定义一些内容

!define SECTION_COMPONENT_END 36
 !define SECTION_ASSCOIATION_START 37
 !define SECTION_TOTAL 47

上面定义了 36 是要安装的组件最后的区段索引好,37 是文件关联等的开始区段索引号,47 是总共的区段数。ComponentPre 函数的内容如下

Function ComponentPre
 Push $0
 Push $1
 Call SectionTextReset
 StrCpy $1 0
 loop:
 ReadINIStr $0 "$PLUGINSDIR\gaydata.ini" "secnames" "sec$1"
 StrCmp $0 "" 0 +2
 SectionSetText $1 ""
 StrCmp $1 ${SECTION_COMPONENT_END} loop_quit
 IntOp $1 $1 + 1
 Goto loop
 loop_quit:
 StrCpy $1 ${SECTION_ASSCOIATION_START}
 SectionSetText $1 ""
 StrCmp $1 ${SECTION_TOTAL} +3
 IntOp $1 $1 + 1
 Goto -3
 Pop $1
 Pop $0
 FunctionEnd

这个函数调用了 SectionTextReset 函数,SectionTextReset 函数如下

Function SectionTextReset
 Push $R0
 StrCpy $R0 0
 SectionSetText $R0 " "
 StrCmp $R0 ${SECTION_TOTAL} +3
 IntOp $R0 $R0 + 1
 Goto -3
 Pop $R0
 FunctionEnd

SectionTextReset 函数构成一个循环,$R0 从 0 开始递增,直到等于 ${SECTION_TOTAL} 后跳出循环,这个循环把所有区段的名称都重置为空格,在两个 MUI_PAGE_COMPONENTS 页面的预载入函数都调用一次。这是因为 Show 函数会把一些区段隐藏,即把区段名称设为空值,在下一个 MUI_PAGE_COMPONENTS 页面的 Pre 阶段必须给它一个名称,否则它将一直隐藏。

THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容