Udostępnij za pośrednictwem


TN062: Komunikat odbicie formantów systemu Windows

[!UWAGA]

Następujące Uwaga techniczna została zaktualizowana, ponieważ najpierw została uwzględniona w dokumentacji online.W rezultacie niektóre procedur i tematów może być nieaktualne lub nieprawidłowe.Najnowsze informacje zaleca się wyszukać temat zainteresowanie Indeks dokumentacji online.

Ten Uwaga techniczna opisuje odbicie komunikat, nowa funkcja MFC 4.0.Zawiera także wskazówki dotyczące tworzenia prostych wielokrotnego użytku formant odbicie komunikat.

Uwaga techniczna, to nie omówiono odbicie komunikat do formantów ActiveX (uprzednio określana jako formanty OLE).Zobacz artykuł formantów ActiveX: tworzenie podklas sterowania Windows.

Co to jest wiadomość odbicie?

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 jednego z jego odmiany) do ich nadrzędnego, aby zezwolić nadrzędnego do dostarczania pędzla za malowanie 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 obsługi wiadomości musi być klasy okno nadrzędne i że ma zostać powielony w każdej klasy, 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ć komunikat z powiadomieniem kolor formantu.Byłoby znacznie łatwiejsze ponowne użycie kodu, jeśli klasa sterowania można zapisać, która będzie obsługiwać własnego koloru tła.

W wersji 4.0 MFC, nadal działa mechanizm starego — windows nadrzędnego może obsłużyć wiadomości powiadomień.Ponadto, jednak MFC 4.0 ułatwia ponowne użycie przez zapewnienie funkcja o nazwie "odbicie komunikat" która umożliwia te wiadomości powiadomień do obsługi okna formantu podrzędnego lub okno nadrzędne lub w obu.W przykładzie kolor tła formantu, można teraz napisać klasy control, który ustawia kolor tła poprzez obsługę odbitego WM_CTLCOLOR wiadomości — wszystko to bez korzystania z obiektu nadrzędnego.(Należy zauważyć, że ponieważ odbicie komunikat jest implementowana przez MFC, nie przez system Windows, klasy okna nadrzędnego musi pochodzić od CWnd w celu odbicia wiadomości do pracy.)

Starsze wersje MFC czy coś podobnego do odbicia wiadomości poprzez funkcje wirtualnych kilka wiadomości, takich jak wiadomości dla pól listy rysowania przez właściciela (WM_DRAWITEMi tak dalej).Nowy mechanizm odbicie komunikat jest uogólnionego i spójny.

Odbicie komunikat jest zgodna z kodem napisanych dla wersji MFC przed 4.0.

Jeśli podano obsługi dla określonej wiadomości lub dla zakresu wiadomości klasy okna nadrzędnego zastąpią odzwierciedlenie obsługi wiadomości dla tej samej wiadomości pod warunkiem, że nie wywołać funkcję obsługi klasy podstawowej obsługi własne.Na przykład można obsługiwać WM_CTLCOLOR w klasie pole dialogowe programu obsługi zastępują wszelkie programy obsługi wiadomości odbity.

Jeśli w klasie okno nadrzędne są dostarczyć obsługi dla określonego WM_NOTIFY wiadomości lub zakres WM_NOTIFY wiadomości, nasza procedura obsługi będzie wywoływana tylko wtedy, gdy formant podrzędny wysyłania tych wiadomości nie ma obsługi wiadomości odzwierciedlonej przez ON_NOTIFY_REFLECT().Jeśli korzystasz z ON_NOTIFY_REFLECT_EX() na mapie wiadomość programu obsługi wiadomości może lub nie zezwalaj na okna nadrzędnego do obsługi wiadomości.Jeśli program obsługi zwraca FALSE, wiadomości będą obsługiwane przez nadrzędny, jak również podczas rozmowy, która zwraca TRUE nie zezwala na nadrzędnej do jego obsługi.Uwaga obsługi wiadomości odbitego przed komunikat z powiadomieniem.

Gdy WM_NOTIFY wiadomość jest wysyłana, formant jest oferowane pierwszej szansy go obsłużyć.Jeśli inne odbitego wiadomość jest wysyłana, okno nadrzędne ma pierwszej szansy do jego obsługi i kontroli zostanie wyświetlony komunikat odbitego.W tym celu konieczne funkcji obsługi i odpowiedni wpis w mapie wiadomości klasy formantu.

Makro mapę wiadomości dla wiadomości odbitego jest nieco inne niż regularnych powiadomień: ma _REFLECT dołączane do jego nazwa zwyczajowa.Na przykład do obsługi WM_NOTIFY wiadomości w nadrzędnej, można użyć makra ON_NOTIFY w mapie wiadomości obiektu nadrzędnego.Do obsługi wiadomości odbitego w formant podrzędny, użyj 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 i dostarczyć implementacji funkcji szkielet z prawidłowych parametrów.

Zobacz TN061: ON_NOTIFY i wiadomości WM_NOTIFY Aby uzyskać informacje na temat nowych WM_NOTIFY wiadomości.

Zapisy Map wiadomości i prototypy funkcji obsługi wiadomości odbitego

Do obsługi komunikat z powiadomieniem odbitego kontroli, należy użyć makra mapę wiadomości i prototypy funkcji wymienionych w poniższej tabeli.

ClassWizard zwykle można dodać te wpisy mapy wiadomości i udostępniać funkcji szkielet implementacji.Zobacz Definiowanie obsługi wiadomości dla wiadomości odzwierciedlenie informacje na temat definiowania obsługi wiadomości odbity.

Aby przekonwertować z nazwą wiadomości nazwa makra odbite, dołączy ON_ i Dołącz _REFLECT.Na przykład WM_CTLCOLOR staje się ON_WM_CTLCOLOR_REFLECT.(Aby zobaczyć wiadomości, które zostaną uwzględnione, należy wykonać konwersję przeciwnych makro zapisów w tabeli poniżej.)

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

  • Makro dla WM_COMMAND powiadomienia 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 musi używać nazwy standardowych funkcji obsługi.

Znaczenie parametry i wartości zwracane funkcji są udokumentowane w obszarze Nazwa funkcji lub nazwę funkcji z na poprzedzany.Na przykład CtlColor w OnCtlColor.Kilka obsługi wiadomości odbitego konieczne parametry mniej niż podobne programy obsługi w okno nadrzędne.Po prostu odpowiadają nazwom w poniższej tabeli z nazwami parametrów formalnych w dokumentacji.

Wpisu mapy

Prototyp

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)

afx_msg void DrawItem (LPDRAWITEMSTRUCTlpDrawItemStruct);

(ON_WM_MEASUREITEM_REFLECT)

afx_msg void MeasureItem (LPMEASUREITEMSTRUCTlpMeasureItemStruct);

(ON_WM_DELETEITEM_REFLECT)

afx_msg void 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 mają zmian, które umożliwiają więcej niż jeden obiekt (na przykład formant i jego obiektu nadrzędnego) do obsługi danej wiadomości.

Wpisu mapy

Prototyp

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 formantu wielokrotnego użytku

Ten prosty przykład tworzy wielokrotnego użytku formant o nazwie CYellowEdit.Formant działa tak samo jak regularne edycyjnym, z wyjątkiem, że wyświetla czarny tekst na żółtym tle.Byłoby łatwe dodawanie funkcji elementów członkowskich, które pozwoliłyby CYellowEdit formantu, aby wyświetlić inne kolory.

Aby spróbować przykładem, który tworzy formant wielokrotnego użytku

  1. Utwórz nowe okno dialogowe w istniejącej aplikacji.Aby uzyskać więcej informacji, zobacz okno dialogowe Edytor tematu.

    Musi mieć aplikacji dla rozwoju kontroli wielokrotnego użytku.Jeśli nie masz, aby użyć istniejącej aplikacji, tworzenie aplikacji opartych na okno dialogowe za pomocą AppWizard.

  2. W projekcie ładowane do programu Visual C++, użyj ClassWizard Aby utworzyć nową klasę o nazwie CYellowEdit na podstawie CEdit.

  3. Dodać trzy zmienne składowe, aby Twoje CYellowEdit klasy.Dwa pierwsze będą COLORREF zmienne kolor tekstu i kolor tła.Trzeci będzie CBrush obiekt, który będzie sprawować pędzla na obraz tła.CBrush Obiektu umożliwia tworzenie pędzla, raz, jedynie przywołującego ją po tym i zniszczyć pędzla automatycznie po CYellowEdit formantu zostanie zniszczony.

  4. Zainicjuj 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 );
    }
    
  5. Za pomocą ClassWizard, dodać obsługę odbitego WM_CTLCOLOR wiadomości do użytkownika CYellowEdit klasy.Uwaga znak 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 dla wiadomości odzwierciedlenie.

    ClassWizard dodaje następującą funkcję makro i szkielet mapę wiadomości:

    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;
    }
    
  6. Zastąp organ funkcji następujący kod.Kod określa kolor tekstu, kolor tła tekstu i kolor tła dla pozostałej części kontroli.

       pDC->SetTextColor( m_clrText );   // text
       pDC->SetBkColor( m_clrBkgnd );   // text bkgnd
       return m_brBkgnd;            // ctl bkgnd
    
  7. Tworzenie formantu edycji w oknie dialogowym użytkownika, a następnie dołączyć go do zmienną przez dwukrotne kliknięcie formantu edycyjnego, przytrzymując klawisz control.W oknie dialogowym Dodaj zmienną Zakończ nazwę zmiennej i wybierz opcję "Kontrola" dla kategorii, a następnie "CYellowEdit" dla typu zmiennej.Nie zapomnij ustawić kolejność, w oknie dialogowym.Należy również dołączyć plik nagłówka dla CYellowEdit kontroli w pliku nagłówkowym okno dialogowe użytkownika.

  8. Tworzenie i uruchamianie aplikacji.Formant edycji będzie miał żółte tło.

Zobacz też

Inne zasoby

Uwagi techniczne przez liczbę

Uwagi techniczne według kategorii