Formanty MFC ActiveX: tworzenie podklasy formantu okna

W tym artykule opisano proces podklasowania wspólnej kontrolki systemu Windows w celu utworzenia kontrolki ActiveX. Podklasowanie istniejącej kontrolki systemu Windows to szybki sposób tworzenia kontrolki ActiveX. Nowa kontrolka będzie miała możliwości podklasowanej kontrolki systemu Windows, takiej jak malowanie i reagowanie na kliknięcia myszą. Przykładowy przycisk kontrolek ActiveX MFC to przykład podklasowania kontrolki systemu Windows.

Ważne

ActiveX to starsza technologia, która nie powinna być używana do tworzenia nowych rozwiązań. Aby uzyskać więcej informacji na temat nowoczesnych technologii zastępujących activex, zobacz Kontrolki ActiveX.

Aby podklasować kontrolkę systemu Windows, wykonaj następujące zadania:

Zastępowanie isSubclassedControl i PreCreateWindow

Aby zastąpić instrukcje i IsSubclassedControl, dodaj następujące wiersze PreCreateWindow kodu do protected sekcji deklaracji klasy kontrolnej:

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();

W pliku implementacji kontrolki (. CPP), dodaj następujące wiersze kodu, aby zaimplementować dwie zastąpione funkcje:

// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx

BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
   cs.lpszClass = _T("BUTTON");
   return COleControl::PreCreateWindow(cs);
}

// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control

BOOL CMyAxSubCtrl::IsSubclassedControl()
{
   return TRUE;
}

Zwróć uwagę, że w tym przykładzie kontrolka przycisku systemu Windows jest określona w pliku PreCreateWindow. Jednak wszystkie standardowe kontrolki systemu Windows mogą być podklasowane. Aby uzyskać więcej informacji na temat standardowych kontrolek systemu Windows, zobacz Controls (Kontrolki).

Podczas podklasowania kontrolki systemu Windows można określić określony styl okna (WS_) lub rozszerzone flagi stylu okna (WS_EX_), które mają być używane podczas tworzenia okna kontrolki. Wartości tych parametrów można ustawić w funkcji składowej PreCreateWindow , modyfikując cs.style pola struktury i cs.dwExStyle . Modyfikacje tych pól należy wprowadzić przy użyciu operacji OR , aby zachować flagi domyślne ustawione przez klasę COleControl. Jeśli na przykład kontrolka jest podklasą kontrolki BUTTON i chcesz, aby kontrolka wyglądała jako pole wyboru, wstaw następujący wiersz kodu do implementacji CSampleCtrl::PreCreateWindowinstrukcji , przed instrukcją return:

cs.style |= BS_CHECKBOX;

Ta operacja dodaje flagę stylu BS_CHECKBOX, pozostawiając flagę stylu domyślnego (WS_CHILD) klasy COleControl bez zmian.

Modyfikowanie funkcji składowej OnDraw

Jeśli chcesz, aby kontrolka podklasy zachowywała ten sam wygląd co odpowiednia kontrolka systemu Windows, OnDraw funkcja składowa kontrolki powinna zawierać tylko wywołanie DoSuperclassPaint funkcji składowej, jak w poniższym przykładzie:

void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   DoSuperclassPaint(pdc, rcBounds);
}

Funkcja DoSuperclassPaint składowa zaimplementowana przez COleControlprogram używa procedury okna kontrolki systemu Windows do rysowania kontrolki w określonym kontekście urządzenia w obrębie prostokąta ograniczenia. Dzięki temu kontrolka jest widoczna nawet wtedy, gdy nie jest aktywna.

Uwaga

DoSuperclassPaint Funkcja składowa będzie działać tylko z tymi typami kontrolek, które umożliwiają przekazywanie kontekstu urządzenia jako wParam komunikatu WM_PAINT. Obejmuje to niektóre standardowe kontrolki systemu Windows, takie jak SCROLLBAR i BUTTON, oraz wszystkie typowe kontrolki. W przypadku kontrolek, które nie obsługują tego zachowania, należy podać własny kod, aby prawidłowo wyświetlić nieaktywną kontrolkę.

Obsługa komunikatów okna Emocje

Kontrolki systemu Windows zwykle wysyłają pewne komunikaty okien do okna nadrzędnego. Niektóre z tych komunikatów, takie jak WM_COMMAND, dostarczają powiadomienie o akcji przez użytkownika. Inne, takie jak WM_CTLCOLOR, są używane do uzyskiwania informacji z okna nadrzędnego. Kontrolka ActiveX zwykle komunikuje się z oknem nadrzędnym w inny sposób. Powiadomienia są przekazywane przez wyzwalanie zdarzeń (wysyłanie powiadomień o zdarzeniach), a informacje o kontenerze sterowania są uzyskiwane przez uzyskiwanie dostępu do właściwości otoczenia kontenera. Ponieważ istnieją te techniki komunikacji, kontenery kontrolek ActiveX nie powinny przetwarzać żadnych komunikatów okna wysyłanych przez kontrolkę.

Aby uniemożliwić kontenerowi odbieranie komunikatów okna wysyłanych przez podklasowaną kontrolkę systemu Windows, COleControl tworzy dodatkowe okno, które będzie służyć jako element nadrzędny kontrolki. To dodatkowe okno, nazywane "refleksją", jest tworzone tylko dla kontrolki ActiveX, która podklasuje kontrolkę systemu Windows i ma ten sam rozmiar i położenie co okno sterowania. Okno reflektora przechwytuje niektóre komunikaty okna i wysyła je z powrotem do kontrolki. Kontrolka, w procedurze okna, może następnie przetwarzać te odzwierciedlone komunikaty, wykonując akcje odpowiednie dla kontrolki ActiveX (na przykład wyzwalanie zdarzenia). Zobacz Emocje identyfikatory komunikatów okna, aby uzyskać listę przechwyconych komunikatów systemu Windows i odpowiadające im odzwierciedlone komunikaty.

Kontener kontrolek ActiveX może być przeznaczony do samodzielnego odbicia komunikatu, eliminując konieczność COleControl utworzenia okna refleksora i zmniejszenia obciążenia w czasie wykonywania dla podklasowanej kontrolki systemu Windows. COleControlwykrywa, czy kontener obsługuje tę funkcję, sprawdzając właściwość otoczenia Message Emocje z wartością TRUE.

Aby obsłużyć komunikat z wyświetlonym oknem, dodaj wpis do mapy komunikatów sterujących i zaimplementuj funkcję obsługi. Ponieważ odzwierciedlone komunikaty nie są częścią standardowego zestawu komunikatów zdefiniowanych przez system Windows, widok klas nie obsługuje dodawania takich procedur obsługi komunikatów. Nie jest jednak trudno ręcznie dodać procedurę obsługi.

Aby ręcznie dodać procedurę obsługi komunikatów dla komunikatu z odzwierciedlonego okna, wykonaj następujące czynności:

  • W klasie kontrolnej . Plik H, zadeklaruj funkcję obsługi. Funkcja powinna mieć zwracany typ LRESULT i dwa parametry z typami WPARAM i LPARAM, odpowiednio. Przykład:

    class CMyAxSubCtrl : public COleControl
    {
    
    protected:
       LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam);
    };
    
  • W klasie kontrolnej . Plik CPP, dodaj wpis ON_MESSAGE do mapy komunikatów. Parametry tego wpisu powinny być identyfikatorem komunikatu i nazwą funkcji obsługi. Przykład:

    BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl)
       ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand)
    END_MESSAGE_MAP()
    
  • Również w pliku . Plik CPP, zaimplementuj funkcję składową OnOcmCommand w celu przetworzenia odbitego komunikatu. Parametry wParam i lParam są takie same jak w przypadku oryginalnego komunikatu okna.

Przykład przetwarzania komunikatów odzwierciedlanych można znaleźć w przykładowym przycisku kontrolek ActiveX MFC. Demonstruje on procedurę OnOcmCommand obsługi, która wykrywa kod powiadomienia BN_CLICKED i reaguje, wyzwalając (wysyłając) Click zdarzenie.

Zobacz też

Kontrolki ActiveX MFC