[已解决]请教如何用一个总的复选框控制其余20个复选框,并执行相应代码呢?
本帖最后由 smooth 于 2010-11-9 08:29 编辑各位老师,有$Checkbox1到$Checkbox21共21个复选框。如何实现:当点击选中$Checkbox1时,$Checkbox2至$Checkbox21都被选中,如果取消$Checkbox1的选中状态时,则$Checkbox2至$Checkbox21都被取消选择。只要$Checkbox2至$Checkbox21中的某一个被选中,则Checkbox1都会被选中,但取消$Checkbox2至$Checkbox21中某一个或者几个时,不影响Checkbox1的选中状态,除非$Checkbox2至$Checkbox21都被取消选中。谢谢。 论坛有这个_CheckboxOpt_udf.au3,你可以参考一下的。
http://www.autoitx.com/forum.php?mod=viewthread&tid=9252&highlight=%B8%B4%D1%A1%BF%F2 Opt('GUIOnEventMode', 1)
GUICreate('afan Checkbox 例子', 150, 500)
GUISetOnEvent(-3, '_Exit')
Local $Checkbox
$Checkbox = GUICtrlCreateCheckbox('Checkbox0 - 总管', 10, 450, 120, 17)
GUICtrlSetOnEvent(-1, '_ZG')
For $i = 1 To 20
$Checkbox[$i] = GUICtrlCreateCheckbox('Checkbox' & $i, 10, 20 * $i, 100, 17)
Assign('_ _||' & $Checkbox[$i] & ':)', 1)
Next
$c = 0
GUISetState()
GUIRegisterMsg(0x0111, 'WM_COMMAND')
While 1
Sleep(1000)
WEnd
Func _Exit()
Exit
EndFunc ;==>_Exit
Func _ZG()
If GUICtrlRead($Checkbox) = 1 Then
Local $state = 1
$c = 20
Else
Local $state = 4
$c = 0
EndIf
For $i = 1 To 20
GUICtrlSetState($Checkbox[$i], $state)
Next
EndFunc ;==>_ZG
Func WM_COMMAND($hWnd, $msg, $wParam)
#forceref $hWnd, $Msg
Local $nID = BitAND($wParam, 0xFFFF)
If IsDeclared('_ _||' & $nID & ':)') Then
If GUICtrlRead($nID) = 1 Then
$c += 1
Else
$c -= 1
EndIf
If $c > 0 Then
GUICtrlSetState($Checkbox, 1)
Else
GUICtrlSetState($Checkbox, 4)
EndIf
EndIf
EndFunc ;==>WM_COMMAND 回复 3# afan
感谢A版的热心帮助,给出完美代码。另外:我也从你发的另外一个帖子给出的例子受益匪浅。 回复 3# afan
为何要用Assign函数定义这些变量呢?~ 回复 5# pusofalse
只是想在 $WM_COMMAND 消息里面 If IsDeclared('_ _||' & $nID & ':)') Then 判断是否为指定的ID,貌似多余… 还请P版指点江山~ http://www.autoitx.com/uc/avatar.php?uid=7634069&size=middle 本帖最后由 pusofalse 于 2010-10-28 01:24 编辑
回复 6# afan
afan兄言重。
“判断是否为指定的ID”,在这段代码中,除了$Checkbox之外,其他的都是属于“指定的ID”啊,与其判断是否属于指定的ID,不如判断是否“不属于指定的ID”,当不属于指定的ID时,设置$CheckBox的状态,这样的话,只需要用Assign($Checkbox, 1)给$Checkbox赋一个值即可。
变量的存储总是需要空间,Assign创建的变量同是如此,那么与其只给$Checkbox赋值,不如直接在WM_COMMAND中用If $nID <> $Checkbox判断即可。
也许我也没考虑周到,WM_COMMAND函数不只是在点击CheckBox控件时才会被调用,如果还有其他的按钮或者菜单等控件,当事件出现时,同会调用WM_COMMAND,这种情况下,只用If $nID <> $Checkbox判断,就会出现误判,因为$nID可能是某按钮的ID。这种情况下,必须要一一给Checkbox ~ Checkbox赋值了。
以上这段是我现在才想到的,在写5#的回复时没想到这些,afan兄的代码是对的。 回复 7# pusofalse
是这样,我是考虑到这个界面的最终功能不可能没有别的控件,所以才这样~ 之前用的 If $nID >= $Checkbox And $nID <= $Checkbox Then,后来觉得用 Assign 似乎好一点,也没考虑变量的存储空间这回事,多谢P版指教~ 能同时看到两位超版解答我的问题,真是感到莫大的荣幸,谢谢你们~ 咱们论坛的人最热心了。我的好多问题都是好多人帮助我呢 这个不错啊。学习了不少东西。这个能做全选 雷锋精神传天下!谢谢分享!
页:
[1]