Uwaga ta opisuje polecenia routingu i wysyłki architektury, a także Tematy zaawansowane w routingu wiadomości ogólne okna.
Odsyłamy do programu Visual C++ Programmer's Guide ogólnych informacji na temat architektury opisanych tutaj, zwłaszcza rozróżnienie między wiadomości, kontroli i poleceń systemu Windows. Uwaga ta zakłada są bardzo znanych problemów opisanych w dokumentacji drukowanej i tylko adresy tematy bardzo zaawansowane.
Polecenia routingu i wysyłki MFC 1.0 funkcjonalność rozwija się do MFC 2.0 architektury
System Windows ma komunikat WM_COMMAND , który jest przeciążony zapewnienie powiadomienia poleceń menu, klawisze przyśpieszające i sterowane okno dialogowe powiadomienia.
1.0 MFC zbudowany na tym trochę poprzez umożliwienie obsługi polecenia (na przykład "OnFileNew") w CWnd pochodna klasy wywoływany w odpowiedzi na konkretne WM_COMMAND. To jest przyklejony wraz ze strukturą danych o nazwie Mapa wiadomości i wyników w mechanizmie polecenia bardzo kompaktowa.
MFC 1.0 również dostarczane dodatkowe funkcje do oddzielania kontroli powiadomienia od wiadomości polecenia. Polecenia są reprezentowane przez identyfikator 16-bitowe, czasami nazywane identyfikatora polecenia Poleceń, które zazwyczaj rozpoczyna się od CFrameWnd (eg: wybierz menu lub tłumaczone akceleratora) i są routowane do szeregu innych okien.
MFC 1.0 używała, polecenia routingu w sensie ograniczone do realizacji wielu interfejsu dokumentu (MDI). (Okno ramek MDI delegować poleceń do jego aktywne okno potomne MDI.)
Ta funkcja została uogólniona i rozszerzone w MFC 2.0 umożliwia poleceń obsługiwanych przez szerszą gamę obiektów (nie tylko okno obiektów). Przewiduje ono więcej formalne i rozszerzalną architekturę routingu wiadomości i których używa polecenia docelowych routingu, nie tylko obsługę poleceń, ale również dla aktualizacji obiektów interfejsu użytkownika (takich jak elementy menu i przyciski paska narzędzi) w celu uwzględnienia bieżącego dostępności polecenia.
Polecenie identyfikatory
Zobacz Visual C++ Programmer's Guide wyjaśnienie polecenia routingu i wiążące procesu. 20 Uwaga techniczna zawiera informacje dotyczące identyfikatorów nazw.
Używamy rodzajowy prefiksu "ID_" dla polecenia identyfikatorów. Polecenie identyfikatory są gt; = 0x8000. Pasek komunikatów linii lub stan będzie wyświetlany ciąg opisu polecenia jeśli jest zasobem STRIN>ABLE z tych samych identyfikatorów jako identyfikator polecenia.
W zasoby aplikacji poleceń, które można identyfikator pojawia się w kilku miejscach:
W kodzie źródłowym aplikacja polecenia, które można identyfikator pojawia się w kilku miejscach:
Obecnie jedynie wdrożenie w MFC, wymagającej polecenia identyfikatory być gt; = 0x8000 jest implementacją &GOSUB okien dialogowych/poleceń.
GOSUB poleceń, używając polecenia architektury w oknach dialogowych
Architektura polecenia routingu i włączanie polecenia współpracuje również z ramka okna, elementy menu, przyciski paska narzędzi, okna dialogowego przycisków paska, pozostałych pasków kontroli i innych elementów interfejsu użytkownika służące do aktualizacji na żądanie i trasę poleceń lub kontroli identyfikatory docelowe główne polecenia (zazwyczaj okna głównego ramki). Docelowej głównym poleceniu może rozesłać powiadomienia polecenie lub formant do innych obiektów docelowych polecenia odpowiednio.
Okno dialogowe (modalny lub niemodalny) mogą korzystać z niektórych funkcji architektury polecenia, jeśli przypiszesz identyfikator formantu formant okno dialogowe identyfikatora odpowiednie polecenie Wsparcie dla okien dialogowych nie jest automatyczne, więc może być konieczne napisanie kodu, niektóre dodatkowe.
Należy pamiętać, że dla wszystkich tych funkcji działać poprawnie, identyfikatory polecenia powinny być gt; = 0x8000. Ponieważ wiele okien dialogowych mogły uzyskać kierowane do tej samej ramce, powinny być udostępnione poleceń > = 0x8000, podczas gdy nieudostępnionego IDC firmy w okna dialogowego powinny być < = 0x7FFF.
Normalny przycisk można umieścić w normalnej modalne okno dialogowe z IDC przycisk Ustaw ID odpowiednie polecenie Gdy użytkownik wybiera przycisk, właściciel okna dialogowego (zazwyczaj okna głównego ramki) pobiera polecenia, podobnie jak inne polecenia. Jest to nazywane polecenia GOSUB, ponieważ on zwykle jest używany do innego okna dialogowego (GOSUB pierwszego okna dialogowego).
Można również wywołać funkcję CWnd::UpdateDialogControls z okna dialogowego i podaj adres okna głównego ramki. Ta funkcja zostanie włączone lub wyłącz formanty okna dialogowego na podstawie czy mają polecenia obsługi w ramce. Ta funkcja jest wywoływana automatycznie dla Ciebie dla kontroli pasków w pętlę bezczynności aplikacji, ale należy go wywołać bezpośrednio dla zwykłych okien dialogowych, które chcesz mieć tę funkcję.
Kiedy nazywa się ON_UPDATE_COMMAND_UI
Utrzymywanie stanu włączony/zaznaczone elementy menu programu wszystkie cały czas może być problemem obliczeniowo kosztowne. Popularna technika stosowana jest/wyboru Włącz elementy menu tylko wtedy, gdy użytkownik wybierze POPUP. Wdrożenie MFC 2.0 CFrameWnd obsługuje wiadomości WM_INITMENUPOPUP i wykorzystuje architekturę routingu polecenia do określenia Państwa menu poprzez ON_UPDATE_COMMAND_UI obsługi.
CFrameWnd zajmuje się także komunikat WM_ENTERIDLE do opisania menu bieżący element zaznaczony na stan paska (znany również jako linia wiadomości).
Struktury menu aplikacji, edytowane przez Visual C++, jest używany do reprezentowania potencjalnych poleceń dostępnych w czasie WM_INITMENUPOPUP . ON_UPDATE_COMMAND_UI obsługi można zmodyfikować Państwa lub tekst menu, lub do zaawansowanych zastosowań (np. plik listy lub menu podręcznego zleceń OLE), rzeczywiście modyfikowanie struktury menu przed menu.
Samego sortowania ON_UPDATE_COMMAND_UI przetwarzanie odbywa się paski narzędzi (i innych pasków kontroli) podczas stosowania wprowadza pętlę bezczynności. Zobacz Klasy Library Reference i techniczne 31 Uwaga więcej informacji na temat sterowania paski.
Zagnieżdżone menu podręczne
Jeśli używasz struktury menu zagnieżdżonych zauważą, że obsługa ON_UPDATE_COMMAND_UI dla pierwszego elementu menu w menu podręcznym nazywa się w dwóch różnych przypadków.
Najpierw jest nazywany dla popup. Jest to konieczne, ponieważ menu podręczne nie mają identyfikatory i używamy identyfikator pierwszego elementu menu wyskakującego odnoszą się do całego menu podręczne. W tym przypadku m_pSubMenu Państwa zmienną obiektu CCmdUI będzie NIEZEROWE i będzie wskaż w menu podręcznym.
Po drugie nazywa się tuż przed elementów menu w menu podręcznym mają być pobierane. W tym przypadku identyfikator odnosi się tylko do pierwszego elementu menu i m_pSubMenu Państwa zmienną obiektu CCmdUI będzie mieć wartości NULL.
To pozwala włączyć odmienne od jego elementy menu podręczne, ale wymaga, napisać kod świadomość niektóre menu. Na przykład w menu zagnieżdżone o następującej strukturze:
Filegt;
Nowe >
Arkusza (ID_NEW_SHEET)
Wykres (ID_NEW_CHART)
Polecenia ID_NEW_SHEET i ID_NEW_CHART mogą być niezależnie włączone lub wyłączone. Menu podręczne "New" powinien być włączony, jeśli włączone jest jedno z dwóch.
Obsługa polecenia dla ID_NEW_SHEET (pierwsze polecenie w menu podręcznym) powinna wyglądać następująco:
void CMyApp::OnUpdateNewSheet (CCmdUI * pCmdUI)
{
nbsp; Jeżeli (pCmdUI - > m_pSubMenu! = NULL)
{
/ / enable całego podręczne dla "New" arkuszowej i wykresowej
BOOL bWłączenie = m_bCanCreateSheet || m_bCanCreateChart;
/ / CCmdUI::Enable jest op nr, w tym przypadku, więc mamy
/ / Wykonaj co to byłoby uczyniły.
pCmdUI - > m_pMenu - > EnableMenuItem (pCmdUI - > m_nIndex,
MF_BYPOSITION |
(bWłączenie? MF_ENABLED: (MF_DISABLED | MF_GRAYED)));
powrotu;
}
/ / inaczej tylko polecenie Nowy arkusz
pCmdUI - > Enable(m_bCanCreateSheet);
}
Obsługa polecenia dla ID_NEW_CHART byłoby normalnej aktualizacji polecenie obsługi i wygląd coś w rodzaju:
void CMyApp::OnUpdateNewChart (CCmdUI * pCmdUI)
{
nbsp; pCmdUI - > Enable(m_bCanCreateChart);
}
ON_COMMAND i ON_BN_CLICKED
Makra mapę wiadomości dla ON_COMMAND i ON_BN_CLICKED są takie same. MFC dowodzenia i kontroli zgłoszenia mechanizm rozsyłania używa tylko identyfikator polecenia podjęcie decyzji, gdzie można rozesłać do. Powiadomienia kontroli z kod powiadomienia kontroli zera (BN_CLICKED) są interpretowane jako polecenia.
Uwaga zaawansowane: W rzeczywistości, wszystkie komunikaty powiadamiające kontroli go za pośrednictwem łańcucha obsługi polecenia. Dlatego jest technicznie niemożliwe do pisania obsługi powiadamiania sterowania dla powiedzieć EN_CHANGE w klasie dokumentu. To nie jest ogólnie zalecane, ponieważ praktyczne zastosowania tej funkcji jest kilka, ta funkcja nie jest obsługiwana przez ClassWizard i użyj funkcji może skutkować delikatny kod.
Wyłączanie automatycznego wyłączania formantów przycisk
Po umieszczeniu formantu przycisku na pasku okna dialogowego lub w oknie dialogowym używając, gdzie się znajdujesz CWnd::UpdateDialogControls na własne, można zauważyć, że przyciski, które nie posiadają obsługi ON_COMMAND lub ON_UPDATE_COMMAND_UI zostaną automatycznie wyłączone dla Ciebie w ramach. W niektórych przypadkach będzie trzeba mieć uchwyt, ale będziesz przycisku pozostają włączone. Najprostszym sposobem osiągnięcia tego celu jest dodanie obsługi manekina polecenia (proste do wykonania z ClassWizard) i nic w nim.
Routowanie wiadomości okno
Poniżej opisano niektóre tematy bardziej zaawansowane klas MFC i jak Windows routingu wiadomości i innych tematach wpływ ich. Krótko opisana jest tylko informacje tutaj. Odnoszą się do Klasy Library Reference szczegółowe informacje na temat publicznych interfejsów API. Prosimy przeczytaµ kod źródłowy biblioteki MFC więcej informacji na temat szczegóły implementacyjne.
Proszę zobacz technicznych Uwaga 17 szczegóły w oknie Oczyszczanie, bardzo ważnym tematem dla wszystkich CWnd-klasom pochodnym.
Problemy z CWnd
Funkcję Państwa wykonania CWnd::OnChildNotify przewiduje potężne i rozszerzalną architekturę okien podrzędnych (znany również jako formanty) spinanie lub inny sposób informowani o wiadomości, poleceń i powiadomienia kontroli, które należy przejść do ich nadrzędnego (lub "właściciel"). Jeśli okno potomne (/ kontroli) jest obiektem C++ CWnd , sam wirtualny funkcja OnChildNotify jest wywoływana po raz pierwszy z parametrów z oryginalnej wiadomości (oznacza to, że struktura MSG ). Okno podrzędne można zostawić wiadomość pojedynczo, zjeść ją lub zmodyfikuj komunikat dla nadrzędnego (rzadko).
Domyślna implementacja CWnd obsługuje następujące komunikaty i używa hak OnChildNotify zezwalająca na pewno okien podrzędnych (kontrola) uzyskanie najpierw złamania wglądu do wiadomości:
Można zauważyć, że hak OnChildNotify jest używane do zmiany wiadomości rysowania przez właściciela do wiadomości self-draw.
Oprócz hak OnChildNotify wiadomości przewijania mają działanie dalsze routingu. Zobacz poniżej więcej informacji na temat pasków przewijania i źródeł wiadomości WM_HSCROLL i WM_VSCROLL.
Problemy z CFrameWnd
Klasa CFrameWnd zawiera większość polecenia routingu i interfejsu użytkownika aktualizacji realizacji. To jest używany głównie w oknie ramce głównej aplikacji (CWinApp::m_pMainWnd), ale dotyczy wszystkich ramki okien.
Okno główne ramek jest okno z paska menu i jest elementem nadrzędnym pasek stanu lub wiadomości linii. Prosimy przeczytaµ w powyższych dyskusji na temat polecenia routingu i WM_INITMENUPOPUP.
Klasa CFrameWnd umożliwia zarządzanie aktywnego widoku. Następujące wiadomości są routowane przez aktywny widok:
Problemy z CMDIFrameWnd/CMDIChildWnd
Zarówno MDI ramki okna klasy wynikają z CFrameWnd i dlatego są oba włączone dla samego sortowania polecenia routingu i interfejsu użytkownika aktualizacji, w CFrameWnd. Typowa aplikacja MDI tylko okno główne ramek (oznacza to, że obiekt CMDIFrameWnd ) posiada pasek menu i na pasku stanu i dlatego jest głównym źródłem polecenie wykonania routingu.
Ogólny system routingu jest, że aktywne okno potomne MDI pobiera pierwszą pęknięcia poleceń at. Funkcje PreTranslateMessage domyślne obsługują akceleratora tabele dla obu okien podrzędnych MDI (pierwszy) i ramki MDI (drugi), jak również standardowe skróty poleceń systemowych MDI, zazwyczaj obsługiwane przez TranslateMDISysAccel (last).
Problemy z paska przewijania
Podczas obsługi wiadomości przewijania (WM_HSCROLL/OnHScroll lub WM_VSCROLL/OnVScroll ), należy spróbować pisanie kodu obsługi, więc nie polegać na skąd pochodzą wiadomości pasek przewijania. To nie tylko ogólne Windows problemu, ponieważ przewijania wiadomości mogą pochodzić z prawdziwego przewijania pasek formanty lub WS_HSCROLL/WS_VSCROLL paski przewijania, które nie przewiń pasek formantów.
MFC rozciąga się do umożliwienia kontroli pasek przewijania za dziecko lub rodzeństwa okna są przewijane (w fakt, że relacja nadrzędny/podrzędny między paska przewijania i okna są przewijane może być cokolwiek). Jest to szczególnie ważne dla pasków przewijania udostępnionych z rozdzielacza systemu windows. Odsyłamy do 29 Uwaga techniczna szczegóły dotyczące wprowadzenia w życie CSplitterWnd , tym więcej informacji na temat kwestii pasek przewijania udostępnionych.
Na notatkę boczną istnieją dwie CWnd klas pochodnych, gdzie tworzyć style pasków przewijania, określone w są stosowane nadlewki i podlewki i nie przekazywane do systemu Windows. Gdy dane są przekazywane do procedury tworzenia, WS_HSCROLL i WS_VSCROLL może być niezależnie ustawiona, ale po utworzeniu nie można zmienić. Oczywiście należy bezpośrednio badania lub ustawić WS_?Bity styl PRZEWIJANIA okna, które utworzyli.
CMDIFrameWnd Style pasków przewijania, które przechodzą w Tworzenie lub LoadFrame są używane do tworzenia MDICLIENT. Jeśli chcesz mieć przewijanym obszarze MDICLIENT (takich jak Program Menedżer systemu Windows) należy ustawić przewijać oba style pasków (WS_HSCROLL | WS_VSCROLL) styl używany do tworzenia CMDIFrameWnd.
Dla CSplitterWnd Style pasków przewijania stosuje się do pasków specjalne udostępnionego przewijania dla regionów rozdzielacza. Dla windows rozdzielacza statycznego będzie zwykle nie ustawić albo styl paska przewijania. Dla podziału dynamicznego systemu windows będzie zazwyczaj mają przewijania pasek zestaw stylów w kierunku, który zostanie podzielony, oznacza to, że WS_HSCROLL jeśli można podzielić wiersze, WS_VSCROLL , jeśli można podzielić kolumn.
Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii