2015-03-26 2 views
0

Я создал простой скрипт с графическим интерфейсом в AutoHotkey. Существует многократный список выбора с длинным списком элементов. Я хотел бы создать «инвертирующую кнопку выбора».Как я могу инвертировать выбранные элементы в списке?

я нашел следующие сообщения:

PostMessage, 0x185, 1, -1, ListBox1 ; Select all items. 0x185 is LB_SETSEL. 
PostMessage, 0x185, 0, -1, ListBox1 ; Deselect all items. 

Является ли там что-то похожее на "Invert Selection"? Если нет, как я могу создать скрипт в AutoHotkey?

+0

почему вы используете 'PostMessage' (инструмент для редактирования любого окна, даже за пределы АКА) вместо' GuiControl' (инструмент для редактирования элементов графического интерфейса текущих АКА GUI)? – Blauhirn

+0

Прокрутите все элементы и проверьте, выбран ли элемент. –

ответ

0

Я предоставляю здесь код, который должен соответствовать вашим требованиям. Я работаю над библиотекой функций GUI, и только что завершил работу над некоторыми функциями ListBox, включая JEE_ListBoxInvSel(hCtl).

Вот пример кода с приведенными ниже функциями. Я проверил все достаточно тщательно. Оставьте комментарий если возникнут какие-либо проблемы.

^q:: 
ControlGet, hCtl, Hwnd, , ListBox1, A 
vList = 1,3,7 
JEE_ListBoxSetSel(hCtl, vList, "ds") 
Sleep 2000 

MsgBox % JEE_ListBoxGetSel(hCtl) 
Sleep 2000 

JEE_ListBoxInvSel(hCtl) 
Sleep 2000 
JEE_ListBoxInvSel(hCtl) 
Sleep 2000 
JEE_ListBoxInvSel(hCtl) 
Sleep 2000 
MsgBox done 
Return 

;================================================== 

;selected GUI functions by jeeswg 

;JEE_ListBoxInvertSelection 
;JEE_ListBoxSetSelInv 
JEE_ListBoxInvSel(hCtl) 
{ 
SendMessage, 0x18B, , , , ahk_id %hCtl% ;LB_GETCOUNT 
vCount := ErrorLevel 
SendMessage, 0x190, , , , ahk_id %hCtl% ;LB_GETSELCOUNT 
vCountSel := ErrorLevel 

if (vCount-vCountSel > vCountSel) 
vList := JEE_ListBoxGetSel(hCtl, 1), JEE_ListBoxSetSel(hCtl, vList, "sd") 
else 
vList := JEE_ListBoxGetSel(hCtl, 0), JEE_ListBoxSetSel(hCtl, vList, "ds") 
Return 
} 

;================================================== 

;returns 1-based index of focused item 
JEE_ListBoxGetFocus(hCtl) 
{ 
;LB_GETCARETINDEX := 0x19F 
SendMessage, 0x19F, , , , ahk_id %hCtl% ;LB_GETCARETINDEX 
Return ErrorLevel+1 
} 

;sets 1-based index of focused item 
JEE_ListBoxSetFocus(hCtl, vNum, vOpt=0) 
{ 
;LB_SETCARETINDEX := 0x19E 
SendMessage, 0x19E, vNum-1, 0, , ahk_id %hCtl% ;LB_SETCARETINDEX 
Return 
} 

;================================================== 

;returns a comma-separated list of 1-based indexes for selected items 
;JEE_ListBoxGetSelectedItems 
JEE_ListBoxGetSel(hCtl, vOpt=1) 
{ 
;LB_GETCOUNT := 0x18B 
;LB_GETSELCOUNT := 0x190 
;LB_GETSELITEMS := 0x191 

SendMessage, 0x190, , , , ahk_id %hCtl% ;LB_GETSELCOUNT 
vCountSel := ErrorLevel 
VarSetCapacity(vBuf, 32*vCountSel) 
SendMessage, 0x191, vCountSel, &vBuf, , ahk_id %hCtl% ;LB_GETSELITEMS 
vRet := ErrorLevel 

Loop, %vRet% 
vOutput .= (NumGet(vBuf, A_Index*4-4, "UInt")+1) "," 
vOutput := SubStr(vOutput, 1, -1) ;trim right 

if (vOpt = 0) 
{ 
SendMessage, 0x18B, , , , ahk_id %hCtl% ;LB_GETCOUNT 
vCount := ErrorLevel 
Loop, %vCount% 
if A_Index not in %vOutput% 
vOutput2 .= A_Index "," 
vOutput2 := SubStr(vOutput2, 1, -1) ;trim right 
Return vOutput2 
} 

Return vOutput 
} 

;================================================== 

;description: 
;hCtl: handle to ListBox control 

;vList: comma-separated list of items (1-based index) 
;e.g. '1,3,5' (select the 1st,3rd,5th items) 
;e.g. '3' (select the 3rd item) 

;vOpt: s/d/sd/ds/sa/da 
;s select items in list 
;d deselect items in list 
;sd select all items and deselect items in list 
;ds deselect all items and select items in list 
;sa select all items 
;da deselect all items 

;JEE_ListBoxSelectItems 
JEE_ListBoxSetSel(hCtl, vList, vOpt="s") 
{ 
;LB_SETSEL := 0x185 

if vOpt in sa,sd 
SendMessage, 0x185, 1, -1, , ahk_id %hCtl% ;LB_SETSEL 
if vOpt in da,ds 
SendMessage, 0x185, 0, -1, , ahk_id %hCtl% ;LB_SETSEL 
if vOpt in sa,da 
Return 

if vOpt in s,ds 
vState := 1 
if vOpt in d,sd 
vState := 0 

Loop, Parse, vList, `, 
SendMessage, 0x185, vState, A_LoopField-1, , ahk_id %hCtl% ;LB_SETSEL 
Return 
} 

;================================================== 
Смежные вопросы