Puc. 3.1.3. Пример диалогового окна с всплывающими подсказками.
Рис. 3.1.4. Диалоговое окно с всплывающими подсказками.
Комментарий к программе на Рис. 3.1.3.
1. Прежде всего обращу ваше внимание, что в данной программе мы используем условные конструкции времени выполнения. Данный шаг вполне закономерен и обусловлен только необходимостью несколько сократить объем, а также упростить читаемость программы. Вложенность условных конструкций, а также расстановка скобок вызваны желанием сократить длину строки и одновременно необходимостью транслировать программу как с помощью MASM32, так и с помощью TASM32. Я уже имел возможность сказать, что два ассемблера весьма сильно отличаются, когда речь идет о макросредствах.
2. Трансляция программы.
Пакет MASM32.
ML /c /coff /DMASM hint.asm RC hint.rc LINK /SUBSYSTEM:WINDOWS hint.obj hint.resПакет TASM32.
TASM32 /ml hint.asm BRCC32 hint.rc TLINK32 -aa hint.obj,,,,,hint.res
3. Как Вы, наверное, уже поняли, процедура таймера проверяет каждые 0.5
секунды положение курсора. Если курсор находится на элементе (окне
редактирования или кнопке) и подсказка еще не вызвана (H1
или
Н2
отлична от нуля), то вызывается подсказка. При этом учитывается
еще величина счетчика (P1
), чтобы подсказка появлялась с некоторой
задержкой. Если при очередном вызове процедуры окажется, что курсор находится
уже вне элемента, а подсказка еще на экране, то она удаляется. Данный механизм
не учитывает тот случай, когда курсор быстро перейдет от одного элемента к
другому. В этом случае вероятна ситуация, когда на экране окажется две
подсказки. Впрочем, первая подсказка должна тут же исчезнуть.
4. В нашей программе на диалоговом окне расположено всего два элемента: окно редактирования и кнопка. Мы хотели показать, что в принципе не имеет значения, какой элемент: для любого из них может быть установлена подсказка. Положение подсказки по отношению к курсору легко регулируется, и Вы можете сами менять его.
5. Функция GetCursorPos
получает положение курсора в абсолютных
координатах относительно экрана. Здесь не возникает проблем, т.к. функция
GetWindowRect
также получает положение элемента окна в абсолютных
координатах. Предварительно нам приходится определять дескриптор окна при помощи
функции GetDlgItem
.