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 阶段必须给它一个名称,否则它将一直隐藏。
暂无评论内容