C dla każdego (cz. 2.)
Pomocy
Dziś powrócimy do zagadnień związanych z
graficznym interfejsem użytkownika. Zajmiemy się
"pomocą na żądanie", czyli tzw. online help.
System operacyjny oferuje co najmniej cztery
mechanizmy ułatwiające tworzenie pomocy:
IDCMP_MENUHELP, IDCMP_ GADGETHELP,
STRINGA_ExitHelp i "amigaguide.library". Aby
uaktywnić pomoc dla górnego menu, należy ustawić
flagę IDCMP_MENUHELP oraz użyć przy otwieraniu
okna tagu WA_MenuHelp z parametrem TRUE. Gdy
użytkownik naciśnie klawisz "Help" podczas
wyświetlania górnego menu, zostanie ono zamknięte,
a do portu okna przybędzie wiadomość klasy
IDCMP_MENUHELP o polu "Code", odpowiadającym
zaznaczonemu w danym momencie elementowi menu,
analogicznie jak w wypadku IDCMP_MENUPICK.
Analogia nie jest jednak pełna - "Code" może
opisywać pozycje w danym momencie wyłączone, a
nawet całe menu. Pewien problem pojawia się, gdy w
menu występują pozycje-fajeczki (CHECKIT).
Użytkownik może, trzymając wciśnięty prawy
przycisk, lewym kliknąć na takiej pozycji
zmieniając jej wartość, a następnie przesunąć się
nad jakąś inną pozycję i nacisnąć "Help" - w
takiej sytuacji IDCMP_MENUPICK nie przybędzie.
Jeżeli więc w menu występują pozycje CHECKIT,
należy po każdym odebraniu IDCMP_MENUHELP
skontrolować ich stan.
Pomoc dla gadżetów jest dostępna niestety dopiero
od systemu 3.0. Należy ustawić flagę
IDCMP_GADGETHELP oraz, już po otwarciu okna,
wywołać funkcję z biblioteki Intuition:
void HelpControl( struct Window *win. unsigned
long flags );
Jako "win" podajemy adres otwartego okna, a jako
"flags" - HC_GADGETHELP, aby włączyć mechanizm
albo O aby go wyłączyć.
Wiadomości klasy IDCMP_GADGETHELP przybywają do
okna tylko wtedy, gdy jest ono aktywne. Gdy
wskaźnik myszy nie znajduje się w oknie, pole
"IAddress" ma wartość 0. Gdy znajduje się on w
oknie, ale nie jest nad żadnym gadżetem,
"IAddress" zawiera (UWAGA!) adres okna. Gdy zaś
wskaźnik znajduje się nad jakimś gadżetem
(obojętne, naszym czy systemowym), pole' to
zawiera adres tego gadżetu.
System umożliwia również otrzymywanie wiadomości
klasy IDCMP_GADGETHELP przez nieaktywne okna. Bywa
to przydatne, gdy aplikacja składa się z kilku
oddzielnych okien. W tym celu wszystkie okna
aplikacji muszą należeć do jednej grupy.
Najprościej można to osiągnąć otwierając pierwsze
okno tradycyjnie, a dla pozostałych podając przy
otwieraniu tag "WA_HelpGroupWindow" i jako
parametr adres pierwszego okna. Jeżeli któreś z
okien będzie aktywne, system będzie sprawdzał, czy
wskaźnik myszy nie znajduje się nad którymkolwiek
z okien należących do jego grupy. Gdy taka
sytuacja wystąpi, do portu tego nieaktywnego okna
zostanie wysłana wiadomość z polem "IAddress"
zawierającym adres okna lub któregoś z jego
gadżetów.
Mechanizm IDCMP_GADGETHELP można z pewnym
powodzeniem emulować w systemie 2.0. Ustawienie
flagi IDCMP_INTUITICK powoduje wysyłanie do
aktywnego okna kilkanaście razy na sekundę
wiadomości (przy czym kolejna nie jest wysyłana,
dopóki nie zostanie zwrócona poprzednia). Jak
każda wiadomość od Intuition, zawiera ona
współrzędne myszy. Na ich podstawie, znając
umiejscowienie gadżetów (w końcu sami je
tworzymy), możemy wyznaczyć, nad którym gadżetem
znajduje się wskaźnik myszy. Zadanie to
pozostawiamy zainteresowanym Czytelnikom.
Trzecim mechanizmem, używanym dla gadżetów
służących do wpisywania tekstów i liczb, jest tag
STRINGA_ExitHelp. Ustawienie go na TRUE podczas
tworzenia gadżetu (CreateGadgetA()) powoduje, że
gdy podczas edycji użytkownik naciśnie"Help",
edycja jest przerywana, a do portu okna przybywa
wiadomość klasy IDCMP_GADGETUP z polem "Code" o
wartości Ox5F (kod klawisza "Help").
otwiera prymitywne okno z kilkoma
gadżetami i górnym menu, zapewniając obsługę
wiadomości klasy IDCMP_GADGETHELP: pomoc jest
wyświetlana w gadżecie tekstowym. Przy tworzeniu
gadżetów, w pole "ng_UserData" wstawiamy adresy
struktur "PomocDoGadzetu", zawierających między
innymi teksty, które mają być wyświetlane.
Nie przejmujcie się, jeżeli jakieś symbole wydają
się zbędne. Zostaną one wykorzystane przez
fragmenty listingu, które musieliśmy wyciąć, aby
się na tych dwóch stronach pomieścić (listing
można jednak w jego obecnej postaci skompilować i
uruchomić).
Ze względu na spory listing, na tym musimy już
dziś zakończyć. Do zobaczenia za miesiąc, kiedy to
dodamy do naszego listingu obsługę AmigaGuide.