TN062: odbicie komunikatu dla formantów systemu Windows
[!UWAGA]
Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.
Ta uwaga techniczna zawiera opis wiadomości odbicie, nowa funkcja MFC 4.0.Zawiera także wskazówki dotyczące tworzenia prostych formant wielokrotnego użytku, który używa odbicie wiadomość.
Ta uwaga techniczna nie omówiono komunikat odbicie zastosowanie w przypadku formantów ActiveX (wcześniej nazywane formantami OLE).Zobacz artykuł formantów ActiveX: rozszerzanie formantu Windows.
Co to jest odbicie wiadomości?
Formanty programu Windows często wysyła komunikaty powiadamiające ich nadrzędnego systemu Windows.Na przykład, wiele formantów wysłać komunikat z powiadomieniem kolor formantu (WM_CTLCOLOR lub jeden z jego odmiany) do ich nadrzędnego, aby umożliwić rodziców dostarczyć pędzla do malowania tła formantu.
W systemie Windows i MFC przed wersji 4.0 okno nadrzędne, często okno dialogowe, jest odpowiedzialny za obsługę tych komunikatów.Oznacza to, że kod do obsługi komunikatu musi być w klasie okno nadrzędne i czy jest ma być duplikowany w każdej klasie, która musi obsługiwać tę wiadomość.W powyższym przypadku co okno dialogowe, który chciał formantów z niestandardowego tła musi obsługiwać komunikat z powiadomieniem kolor formantu.Byłoby znacznie łatwiejsze ponowne wykorzystanie kodu, jeśli klasa sterowania może być napisane, który zajęłaby własny kolor tła.
W wersji 4.0 MFC nadal działa mechanizm stary — windows nadrzędnego może obsługiwać komunikaty powiadamiające.Ponadto, jednak MFC 4.0 ułatwia ponowne użycie dostarczając funkcję o nazwie "wiadomość odbicie" umożliwiająca tych powiadomień do zrealizowania, wyrażoną w oknie Kontrola dziecko lub okno nadrzędne, lub w obu.W przykładzie kolor tła formantu, możesz teraz zapisać klasy kontroli, która ustawia swój własny kolor tła poprzez obsługę odzwierciedlenie WM_CTLCOLOR wiadomości — wszystko to bez opierając się na element nadrzędny. (Należy zauważyć, że ponieważ odbicie wiadomości jest implementowane przez MFC, nie przez system Windows, klasy okna nadrzędnego musi pochodzić z CWnd w celu odbicia wiadomość do pracy.)
Starsze wersje MFC nastąpiło coś podobny do odbicia wiadomości poprzez funkcje wirtualnych kilka wiadomości, takie jak wiadomości dla pól list sporządzone przez właściciela (WM_DRAWITEM, i tak dalej).Nowy mechanizm odbicie wiadomość jest ogólnych i spójne.
Odbicie wiadomość jest kompatybilna z kodem napisanych dla wersji biblioteki MFC przed 4.0.
Jeśli podano obsługi dla określonej wiadomości lub dla zakresu wiadomości w klasie okna nadrzędnego zastąpią odzwierciedlenie obsługi wiadomości dla tej samej wiadomości pod warunkiem nie wywołać funkcji obsługi klasy podstawowej w własne obsługi.Na przykład, jeśli uchwyt WM_CTLCOLOR w klasie okno dialogowe handling zastępują wszelkie programy obsługi wiadomości odzwierciedlenie.
Jeśli w klasie okna nadrzędnego podana obsługi dla określonego WM_NOTIFY wiadomość lub zakres WM_NOTIFY wiadomości, program obsługi będzie wywoływana tylko wtedy, gdy formant podrzędny wysyłanie tych wiadomości nie ma obsługi wiadomości odzwierciedlonej przez ON_NOTIFY_REFLECT().Jeśli używasz ON_NOTIFY_REFLECT_EX() na mapie wiadomość z obsługi wiadomości może lub nie może zezwolić na wyświetlenie okna nadrzędnego do obsługi wiadomości.Jeśli program obsługi zwraca FALSE, wiadomość zostanie obsłużony przez nadrzędny, jak również podczas wywołanie, które zwraca TRUE nie pozwala traktować go z obiektu nadrzędnego.Należy zauważyć, że odzwierciedlenie wiadomość jest obsługiwany przed komunikat z powiadomieniem.
Gdy WM_NOTIFY wiadomość jest wysyłana, formant jest oferowana jest pierwszy możliwość je obsłużyć.Jeśli inne odzwierciedlenie wiadomość jest wysyłana, okno nadrzędne ma pierwszy szansę poradzić i formant zostanie wyświetlony komunikat odbite.W tym celu konieczne jest funkcja obsługi i odpowiedni wpis w tablicy wiadomości klasy formantu.
Makro mapę wiadomości dla wiadomości odzwierciedlenie jest nieco inaczej niż w przypadku regularnych powiadomień: ma on _REFLECT dołączony do nazwy zwykłych.Na przykład do obsługi WM_NOTIFY wiadomości w obiekcie nadrzędnym, użyć makra ON_NOTIFY mapy wiadomości przez jednostkę dominującą.Aby obsługiwać wiadomości odzwierciedlenie w formant podrzędny, należy użyć ON_NOTIFY_REFLECT makro w mapie wiadomości formant podrzędny.W niektórych przypadkach parametry są różne, jak również.Zauważ, że ClassWizard można zwykle dodać wpisy mapy wiadomości dla Ciebie i zapewnienia implementacji funkcji szkielet z poprawnych parametrów.
Zobacz TN061: ON_NOTIFY i wiadomości WM_NOTIFY Aby uzyskać informacje na temat nowych WM_NOTIFY wiadomości.
Wpisy Map wiadomości i prototypów funkcji obsługi wiadomości odbity
Do obsługi komunikat z powiadomieniem odzwierciedlenie kontroli, należy użyć makra mapę wiadomości i prototypów funkcji wymienionych w poniższej tabeli.
ClassWizard zwykle można dodać te wpisy mapy wiadomości dla Ciebie i zapewnienia funkcji szkielet implementacji.Zobacz Definiowanie obsługi wiadomości dla wiadomości odzwierciedlenie uzyskać informacji na temat sposobu definiowania procedury obsługi wiadomości odzwierciedlenie.
Aby przekonwertować z nazwą wiadomości nazwy makra odbite, dołączana ON_ i Dołącz _REFLECT.Na przykład WM_CTLCOLOR staje się ON_WM_CTLCOLOR_REFLECT. (Aby wyświetlić wiadomości, które mogą zostać uwzględnione, wykonać konwersji przeciwnej w zapisach makro w poniższej tabeli).
Trzy wyjątki od powyżej reguły są następujące:
Makro dla WM_COMMAND powiadomienia o jest ON_CONTROL_REFLECT.
Makro dla WM_NOTIFY odbicia jest ON_NOTIFY_REFLECT.
Makro dla ON_UPDATE_COMMAND_UI odbicia jest ON_UPDATE_COMMAND_UI_REFLECT.
W każdym z powyższych przypadków specjalnych należy określić nazwę programu obsługi funkcji składowej.W innych przypadkach należy użyć standard nazwę swojej funkcji obsługi.
Znaczenie parametrów i wartości zwracane funkcji są udokumentowane pod nazwą funkcji lub nazwę funkcji z na zabezpieczony.Na przykład CtlColor jest udokumentowana w OnCtlColor.Kilka obsługi wiadomości odzwierciedlenie konieczne parametry mniej niż podobne programy obsługi w oknie nadrzędnym.Po prostu odpowiadają nazwom w poniższej tabeli z nazwami parametrów formalnych w dokumentacji.
Wpis mapy |
Prototyp funkcji |
---|---|
ON_CONTROL_REFLECT( wNotifyCode, memberFxn ) |
afx_msg void memberFxn ( ); |
ON_NOTIFY_REFLECT( wNotifyCode, memberFxn ) |
afx_msg void memberFxn ( NMHDR * pNotifyStruct, LRESULT* result ); |
ON_UPDATE_COMMAND_UI_REFLECT (memberFxn) |
afx_msg void memberFxn ( CCmdUI* pCmdUI ); |
(ON_WM_CTLCOLOR_REFLECT) |
afx_msg HBRUSH CtlColor ( CDC* pDC, UINT nCtlColor ); |
(ON_WM_DRAWITEM_REFLECT) |
Unieważnij afx_msg DrawItem (LPDRAWITEMSTRUCTlpDrawItemStruct); |
(ON_WM_MEASUREITEM_REFLECT) |
Unieważnij afx_msg MeasureItem (LPMEASUREITEMSTRUCTlpMeasureItemStruct); |
(ON_WM_DELETEITEM_REFLECT) |
Unieważnij afx_msg DeleteItem (LPDELETEITEMSTRUCTlpDeleteItemStruct); |
(ON_WM_COMPAREITEM_REFLECT) |
afx_msg int CompareItem (LPCOMPAREITEMSTRUCTlpCompareItemStruct); |
(ON_WM_CHARTOITEM_REFLECT) |
afx_msg int CharToItem ( UINT nKey, UINT nIndex ); |
(ON_WM_VKEYTOITEM_REFLECT) |
afx_msg int VKeyToItem ( UINT nKey, UINT nIndex ); |
(ON_WM_HSCROLL_REFLECT) |
afx_msg void HScroll ( UINT nSBCode, UINT nPos ); |
(ON_WM_VSCROLL_REFLECT) |
afx_msg void VScroll ( UINT nSBCode, UINT nPos ); |
(ON_WM_PARENTNOTIFY_REFLECT) |
afx_msg void ParentNotify ( UINT message, LPARAM lParam ); |
ON_NOTIFY_REFLECT i ON_CONTROL_REFLECT makra ma odmian, które zezwalają więcej niż jeden obiekt (na przykład formant i jego obiektu nadrzędnego) do obsługi danej wiadomości.
Wpis mapy |
Prototyp funkcji |
---|---|
ON_NOTIFY_REFLECT_EX( wNotifyCode, memberFxn ) |
afx_msg BOOL memberFxn ( NMHDR * pNotifyStruct, LRESULT* result ); |
ON_CONTROL_REFLECT_EX( wNotifyCode, memberFxn ) |
afx_msg BOOL memberFxn ( ); |
Obsługa wiadomości Reflected: Przykład kontroli wielokrotnego użytku
Ten prosty przykład tworzy wielokrotnego użytku formant o nazwie CYellowEdit.Formant działa tak samo, jako formant edycji regularnych, z tym wyjątkiem, że wyświetla czarny tekst na żółtym tle.Byłoby ułatwiają dodawanie funkcji elementów członkowskich, które pozwoliłyby CYellowEdit formantu, aby wyświetlić różne kolory.
Aby spróbować przykładu, który tworzy formant wielokrotnego użytku
Utwórz nowe okno dialogowe w istniejącej aplikacji.Aby uzyskać więcej informacji, zobacz okno dialogowe Edytor tematu.
Musi być aplikacja dla rozwoju kontroli wielokrotnego użytku.Jeśli nie masz istniejącej aplikacji umożliwia tworzenie aplikacji opartych na okno dialogowe za pomocą AppWizard.
Nad projektem ładowane do programu Visual C++, użyj ClassWizard Aby utworzyć nową klasę o nazwie CYellowEdit na podstawie CEdit.
Dodać trzy zmienne składowe do swojej CYellowEdit klasy.Dwa pierwsze będzie COLORREF zmiennych do przechowywania kolor tekstu i kolor tła.Trzeci okres będzie CBrush obiekt, który będzie przechowywać pędzla do malowania w tle.CBrush Obiektu pozwala utworzyć pędzla raz, jedynie przywołującego ją po tym i zniszczyć pędzla automatycznie kiedy CYellowEdit kontroli jest niszczony.
Inicjuj zmienne składowe pisząc konstruktora w następujący sposób:
CYellowEdit::CYellowEdit() { m_clrText = RGB( 0, 0, 0 ); m_clrBkgnd = RGB( 255, 255, 0 ); m_brBkgnd.CreateSolidBrush( m_clrBkgnd ); }
Za pomocą ClassWizard, Dodaj program obsługi odzwierciedlenie WM_CTLCOLOR wiadomości do sieci CYellowEdit klasy.Należy zauważyć, że znak równości przed nazwą wiadomość na liście wiadomości, które można obsługiwać wskazuje, że wiadomość jest odzwierciedlona.Jest to opisane w Definiowanie obsługi wiadomości dla wiadomości odzwierciedlenie.
ClassWizard dodaje następujące funkcję makro i szkielet mapy wiadomości dla Ciebie:
ON_WM_CTLCOLOR_REFLECT() // Note: other code will be in between.... HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) { // TODO: Change any attributes of the DC here // TODO: Return a non-NULL brush if the // parent's handler should not be called return NULL; }
Zastąpić treść funkcji następujący kod.Kod ten określa kolor tekstu, kolor tła tekstu i kolor tła dla reszty formantu.
pDC->SetTextColor( m_clrText ); // text pDC->SetBkColor( m_clrBkgnd ); // text bkgnd return m_brBkgnd; // ctl bkgnd
Utwórz formant edycyjny w sieci-okno dialogowe, a następnie dołączyć go do zmienna członka przez dwukrotne kliknięcie formantu edycyjnego, przytrzymując klawisz control.W oknie dialogowym Dodaj zmienną Zakończ nazwę zmiennej i wybierz polecenie "Kontrola" dla kategorii, a następnie "CYellowEdit" dla typu zmiennej.Nie zapomnij ustawić kolejność dostępu w oknie dialogowym.Należy także pamiętać o dołączenie pliku nagłówka dla CYellowEdit kontroli w pliku nagłówka swoje okno dialogowe.
Tworzenie i uruchamianie aplikacji.Formant edycyjny będzie miał żółte tło.