FOX GUI Library - Menu i dodawanie komunikatów


Strona główna | Autor | Borland C++ 5.5 | GUI | Książki | OpenGL | Programy | Projekty | Teksty

Menu i dodawanie komunikatów

W poprzednim przykładzie przedstawiłem obsługę wybranych komunikatów klasy FXWindow. Teraz, budując przykładowe menu programu dodamy własne komunikaty (menu.cpp).

W klasie Window umieściliśmy typ wyliczeniowy zawierający identyfikatory obsługiwanych komunikatów:

enum
  {
    ID_NEW = FXMainWindow::ID_LAST,
    ID_OPTION_1,
    ID_OPTION_2,
    ID_RADIO_1,
    ID_RADIO_2,
    ID_RADIO_3,
    ID_ABOUT,
    ID_LAST
  };

Nazwy identyfikatorów nawiązują do odpowiednich opcji menu. Wyjaśnienia natomiast wymaga pierwsza i ostatnia pozycja wyliczenia.

ID_NEW = FXMainWindow::ID_LAST,

Taka deklaracja oznacza, iż wartość jaki otrzyma identyfikator ID_NEW (dla przypomnienia enum nadaje kolejne wartości całkowite) będzie równa wartości ostatniego identyfikatora komunikatu z klasy FXMainWindow. Podobnie jak w naszej klasie Window, tak i całej bibliotece FOX identyfikator ID_LAST nie jest związany z żadnym komunikatem. Ten prosty mechanizm zapewnia unikatowość komunikatów w hierarchii dziedziczących klas.
Zmianie uległa także tablica komunikatów:

FXDEFMAP(Window) WindowMap[]=
{
  //____Message_Type_________________ID(S)__________________________Message_Handler___
  FXMAPFUNC (SEL_COMMAND,  Window::ID_NEW,                          Window::onNew),
  FXMAPFUNC (SEL_COMMAND,  Window::ID_OPTION_1,                     Window::onOption1),
  FXMAPFUNC (SEL_COMMAND,  Window::ID_OPTION_2,                     Window::onOption2),
  FXMAPFUNCS(SEL_COMMAND,  Window::ID_RADIO_1,Window::ID_RADIO_3,   Window::onCmdRadio),
  FXMAPFUNCS(SEL_UPDATE,   Window::ID_RADIO_1,Window::ID_RADIO_3,   Window::onUpdRadio),
  FXMAPFUNC (SEL_COMMAND,  Window::ID_ABOUT,                        Window::onAbout)
};

W przykładowym programie jedno z menu jest typu "jeden z wielu". Przy zmianie takiego menu generowane są dwa komunikaty: SEL_COMMAND i SEL_UPDATE. Ponieważ chcemy aby identyfikatory ID_RADIO_1, ID_RADIO_2 i ID_RADIO_3 obsługiwała jedna metoda (może to być w niektórych przypadkach wygodne), umieszczamy je w tablicy komunikatów przy pomocy makra FXMAPFUNCS, a nie jak to jest standardowo FXMAPFUNC.

Wracjąc do tematu budowy menu, służą do tego trzy klasy:

Prześledźmy tworzenie menu na przykładzie. Na początku tworzony jest panel zawierający menu:

FileMenu = new FXMenuPane(this);

Konstruktor klasy FXMenuPane ma dwa parametry, z czego pierwszy jest wskaźnikiem do obiektu klasy FXWindow. W przykładzie jest to wskaźnik do klasy bieżącej. Drugi parametr opisuje wygląd panela i posiada wartość domyślną, stąd można go pominąć.
Kolejno tworzone są polecenia menu, składające się z obiektów klasy FXMenuPane:

new FXMenuCommand (FileMenu,"&New",new FXGIFIcon(getApp(),new_gif),this,ID_NEW);
new FXMenuCommand (FileMenu,"&Quit\tCtl+Q",NULL,getApp(),FXApp::ID_QUIT);
Konstruktor klasy FXMenuPane ma następującą postać:
FXMenuCommand(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0);
Poszczególne parametry oznaczają: Na koniec budowy menu trzeba umieścić nagłówek menu, czyli obiekt klasy FXMenuTitle:
new FXMenuTitle (Menubar,"&File",NULL,FileMenu);
Wygląd okna programu w systemie Linux przedstawia rysunek:
Menu


Do pobrania


© Janusz Ganczarski
JanuszG@enter.net.pl