Formanty MFC ActiveX: tworzenie podklasy formantu okna
W tym artykule opisano proces jej rozszerzanie wspólną kontrolą systemu Windows, aby utworzyć formant ActiveX.Rozszerzanie istniejącego systemu Windows formant jest szybko zaprojektować formant ActiveX.Nowy formant będzie miał możliwości subclassed kontroli systemu Windows, takich jak malowanie i odpowiada na kliknięcia myszą.Próbki formantów MFC ActiveX przycisk jest przykładem rozszerzanie sterowania systemu Windows.
Do podklasy sterowania systemu Windows należy wykonać następujące zadania:
Zastąpić funkcji elementów członkowskich IsSubclassedControl i PreCreateWindow z COleControl
Modyfikowanie funkcji członka OnDraw
Obsługiwać komunikaty formantu ActiveX (OCM) odzwierciedlenie do formantu
[!UWAGA]
Znaczną część tej pracy jest wykonywana za użytkownika przez Kreatora formantów ActiveX po wybraniu formantu, aby być podklasą klasy za pomocą Klasy okna nadrzędnego zaznacz listy rozwijanej na Ustawienia sterowania strony.
Zobacz artykuł bazy wiedzy Knowledge Base Q243454 uzyskać więcej informacji na jej rozszerzanie formantu.
Przesłanianie, IsSubclassedControl i PreCreateWindow
Aby zastąpić PreCreateWindow i IsSubclassedControl, Dodaj poniższe wiersze kodu, aby protected sekcji deklaracji klasy kontroli:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
W pliku implementacji sterowania (.CPP), Dodaj poniższe wiersze kodu do wykonania dwóch zastępowanej funkcji:
// 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;
}
Zawiadomienia, że w tym przykładzie okna przycisk formantu jest określona w PreCreateWindow.Jednakże można podklasy wszelkich standardowych formantów systemu Windows.Aby uzyskać więcej informacji na temat standardowych formantów systemu Windows, zobacz kontroli.
Po jej rozszerzanie formantu Windows, warto określić styl określonego okna (WS_) lub rozszerzony styl okna (WS_EX_) flagi stosowaną w tworzeniu okna formantu.Można ustawić wartości dla tych parametrów w PreCreateWindow funkcji składowej modyfikując cs.style i cs.dwExStyle struktury pól.Zmiany w tych polach należy wykonać stosując OR operacji, aby zachować domyślny flagi, które są ustawiane przez klasę COleControl.Na przykład, jeśli formant jest rozszerzanie formant przycisku i formant powinna być wyświetlana jako pole wyboru, wstawić poniższy wiersz kodu do wykonania CSampleCtrl::PreCreateWindow, przed instrukcją zwrotu:
cs.style |= BS_CHECKBOX;
Dodaje tę operację BS_CHECKBOX styl Flaga, pozostawiając styl domyślna wartość flagi (WS_CHILD) klasy COleControl nienaruszone.
Modyfikowanie funkcji członka OnDraw
Jeśli chcesz, aby formant subclassed zachować taki sam wygląd jak odpowiedniego formantu Windows OnDraw funkcji składowej do celów kontroli powinien zawierać tylko wywołanie DoSuperclassPaint funkcji członka, jak w poniższym przykładzie:
void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
DoSuperclassPaint(pdc, rcBounds);
}
DoSuperclassPaint Funkcji składowej, realizowane przez COleControl, korzysta z procedury okna formantu Windows Aby narysować formant w kontekście określonego urządzenia, wewnątrz prostokąta obwiedni.To sprawia, że formant widoczny nawet wtedy, gdy nie jest on aktywny.
[!UWAGA]
DoSuperclassPaint Funkcji składowej będzie działać tylko z tych typów kontroli, które pozwalają kontekstu urządzenia mają być przekazywane jako wParam z WM_PAINT wiadomości.Dotyczy to niektórych standardowych formantów systemu Windows, takich jak pasek PRZEWIJANIA i przycisk, a wszystkie formanty.Dla formantów, które nie obsługują tego zachowania trzeba będzie podać kod w celu prawidłowego wyświetlania formantu nieaktywne.
Obsługa odzwierciedlenie komunikatów okien
Formanty systemu Windows zazwyczaj wysyłają niektórych komunikatów okien do ich okno nadrzędne.Niektóre z tych wiadomości, takie jak WM_COMMAND, powiadamiać ich akcji przez użytkownika.Inne, takie jak WM_CTLCOLOR, służą do uzyskiwania informacji z okna nadrzędnego.Formant ActiveX zazwyczaj komunikuje się z okna nadrzędnego za pomocą innych środków.Powiadomienia są przekazywane przez wyzwalania zdarzenia (wysyłanie powiadomień o zdarzeniach) i informacji o kontenerze formant uzyskuje się przez uzyskaniem dostępu do właściwości otoczenia kontenera.Ponieważ istnieje tych technik komunikacyjnych, pojemniki formantu ActiveX nie oczekuje na przetworzenie okno wiadomości wysyłanych przez formant.
Aby uniemożliwić odbieranie wiadomości okno wysłane przez formant Windows subclassed kontener COleControl tworzy dodatkowe okno, aby służyć jako formantu nadrzędnego.To dodatkowe okno o nazwie "odblaskowe", jest tworzony tylko dla formantu ActiveX, że podklasy systemu Windows kontroli i ma taki sam rozmiar i położenie okna formantu.Okno reflektor przechwytuje niektórych komunikatów okien i wysyła je z powrotem do formantu.Formantu, w jego procedury okna może następnie przetwarzać komunikaty te odbite przez podejmowanie działań właściwe dla formantu ActiveX (na przykład wyzwalania zdarzenia).Zobacz Odzwierciedlenie identyfikatory wiadomości okno listę przechwycone windows wiadomości i odpowiednie odzwierciedlenie wiadomości.
Kontenera ActiveX control mogą być przeznaczone do wykonywania odbicia wiadomości, sama, eliminując potrzebę COleControl do tworzenia okna reflektor i skrócenia czasu wykonywania dodatkowe obciążenie dla formantu subclassed systemu Windows.COleControlwykrywa, czy kontener obsługuje taką możliwość, sprawdzając właściwości otoczenia MessageReflect o wartości TRUE.
Do obsługi wiadomości odzwierciedlenie okna, dodania wpisu do mapy komunikat sterujący i wykonywania funkcji obsługi.Ponieważ odzwierciedlenie wiadomości nie są częścią standardowego zestawu wiadomości zdefiniowane przez system Windows, widok klasy nie obsługuje dodawania takich programów obsługi wiadomości.Jednakże nie jest trudne ręcznie dodać program obsługi.
Aby dodać obsługi wiadomości dla wiadomości odzwierciedlenie okno ręcznie wykonaj następujące czynności:
W klasie kontroli.Plik H zadeklarować funkcji obsługi.Funkcja powinna mieć typem zwracanym przez LRESULT i dwa parametry o typach WPARAM i FIKCYJNYMI, odpowiednio.Na przykład:
class CMyAxSubCtrl : public COleControl { ... protected: LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam); };
W klasie kontroli.CPP plików, dodać ON_MESSAGE wpis do mapy wiadomości.Parametry tego wpisu powinien być identyfikatorem wiadomości i nazwa funkcji obsługi.Na przykład:
BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl) ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand) END_MESSAGE_MAP()
Również w.Plik CPP wdrożenia OnOcmCommand funkcji składowej przetworzyć komunikatu odbite.WParam i fikcyjnymi parametry są takie same, jak okno oryginalnej wiadomości.
Na przykład, jak odzwierciedlenie wiadomości są przetwarzane, odnoszą się do próbki formantów ActiveX biblioteki MFC przycisk.W ten sposób pokazujesz OnOcmCommand program obsługi, który wykrywa BN_CLICKED kod powiadomienia i zdarzenie Click odpowiada poprzez wypalanie (wysyłanie).