Это легко проверить (немного модифицированный код из
сообщения 40).
#include <GUIConstantsEx.au3>
Const $GUI_TEST_FLAG = BitOR($GUI_CHECKED, $GUI_SHOW)
$x = BitOR($GUI_CHECKED, $GUI_SHOW, $GUI_ENABLE, $GUI_FOCUS)
MsgBox(0, "GUI_TEST_FLAG="&$GUI_TEST_FLAG, $x)
if BitAND($x, BitOR($GUI_CHECKED, $GUI_SHOW)) = $GUI_TEST_FLAG Then
MsgBox(0, "", "$GUI_TEST_FLAG")
endif
Уберите из 4 строки $GUI_CHECKED или $GUI_SHOW и посмотрите что получится.
То есть все биты из $GUI_TEST_FLAG должны быть в переменной $x, а наличие или отсутствие других бит не имеет значения ведь функция BitAND их обнулит согласно установленным битам в $GUI_TEST_FLAG.
Ваш пример, безусловно, иллюстрирует то, для иллюстрации был придуман, только мне это почему-то не сильно бросается в глаза. Скорее всего, это потому что в месседжбоксе отображаются десятичные представления результатов битовых операций, а не двоичные или просто не в коня корм. Поэтому я решил пойти другим путем. Я решил посмотреть, как конкретно выполняется равенство
BitAND(
GUICtrlRead($infoitem), $GUI_CHECKED) = $GUI_CHECKED
для пункта контекстного меню, для которого
А вот для пункта контекстного меню численные значения этих констант состояний имеют почему-то другие значения: когда этот пункт не отмечен галочкой, это состояние имеет значение 68, а когда отмечен, то - 65
и при условии действующего в автоите значения константы $GUI_CHECKED Далее числовые значения состояния, значения константы, результаты битовых операций я буду записывать в двоичной системе. Итак, в этой системе тоже
$GUI_CHECKED = ...0 000 001.
Для наглядности я буду писать значения констант, операций в таком простом виде.
Пусть этот пункт не отмечен галочкой. Тогда
Read($infoitem) = ...1 000 100
И тогда будет
BitAND(
GUICtrlRead($infoitem), $GUI_CHECKED) = ...0 000 000 = 0
и имеет место вот это:
Пусть теперь этот пункт отмечен галочкой. Тогда
Read($infoitem) = ...1 000 001
и, значит,
BitAND(
GUICtrlRead($infoitem), $GUI_CHECKED) = ...0 000 001 = 1
и имеет место вот этот случай:
или значению $GUI_CHECKED которое в данном случае не равно 0.
т.е, при том значении константы $GUI_CHECKED, при той структуре значения этой константы,, которые действует в автоите, при
в двоичном представлении значения $GUI_CHECKED только одна единица
эта схема:
То есть нужно проверить равен результат нулю или нет. Он может быть равен 0 или значению $GUI_CHECKED которое в данном случае не равно 0.
работает.
Теперь давайте посмотрим, работала ли бы схема:
То есть нужно проверить равен результат нулю или нет. Он может быть равен 0 или значению $GUI_CHECKED которое в данном случае не равно 0.
, если бы структура значения константы $GUI_CHECKED в автоите была бы другой, не такой:
в двоичном представлении значения $GUI_CHECKED только одна единица
Допустим, было бы
$GUI_CHECKED = 11
...0 000 011
тогда в том случае, когда пункт контекстного меню был отмечен галочкой, было бы по-прежнему
Read($infoitem) = ...1 000 001
, а потому
BitAND(
GUICtrlRead($infoitem), $GUI_CHECKED) = ...0 000 001 = 1
Т. е
BitAND(
GUICtrlRead($infoitem), $GUI_CHECKED) уже, будучи отличной от 0, не равнялось бы и $GUI_CHECKED. Т. е. получило ьы конкретное воплощение сделанное мной предположение о возможности существования такого случая
Если бы в двоичном представлении значения $GUI_CHECKED было больше одой единице, то мог бы представиться случай, когда значение BitAND(GUICtrlRead($infoitem), $GUI_CHECKED) , будучи отличным от 0, было бы отличным и от $GUI_CHECKED?
, а схема
результат будет нулевой или равен $GUI_CHECKED.
при данном допущении о значении константы $GUI_CHECKED ломалось бы. Правильно?