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.