杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1974|回复: 0

在NSIS中如何禁止一个组件组的父项的点击事件

[复制链接]
发表于 2017-2-26 10:38:30 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2200685213123.gif
如上图,当我们需要别人只能点选“原始英文版”或“简体中文版”中的其中一项时,我们通常会用到 !insertmacro StartRadioButtons 这类的宏来控制单选,但是在 NSIS 的例子中,它们的操控都是在父项的情况下实行的,当我们在子项的环境中实现时,问题出现了,当我们为用户设想时,如果用户点选了父项“界面语言”,会造成子项选择丢失或者反选,这就跟我们原来设想的单选意图完全背道而驰了,那么我们究竟要怎么做才能禁止用户的这种错误操作呢。
而在整个 NSIS 文档中,我们并不能找到任何一个命令或参数来禁止一个 SectionGroup 的项目的可选性,也就是无论如何也没办法禁止用户错误操作了吗?
大家不要忘记了 NSIS 曾经给我们的提示,

SectionSetFlags
区段索引 区段标记设置区段标记。标记为 32 位整数。第一位(低位)代表该区段当前是否选中,第二位代表该区段是否是一个区段组(请不要修改这里除非你真的很了解),第三位代表该区段是否是一个区段组的结尾(同样,请不要修改),第四位代表该区段文字是否描黑显示,第五位代表该区段是否是只读,第六位代表区段组是否自动展开,第七位代表区段组是部分选定的,第八位是部分选定区段组切换内部使用,第九位是用来反映区段名称更改。如果指定了超出范围的区段则会放置一个错误的标记。

  1. !include "MUI.nsh"
  2. !include "UsefulLib.nsh"

  3. OutFile "Setup.exe"

  4. ; 组件选择页面
  5. !define MUI_COMPONENTSPAGE_NODESC
  6. !define MUI_COMPONENTSPAGE_TEXT_TOP " "
  7. ComponentText "" "选择游戏安装的版本:" "----------------------"
  8. !insertmacro MUI_PAGE_COMPONENTS

  9. Section "!主要程序" SEC01
  10. SectionEnd

  11. SubSection "界面语言" SEC0A
  12.   Section /o "原始英文版" SEC11
  13.   SectionEnd
  14.   Section "简体中文版" SEC12
  15.   SectionEnd
  16. SubSectionEnd

  17. SubSection "存档文件" SEC0B
  18.   Section /o "全英文球员名(锁定)" SEC21
  19.   SectionEnd
  20.   Section /o "全英文球员名(解锁)" SEC22
  21.   SectionEnd
  22.   Section "中日韩球员中文名(锁定)" SEC23
  23.   SectionEnd
  24.   Section /o "中日韩球员中文名(解锁)" SEC24
  25.   SectionEnd
  26. SubSectionEnd

  27. SubSection "解说版本" SEC0C
  28.   Section /o "英语解说" SEC31
  29.   SectionEnd
  30.   Section "中文解说" SEC32
  31.   SectionEnd
  32.   Section /o "日语解说" SEC33
  33.   SectionEnd
  34. SubSectionEnd
  35. ; ------ 游戏组件选择界面结束 ------

  36. ; 区段组件描述

  37. Function .onInit
  38. SectionGetFlags "${SEC0A}" $R0                 #  <======= 添加,取原父项的标志值
  39. IntOp $R0 $R0 + 15                             #  <======= 添加,加上 15,就会令父项变成只读
  40. SectionSetFlags "${SEC0A}" $R0                 #  <======= 添加
  41. SectionGetFlags "${SEC0B}" $R0                 #  <======= 添加
  42. IntOp $R0 $R0 + 15                             #  <======= 添加
  43. SectionSetFlags "${SEC0B}" $R0                 #  <======= 添加
  44. SectionGetFlags "${SEC0C}" $R0                 #  <======= 添加
  45. IntOp $R0 $R0 + 15                             #  <======= 添加
  46. SectionSetFlags "${SEC0C}" $R0                 #  <======= 添加
  47. SectionSetFlags ${SEC12} ${SF_SelectED}        #  <======= 添加,设置选中状态
  48. SectionSetFlags ${SEC23} ${SF_SelectED}        #  <======= 添加
  49. SectionSetFlags ${SEC32} ${SF_SelectED}        #  <======= 添加
  50. StrCpy $1 ${SEC12} ; SEC12默认选中             #  <======= 添加,
  51. #####必须在 $1 中写入当前选中的项,因为在 .onSelChange 中是用来记录第一组的选中项目
  52. StrCpy $2 ${SEC23} ; SEC23默认选中             #  <======= 添加
  53. StrCpy $3 ${SEC32} ; SEC32默认选中             #  <======= 添加
  54. FunctionEnd

  55. ;单选
  56. Function .onSelChange
  57. !insertmacro StartRadioButtons $1
  58. !insertmacro RadioButton ${SEC11}
  59. !insertmacro RadioButton ${SEC12}
  60. !insertmacro EndRadioButtons
  61. !insertmacro StartRadioButtons $2
  62. !insertmacro RadioButton ${SEC21}
  63. !insertmacro RadioButton ${SEC22}
  64. !insertmacro RadioButton ${SEC23}
  65. !insertmacro RadioButton ${SEC24}
  66. !insertmacro EndRadioButtons
  67. !insertmacro StartRadioButtons $3
  68. !insertmacro RadioButton ${SEC31}
  69. !insertmacro RadioButton ${SEC32}
  70. !insertmacro RadioButton ${SEC33}
  71. !insertmacro EndRadioButtons
  72. FunctionEnd
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-19 13:20 , Processed in 0.119827 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表