Krzysztof Mossakowski
Materiały dla studentów
 

Polecenia

MFC
Spis treści

Polecenia
Informacje ogólne
Ścieżki przesyłania poleceń
Makra obsługi poleceń
Uaktualnianie stanu poleceń

  •  Informacje ogólne

    • Poleceniami są wszystkie komunikaty WM_COMMAND pochodzące od interfejsu użytkownika

      • zwykle generowane są przez menu, toolbar lub akceleratory

    • Metody obsługi poleceń mogą być zawarte we wszystkich obiektach klas  dziedziczących z CCmdTarget (przede wszystkiem w obiekcie aplikacji, oknach, dokumentach i wzorcach dokumentu)

    • Po otrzymaniu polecenia odbywać się będzie automatycznie przeszukiwanie obiektów w celu znalezienia funkcji obsługi polecenia

      • obiekty są przeszukiwane według kolejności, w jakiej są umieszczone na ścieżce przesyłania poleceń

[początek strony]

  •  Ścieżki przesyłania poleceń

    • Ścieżki przesyłania poleceń to określone, standardowe kolejności przeszukiwania obiektów ze sprawdzaniem istnienia metody obsługującej dane polecenie

    • Standardowe ścieżki przesyłania poleceń w zależności od klasy obiektu (lub bazowej), który to polecenie otrzymał:

      • CMDIFrameWnd (okno nadrzędne aplikacji MDI)
        1. aktywne okno CMDIChildWnd (okno nadrzędne widoku dokumentu)
        2. to okno nadrzędne aplikacji MDI
        3. CWinApp (obiekt aplikacji)

      • CFrameWnd, CMDIChildWnd (okno nadrzędne widoku dokumentu)
        1. aktywny widok CView
        2. to okno nadrzędne widoku dokumentu
        3. CWinApp (obiekt aplikacji)

      • CView (widok dokumentu)
        1. ten widok dokumentu
        2. dokument tego widoku

      • CDocument (dokument)
        1. ten dokument
        2. wzorzec tego dokumentu CDocTemplate

      • CDialog (okno dialogowe)
        1. to okno dialogowe
        2. okno bazowe (rodzic) tego okna dialogowego
        3. CWinApp (obiekt aplikacji)

    • Przeszukiwanie ścieżki kończy się w momencie znalezienia obiektu zawierającego metodę obsługi danego polecenia lub w momencie zakończenia ścieżki (polecenie nie zostanie obsłużone)

    • Przykład ścieżki (polecenie z menu aplikacji MDI, którego obsługa jest tylko w dokumencie):
      1. polecenie otrzymuje nadrzędne okno aplikacji MDI
      2. nadrzędne okno aplikacji MDI przekierowuje do aktywnego okna nadrzędnego widoku dokumentu bez sprawdzania swoich możliwości
      3. aktywne okno nadrzędne przekierowuje do aktywnego widoku dokumentu bez sprawdzania swoich możliwości
      4. widok sprawdza swoją mapę komunikatów, nie znajduje funkcji obsługi, przekierowuje do swojego dokumentu
      5. dokument znajduje funkcję obsługi w sobie, jest ona wywoływana

    • Można zmienić standardową ścieżkę przesyłania poleceń nadpisując odpowiednio wirtualne metody CCmdTarget::OnCmdMsg

[początek strony]

  •  Makra obsługi poleceń

    • Makra obsługi poleceń to wpisy dodawane do mapy komunikatów definiujące metody jako funkcje obsługi poleceń lub uaktualnień stanu poleceń

    • Makro ON_COMMAND jest używane do skojarzenia metody z obsługą polecenia

    • Makro ON_UPDATE_COMMAND_UI jest używane dla skojarzenia metody z obsługą uaktualnienia stanu polecenia (np. dostępne, zaznaczone)

    • Najwygodniej jest korzystać z ClassWizard, który automatycznie dodaje wpis do mapy komunikatów oraz deklarację i definicję metody

[początek strony]

  •  Uaktualnianie stanu poleceń

    • Uaktualnianie stanu poleceń to określenie aktualnie pożądanych atrybutów polecenia (np. czy powinno być w danej chwili dostępne lub zaznaczone)

      • wizualnie w interfejsie będzie to widoczne w stanie pozycji menu lub przycisków na pasku toolbar)

      • jeśli przycisk i pozycja menu odpowiadają temu samemu poleceniu, to powinny mieć takie same identyfikatory
        - w takim przypadku ich stan będzie zawsze taki sam, określany przez jedną metodę (nie będą potrzebne dwie metody, jedna dla przycisku, druga dla pozycji menu)

    • Schemat uaktualniania pozycji menu:

      • użytkownik otwiera menu

      • dla każdej pozycji otwieranego menu jest szukana funkcja zwiazana z poleceniem tej pozycji, związana makrem ON_UPDATE_COMMAND_UI
        - jeśli taka funkcja istnieje, to jest wywoływana i w niej ustawiany jest stan pozycji menu
        - jeśli taka funkcja nie istnieje ale istnieje funkcja obsługi tego polecenia (związana makrem ON_COMMAND), to pozycja menu zostanie automatycznie ustawiona jako dostępna
        - jeśli nie ma żadnej z tych dwóch funkcji, to pozycja menu będzie niedostępna gdy CFrameWnd::m_bAutoMenuEnable jest TRUE (wartość domyślna), a dostępna w przeciwnym przypadku

    • Przyciski toolbar są uaktualniane w analogiczny sposób do pozycji menu, lecz schemat uaktualnienia jest wywoływany w CWinApp::OnIdle

    • Do funkcji obsługi uaktualnienia stanu polecenia zostaje przekazany jeden parametr klasy CCmdUI, który odpowiada za stan polecenia

      • w celu ustawienia stanu polecenia należy wywoływać dla tego parametru metody: CCmdUI::Enable, CCmdUI::SetCheck, CCmdUI::SetRadio, CCmdUI::SetText

[początek strony]