Formanty ActiveX MFC: Malowanie formantu ActiveX
W tym artykule opisano proces malowanie formantu ActiveX i jak można zmienić kod programu paint do zoptymalizowania procesu.(Zobacz Optymalizacja rysunku sterowania dla techniki dotyczące optymalizacji rysunku nie ma kontroli indywidualnie przywrócić poprzednio zaznaczonych obiektów GDI.Po wszystkich formantów zostały wystawione, pojemnik można automatycznie przywrócić oryginalne obiekty.)
W tym artykule przykłady z formantu utworzonego przez kreatora formant ActiveX MFC z ustawieniami domyślnymi.Aby uzyskać więcej informacji na temat tworzenia aplikacji sterowania szkielet, za pomocą Kreatora formant ActiveX MFC, zobacz artykuł Kreatora formantów ActiveX MFC.
Omówiono następujące tematy:
Ogólny proces malowanie formantu oraz kod utworzony przez kreatora formantu ActiveX do obsługi malowania
Jak zoptymalizować proces malowania
Jak malowanie formantu przy użyciu metaplików
Proces malowanie formantu ActiveX
Formanty ActiveX są początkowo wyświetlane lub są rysowane, stosują proces malowanie podobne do innych aplikacji przy użyciu MFC, z jednym ważne rozróżnienie: formanty ActiveX mogą być w aktywnym lub nieaktywnym stanie.
Aktywny formant jest reprezentowana w kontenerze formantu ActiveX przez okna podrzędnego.Podobnie jak inne okna, jest odpowiedzialny za malowanie sam po WM_PAINT odebrana wiadomość.Klasa podstawowa dla formantu, COleControl, obsługuje tę wiadomość w jej OnPaint funkcji.Wywołuje to domyślna implementacja OnDraw funkcji formantu.
Nieaktywny formant malowane jest inaczej.Gdy formant jest nieaktywny, jej okno jest niewidoczne lub nieistniejący, więc nie może odbierać wiadomości programu paint.Zamiast tego kontenera kontroli bezpośrednio wywołuje OnDraw funkcji kontroli.To różni się od procesu malowanie aktywny formant, w tym OnPaint nigdy wywoływana jest funkcja Członkowskich.
Jak już wspomniano w poprzednich ustępach, jak formant ActiveX jest aktualizowane zależy od stanu formantu.Jednakże ponieważ w ramach wywołuje OnDraw funkcji składowej w obu przypadkach można dodać większość kodu malowanie w tym funkcji składowej.
OnDraw Członkowskich funkcja obsługuje sterowania malowania.Gdy formant jest nieaktywny, formantu kontenera wywołuje OnDraw, przekazując kontekstu urządzenia sterowania kontenera i współrzędne prostokątny obszar zajmowanych przez formant.
Prostokąt przekazanego przez ramy do OnDraw Członkowskich funkcja zawiera obszar zajęty przez formant.Jeśli formant jest aktywny, jest lewy górny róg (0, 0) i kontekstu urządzenia, przekazywany jest do okna podrzędnego, który zawiera formant.Jeśli formant jest nieaktywny, współrzędnej górnej lewej nie jest koniecznie (0, 0) i kontekstu urządzenia przekazywane jest do kontenera formantu zawierającego formant.
[!UWAGA]
Ważne jest, że modyfikacje do OnDraw nie zależą od prostokąta górny punkt lewy jest równa (0, 0) i rysowania tylko wewnątrz prostokąta przekazany do OnDraw.Jeśli poza obszar prostokąt rysowania, mogą wystąpić nieoczekiwane rezultaty.
Domyślna implementacja przez kreatora formant ActiveX MFC w pliku implementacji sterowania (.CPP), pokazane poniżej prostokąta z białego pędzel maluje i wypełnienia elipsy bieżącym kolorem tła.
void CMyAxUICtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
// TODO: Replace the following code with your own drawing code.
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
}
[!UWAGA]
Podczas malowania formantu, nie należy wprowadzać założenia o stanie kontekstu urządzenia, przesyłanych jako pdc parametr OnDraw funkcji.Czasami kontekstu urządzenia dostarczone przez aplikację kontenera i niekoniecznie nie zostaną zainicjowane do stanu domyślnego.W szczególności jawnie wybrać piór, pędzle, kolory, czcionki i inne zasoby, które zależy od kodu rysunku.
Optymalizacja kodu programu Paint
Po kontroli jest pomyślnie malowanie sobie, następnym krokiem jest optymalizacja OnDraw funkcji.
Domyślna implementacja formantu ActiveX do malowania malowany obszar cały formant.Jest to wystarczające dla formantów proste, ale w wielu przypadkach odowieżenie formant będzie szybciej, jeśli tylko odowieżany fragment, który niezbędnych aktualizacji, zamiast cały formant.
OnDraw Funkcja zapewnia prosta metoda optymalizacji, przekazując rcInvalid, prostokątny obszar formantu, który wymaga ponownego narysowania.Użyj tego obszaru zwykle mniejsze niż obszar cały formant, aby przyspieszyć proces malowania.
Malowanie za pomocą metapliki formantu
W większości przypadków pdc parametr OnDraw funkcji wskazuje na ekranie kontekstu urządzenia (DC).W przypadku drukowania obrazów formantu lub podczas sesji podglądu wydruku, DC, otrzymane dla renderowania jest specjalnego typu nazywany "metapliku DC".W przeciwieństwie do ekranu kontrolera domeny, który niezwłocznie obsługi żądań wysyłanych do niej, metapliku kontroler domeny przechowuje żądania odtwarzać wstecz w późniejszym czasie.Niektóre aplikacje kontenera może także renderowanie obrazu formantu przy użyciu metapliku kontrolera domeny w trybie projektowania.
Metaplik rysunku żądań może dokonywane przez kontenerze poprzez dwie funkcje interfejsu: IViewObject::Draw (funkcja to również może zostać wywołana dla innych niż metafile-, rysunek) i Metoda IDataObject::GetData.Gdy metapliku kontrolera domeny jest przekazywana jako jeden z parametrów, ramy MFC dzwoni do COleControl::OnDrawMetafile.Ponieważ funkcja członka wirtualnego zastąpienie tej funkcji w klasie kontroli do specjalnego przetwarzania.Wywołania domyślne zachowanie COleControl::OnDraw.
Aby upewnić się, że formant można wyciągnąć w kontekstach urządzenia zarówno ekranu i metapliku, należy użyć tylko funkcje składowe obsługiwane zarówno ekranu i metaplik DC.Należy pamiętać, że układ współrzędnych nie może być mierzone w pikselach.
Ponieważ domyślne wykonania OnDrawMetafile wymaga formantu OnDraw działać, należy użyć tylko funkcji elementów członkowskich, które są odpowiednie dla metapliku i kontekstu urządzenia do ekranu, chyba, że można zastąpić OnDrawMetafile.Poniżej przedstawiono podzestaw CDC funkcji elementów członkowskich, używanych zarówno w metapliku i kontekstu urządzenia ekranu.Aby uzyskać więcej informacji na temat tych funkcji, zobacz klasy CDC w Odniesienia MFC.
Łuk |
BibBlt |
Akord |
---|---|---|
Elipsa |
Escape |
ExcludeClipRect |
ExtTextOut |
FloodFill |
IntersectClipRect |
LineTo |
MoveTo |
OffsetClipRgn |
OffsetViewportOrg |
OffsetWindowOrg |
PatBlt |
Pie |
Wielokąt |
Polyline |
PolyPolygon |
RealizePalette |
RestoreDC |
RoundRect |
SaveDC |
ScaleViewportExt |
ScaleWindowExt |
SelectClipRgn |
SelectObject |
SelectPalette |
SetBkColor |
SetBkMode |
SetMapMode |
SetMapperFlags |
SetPixel |
SetPolyFillMode |
SetROP2 |
SetStretchBltMode |
SetTextColor |
SetTextJustification |
SetViewportExt |
SetViewportOrg |
SetWindowExt |
SetWindowORg |
StretchBlt |
TextOut |
|
Oprócz CDC funkcji elementów członkowskich istnieją inne funkcje zgodne w metapliku DC.Obejmują one CPalette::AnimatePalette, CFont::CreateFontIndirecti trzy funkcje Członkowskie CBrush: CreateBrushIndirect, CreateDIBPatternBrush, i CreatePatternBrush.
Funkcje, które nie są rejestrowane w metapliku: DrawFocusRect, DrawIcon, DrawText, ExcludeUpdateRgn, FillRect, FrameRect, GrayString, InvertRect, ScrollDC, i TabbedTextOut.Metaplik DC nie jest faktycznie skojarzone z urządzeniem, SetDIBits, GetDIBits i CreateDIBitmap nie można używać z metapliku DC.SetDIBitsToDevice i StretchDIBits można użyć z metapliku DC jako miejsce docelowe.CreateCompatibleDC, CreateCompatibleBitmap, i CreateDiscardableBitmap nie są znaczące z metapliku DC.
Inny punkt rozważyć podczas korzystania z kontrolera domeny metaplik jest, że układ współrzędnych nie może być mierzone w pikselach.Z tego powodu wszystkie kodu rysunku powinny być dostosowane do mieści się w prostokącie przekazany do OnDraw w rcBounds parametru.Zapobiega przypadkowym malowanie poza kontrolą, ponieważ rcBounds reprezentuje rozmiar okna formantu.
Po wprowadziły metapliku renderowania dla formantu, należy przetestować metaplik za pomocą badania kontenera.Zobacz badania właściwości i zdarzenia z kontenerem Test informacji na temat dostępu kontener testu do.
Aby przetestować metapliku formantu za pomocą badania kontenera
Kontener testu Edytuj menu, kliknij Wstawić nowy formant.
W Wstawić nowy formant zaznacz formant, a następnie kliknij przycisk OK.
Formant pojawi się w kontenerze badania.
Na kontroli menu, kliknij Narysować metapliku.
Pojawia się oddzielne okno, w którym jest wyświetlany metapliku.Można zmienić rozmiar tego okna, aby zobaczyć, jak metaplik formantu wpływa skalowanie.Możesz zamknąć to okno, w dowolnym momencie.