TN062: Komunikat refleksji dla formantów systemu Windows

Ta Uwaga techniczna opisano komunikat refleksji, Nowa funkcja MFC 4.0. Zawiera także wskazówki dotyczące tworzenia formant z proste wielokrotnego użytku, który używa komunikatu refleksji.

Ta Uwaga techniczna nie omówiono komunikat refleksji, jak odnosi się do formantów ActiveX (dawniej nazywane formantami OLE). Zobacz artykuł formantów ActiveX: instacji formant Windows w Visual C++ Programmer's Guide.

Co to jest wiadomość refleksji?

Formanty programu Windows często wysyła komunikaty powiadamiające ich nadrzędnego systemu Windows. Na przykład wiele formantów wysłać wiadomość powiadomienia kolor formantu (WM_CTLCOLOR lub jednego z jej warianty) do dominującym aby zezwolić nadrzędnego do dostarczania pędzla za malowanie tła formantu.

W systemie Windows i MFC przed do wersji 4.0 okno nadrzędne, często okno dialogowe, jest odpowiedzialny za obsługę tych wiadomości. Oznacza to, że kod obsługi wiadomości musi być klasy okno nadrzędne i że nie ma być duplikowany w każdej klasie, która potrzebuje obsługi wiadomości. W powyższym przypadku co okno dialogowe, który chciał formantów z niestandardowe tła musi obsługiwać wiadomości z powiadomieniem kolor formantu. Byłoby znacznie łatwiejsze ponowne użycie kodu, jeśli klasa kontroli można zapisać, że że poprowadziłby własnego koloru tła.

W wersji 4.0 MFC, nadal działa mechanizm starego — nadrzędnego systemu windows może obsłużyć wiadomości powiadomień. Ponadto, jednak MFC 4.0 ułatwia ponowne poprzez funkcję o nazwie "wiadomości refleksji", która umożliwia tych komunikatów powiadomienia mają być przetwarzane w oknie kontroli dziecko lub okno nadrzędne, lub obu. W przykładzie kolor tła formantu, można teraz napisać klasy kontroli, który ustawia kolor tła przez obsługi odbitego komunikatu WM_CTLCOLOR — wszystko to bez polegając na nadrzędny. (Należy zauważyć, że ponieważ wiadomość odbicia jest wdrażany przez MFC, nie przez system Windows, klasy okna nadrzędnego musi pochodzić od CWnd do refleksji wiadomości do pracy).

Starsze wersje MFC zrobiła coś, co podobny do refleksji wiadomości poprzez funkcje wirtualnych kilka wiadomości, takich jak wiadomości dla pola listy rysowane przez właściciela (WM_DRAWITEMi tak dalej). Nowy Mechanizm refleksji wiadomości jest uogólnione i spójne.

Odbicie wiadomości jest zgodny wstecz z kodu napisanego dla wersji MFC wcześniejszych niż 4.0.

Jeśli zostały dostarczone obsługi dla określonej wiadomości, lub dla zakresu wiadomości, okno nadrzędne klasy, będą zastępowały odzwierciedlone obsługi wiadomości do tej samej wiadomości, pod warunkiem nie wywołuj funkcję obsługi klasy bazowej własne obsługi. Na przykład jeśli dojście WM_CTLCOLOR w klasie pole dialogowe, użytkownika obsługa zastępują wszelkie obsługi wiadomości odbitego.

Jeśli w klasie okna nadrzędnego zostanie podana obsługi dla określonej wiadomości WM_NOTIFY lub zakres WM_NOTIFY wiadomości, kodzie zostanie wywołana tylko wtedy, gdy formant podrzędny, wysyłanie wiadomości nie ma obsługi wiadomości odbite przez ON_NOTIFY_REFLECT(). Jeśli używasz ON_NOTIFY_REFLECT_EX() na mapie wiadomości, obsługi wiadomości może lub nie może zezwolić na wyświetlenie okna nadrzędnego do obsługi wiadomości. Jeśli obsługa zwraca wartość TRUE, wiadomość będzie obsługiwane przez nadrzędny, jak również podczas wywołania, które zwraca wartość Fałsz pozwala nadrzędnym będzie przetwarzał. Uwaga obsługi odbitego wiadomości zanim wiadomość z powiadomieniem.

Gdy wysyłana jest wiadomość WM_NOTIFY , formant jest oferowana pierwsza okazja aby je obsłużyć. Jeśli inne odbitego wiadomość jest wysyłana, okno nadrzędne ma pierwsza okazja do jego obsługi i kontroli zostanie wyświetlony komunikat odbitego. Aby to zrobić, należy w funkcji obsługi i odpowiedni wpis w formantu klasy wiadomości mapę.

Makro wiadomości Mapa odbitego wiadomości jest nieco inaczej niż w przypadku regularnych powiadomień: posiada _REFLECT dołączonym do jego nazwa zwyczajowa. Na przykład do obsługi wiadomości WM_NOTIFY w obiekcie nadrzędnym, korzystając z makra ON_NOTIFY obiektu nadrzędnego wiadomości mapie. Do obsługi wiadomości odbitego w formancie dziecka, należy użyć makra ON_NOTIFY_REFLECT na mapie wiadomości formant podrzędny. W niektórych przypadkach parametry są różne, jak również. Uwaga Aby ClassWizard może zazwyczaj dodać wpisy wiadomości Mapa i zapewnić implementacje szkielet funkcji z prawidłowych parametrów.

Zobacz TN061: ON_NOTIFY i WM_NOTIFY wiadomości informacji na temat nowej wiadomości WM_NOTIFY.

Wiadomości Mapa wpisów i prototypy funkcji obsługi wiadomości odbitego

Do obsługi wiadomości z powiadomieniem odbitego kontroli, za pomocą wiadomości Mapa makra i prototypy funkcji wymienionych w poniższej tabeli.

ClassWizard zwykle można dodać wpisy te wiadomości Mapa i udostępniać szkielet funkcji implementacje. Zobacz Definiowanie obsługi wiadomości wiadomości odzwierciedlone w Visual C++ Programmer's Guide for informacji na temat sposobu definiowania obsługi dla odzwierciedlenie wiadomości.

Aby przekonwertować z nazwą wiadomości nazwę makra odbite, dołączy ON_ i dołącz _REFLECT. Na przykład WM_CTLCOLOR staje się ON_WM_CTLCOLOR_REFLECT. (Aby wyświetlić wiadomości, które mogą być odzwierciedlane, wykonać odwrotnej konwersji w zapisach makra w poniższej tabeli).

Trzy wyjątki od wyżej reguły są następujące:

W każdym z powyższych przypadków należy określić nazwę funkcji członek obsługi. W innych przypadkach należy użyć nazwy standardowych funkcji obsługi.

Znaczenie parametry i wartości zwracane funkcji są udokumentowane pod nazwą funkcji lub nazwę funkcji w sprawie poprzedzany. Na przykład CtlColor jest udokumentowana w OnCtlColor. Kilka obsługi wiadomości odbitego potrzebne parametry mniej niż podobne programy obsługi w okno nadrzędne. Po prostu pasują do nazw w poniższej tabeli z nazwami parametrów formalnych w dokumentacji.

Wpisie mapy Prototyp
ON_CONTROL_REFLECT ( wNotifyCode, memberFxn ) afx_msg voidmemberFxn ( );
ON_NOTIFY_REFLECT ( wNotifyCode, memberFxn ) afx_msg voidmemberFxn(NMHDR * pNotifyStruct, LRESULT * wynik );
ON_UPDATE_COMMAND_UI_REFLECT ( memberFxn ) afx_msg voidmemberFxn(CCmdUI * pCmdUI );
(ON_WM_CTLCOLOR_REFLECT) afx_msg HBRUSH CtlColor (CDC * kontrolera pDC, UINT nCtlColor );
(ON_WM_DRAWITEM_REFLECT) afx_msg void DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct );
(ON_WM_MEASUREITEM_REFLECT) afx_msg void MeasureItem (LPMEASUREITEMSTRUCT lpMeasureItemStruct );
(ON_WM_DELETEITEM_REFLECT) afx_msg void DeleteItem (LPDELETEITEMSTRUCT lpDeleteItemStruct );
(ON_WM_COMPAREITEM_REFLECT) afx_msg int CompareItem (LPCOMPAREITEMSTRUCT lpCompareItemStruct );
(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 nienastawionych );
(ON_WM_VSCROLL_REFLECT) afx_msg void VScroll (UINT nSBCode, UINT nienastawionych );
(ON_WM_PARENTNOTIFY_REFLECT) afx_msg void ParentNotify (UINT wiadomości, FIKCYJNYMI fikcyjnymi );

Makra ON_NOTIFY_REFLECT i ON_CONTROL_REFLECT są różnice, które umożliwiają więcej niż jeden obiekt (takie jak formant i jego rodzica) do obsługi danej wiadomości.

Wpisie mapy Prototyp
ON_NOTIFY_REFLECT_EX ( wNotifyCode, memberFxn ) afx_msg BOOLmemberFxn(NMHDR * pNotifyStruct, LRESULT * wynik );
ON_CONTROL_REFLECT_EX ( wNotifyCode, memberFxn ) afx_msg BOOLmemberFxn ( );

Obsługa Reflected wiadomości: Przykład formantu wielokrotnego użytku

Ten prosty przykład tworzy wielokrotnego użytku formantu o nazwie CYellowEdit . Formant działa tak samo jak formant edycji regularne, z tym wyjątkiem, że wyświetla czarny tekst na żółtym tle. Byłoby łatwo dodać funkcje składowe, które pozwoliłyby CYellowEdit formantu, aby wyowietlić różne kolory.

Aby uruchomić ten przykład, należy wykonać następujące kroki:

  1. Utwórz nowe okno dialogowe w istniejącej aplikacji. Aby uzyskać więcej informacji zobacz okno dialogowe Edytor Visual C++ User Guide.

    Musisz mieć aplikację dla rozwoju kontroli wielokrotnego użytku. Jeśli nie masz istniejącej aplikacji umożliwia tworzenie aplikacji opartych na okno dialogowe za pomocą AppWizard.

  2. Z projektem ładowane do programu Visual C++, użyj ClassWizard, aby utworzyć nową klasę o nazwie CYellowEdit w oparciu o CEdit. Pozostaw pole "Dodaj do składnika Gallery" kontrolowane.

  3. Dodać trzy zmienne do Twojej CYellowEdit klasy. Dwa pierwsze będą zmienne COLORREF kolor tekstu i kolor tła. Trzeci będzie obiekt CBrush , które będzie sprawować pędzel do malowania tła. Obiekt CBrush umożliwia tworzenie pędzla raz, jedynie przywołującego ją po tym i zniszczyć pędzla automatycznie podczas CYellowEdit kontroli jest niszczony.

  4. Inicjowanie zmiennych pisząc konstruktora następująco:
    CYellowEdit::CYellowEdit()
    {
    m_clrText = RGB (0, 0, 0);
    m_clrBkgnd = RGB (255, 255, 0);
    m_brBkgnd.CreateSolidBrush (m_clrBkgnd);
    }
    
  5. Za pomocą ClassWizard, dodać obsługę odbitego wiadomość WM_CTLCOLOR z CYellowEdit klasy. Należy zauważyć, że równości z przodu nazwy wiadomość na liście wiadomości, którą może obsłużyć wskazuje, że wiadomość jest odzwierciedlona. Jest to opisane w Definiowanie obsługi wiadomości wiadomości odzwierciedlone w Visual C++ Programmer's Guide.

    ClassWizard dodaje następujące wiadomości Mapa makro i szkielet funkcji:

    ON_WM_CTLCOLOR_REFLECT()
    
    / / Uwaga: inny kod będzie pomiędzy....
    
    HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) {}
    / / TODO: zmienić atrybuty tutaj DC
    
    / / TODO: Powrót Pędzel NIEZEROWE, jeśli
    / / obsługi jednostki dominującej nie powinien być wywołany
    Zwraca wartość NULL;
    }
    
  6. Jednostka funkcji należy zastąpić poniższy kod. Kod określa kolor tekstu, kolor tła tekstu i kolor tła dla pozostałej części kontroli.
    pDC BT;SetTextColor (m_clrText);    / / tekst
    pDC - > SetBkColor (m_clrBkgnd);    / / tło tekstu /
    Zwraca m_brBkgnd;                / / ctl tło /
    
  7. Utwórz formant edycyjny w okno dialogowe, a następnie dołączyć go do zmiennej Państwa przez dwukrotne kliknięcie formantu edycyjnego jednocześnie przytrzymując klawisz control. W oknie dialogowym Dodaj zmienną zakończenia nazwę zmiennej i wybierz "Kontrola" dla kategorii, następnie "CYellowEdit" dla typu zmiennej. Nie zapomnij ustawić kolejność tabulatorów w oknie dialogowym. Ponadto należy koniecznie zawierać plik nagłówka CYellowEdit kontroli w pliku nagłówkowym okno dialogowe.

  8. Skompilować i uruchomić aplikację. Formant edycji będzie miał żółte tło.

  9. Galeria składników można teraz używać, aby dodać użytkownika CYellowEdit kontroli klasy do innych projektów.

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index