TN040: MFC/OLE W miejscu zmiana rozmiaru i powiększania
[!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.
Uwaga ta będzie omówienia kwestii odnoszących się do edycji w miejscu, jak serwer należy wykonać poprawną powiększanie i w miejsce zmiana rozmiaru.Aktywacji w miejscu WYSIWYG koncepcji jest jeden krok dalej w tym kontenerów i serwery współpracować ze sobą i w szczególności interpretować specyfikacji OLE w bardzo taki sam sposób.
Ze względu na bliskie współdziałanie między kontenera i wspieranie w miejscu aktywacji serwera istnieje wiele oczekiwań od użytkownika końcowego, powinny być przechowywane:
Wyświetlanie prezentacji (metaplik, w COleServerItem::OnDraw zastąpić) powinna wyglądać dokładnie takie same jak podczas rysowania do edycji (z wyjątkiem, że narzędzia edycji nie jest widoczna).
Powiększa kontenera, okno serwera należy zbyt!
Pojemniki i serwer powinien być wyświetlany obiektów do edycji, używając tej samej metryki.Oznacza to, przy użyciu trybu mapowania na podstawie liczby logiczne pikseli na cal — nie fizycznych pikseli na cal, przy renderowaniu na urządzenia wyświetlającego.
[!UWAGA]
Ponieważ aktywacja w miejscu stosuje się tylko do elementów, które są osadzane (a nie przyłączane), powiększanie dotyczy tylko obiektów osadzonych.Zobaczysz interfejsów API w obu COleServerDoc i COleServerItem są używane do powiększania.Powodem ten podział jest, że tylko te funkcje, które są ważne dla elementów osadzonych i połączonych są w COleServerItem (umożliwia to wspólne implementacją) i funkcje, które są ważne tylko dla obiektów osadzonych znajdują się w COleServerDoc klasy (z perspektywy serwera jest document który jest osadzony).
Większość obciążenia jest umieszczony na Realizator serwera, serwer musi znać współczynnik powiększenia kontenera i jego interfejs edycji odpowiednio zmodyfikować.Ale jak serwer ustalić współczynnik powiększenia, który używa kontenera?
Wsparcie MFC do powiększania
Bieżący współczynnik powiększenia można ustalić wywołując COleServerDoc::GetZoomFactor.To wywołanie, gdy dokument nie jest aktywny w miejsce zawsze spowoduje współczynnik powiększenia 100% (lub stosunek 1: 1).Wywoływanie podczas, gdy aktywny w miejscu może zwrócić inny niż 100%.
Przykład prawidłowo powiększanie Zobacz przykładowy MFC OLE HIERSVR.Powiększanie HIERSVR jest skomplikowana przez fakt, że wyświetla tekst i tekst, ogólnie rzecz biorąc, nie jest skalowany w sposób liniowy (wskazówki, konwencje typograficzne, projekt szerokości i wysokości wszystkich komplikują sprawy).Nadal, HIERSVR jest uzasadnione odniesienia wykonywania powiększanie poprawnie, a tak jest samouczek MFC BAZGROŁY (krok 7).
COleServerDoc::GetZoomFactorOkreśla współczynnik powiększenia, na podstawie liczby różnych miar dostępnych z kontenera lub z realizacji programu COleServerItem i COleServerDoc klasy.Krótko mówiąc bieżący współczynnik powiększenia ustala się według następującego wzoru:
Position Rectangle (PR) / Container Extent (CE)
POŁOŻENIE prostokąta jest określana przez kontener.Jest ona zwracana do serwera podczas aktywacji w miejscu po COleClientItem::OnGetItemPosition nazywa się i jest aktualizowany, gdy kontener wywoła serwera COleServerDoc::OnSetItemRects (z zaproszeniem do COleClientItem::SetItemRects).
ZAKRES kontenera jest nieco bardziej złożone obliczenia.Jeśli kontener jest nazywany COleServerItem::OnSetExtent (z zaproszeniem do COleClientItem::SetExtent), w zakresie kontenera jest to wartość zamienioną na piksele na podstawie liczby pikseli na cal logiczny.Jeśli kontener nie została wywołana SetExtent (która jest zazwyczaj w przypadku), a następnie w zakresie kontenera jest rozmiar zwrócony z COleServerItem::OnGetExtent.Tak, jeśli kontener nie została wywołana SetExtent, ramach zakłada że jeśli tak pojemnik byłoby wezwały go ze 100% zakresu naturalnych (wartość zwracana z COleServerItem::GetExtent).Inny sposób stwierdzono ramach zakłada kontenera Wyświetla 100% (nie więcej, ani mniej) towaru.
Warto pamiętać, że chociaż COleServerItem::OnSetExtent i COleServerItem::OnGetExtent mają podobne nazwy nie mogą manipulować tego samego atrybutu element.OnSetExtentnazywa się zezwolić serwerowi wiedzieć, jaka część obiektu jest widoczne w kontenerze (niezależnie od współczynnik powiększenia) i OnGetExtent jest wywoływana przez kontener, aby określić idealny rozmiar obiektu.
Patrząc na poszczególnych interfejsów API związanych, można uzyskać lepszy obraz:
COleServerItem::OnGetExtent
Ta funkcja powinna zwrócić "wielkość naturalnych" w HIMETRIC jednostek zapasu.Najlepszym sposobem myśleć wielkości"naturalnych" jest zdefiniowany jako rozmiar, który może się pojawić po wydrukowaniu.Rozmiar zwracane w tym miejscu jest stały dla zawartości określonego towaru, (podobnie jak metaplik, który jest stały dla określonego towaru).Ten rozmiar nie zmienia się podczas powiększania jest stosowany do elementu.Zazwyczaj nie zmienia się podczas kontenera daje element więcej lub mniej miejsca, wywołując OnSetExtent.Przykładem zmiany może być prosty edytor tekstowy z możliwością nie "marża", który Oblewający tekst na podstawie ostatniego stopnia wysłana przez kontener.Jeśli zmienić serwer, serwer prawdopodobnie należy ustawić OLEMISC_RECOMPOSEONRESIZE, bit w rejestrze systemowym (patrz dokumentacji zestawu OLE SDK, aby uzyskać więcej informacji na temat tej opcji).
COleServerItem::OnSetExtent
Funkcja ta jest wywoływana, gdy kontener pokazuje "więcej lub mniej" obiektu.Większość kontenerów nie wywoła to w ogóle.Domyślna implementacja przechowuje ostatnią wartość otrzymanych z kontenera w 'm_sizeExtent', który jest używany w COleServerDoc::GetZoomFactor podczas obliczania wartości zakresu kontenera opisane powyżej.
COleServerDoc::OnSetItemRects
Funkcja ta jest wywoływana tylko wtedy, gdy dokument jest aktywny w miejscu.Jest ona wywoływana podczas kontenera aktualizuje jego pozycję lub odcinania, stosowany do elementu.POŁOŻENIE prostokąta, omówionego powyżej, przewiduje licznik Obliczanie współczynnika powiększenia.Serwer może żądać, że zmieniony pozycji elementu, wywołując COleServerDoc::RequestPositionChange.Kontener może lub nie może odpowiedzieć na to żądanie, wywołując OnSetItemRects (z zaproszeniem do COleServerItem::SetItemRects).
COleServerDoc::OnDraw
Należy zdać sobie sprawę, że utworzony metaplik, nadrzędnym z COleServerItem::OnDraw daje dokładnie ten sam metapliku, niezależnie od bieżącego współczynnik powiększenia.Kontener będą skalowane metapliku, odpowiednio.Jest to różnica między widoku OnDraw i elementu serwera OnDraw.Uchwyty widoku powiększanie, element tworzy tylko zoomable metapliku i pozostawia się do kontenera do odpowiednich powiększanie.
Najlepszym sposobem, aby mieć pewność, że serwer działa poprawnie jest użycie wykonania COleServerDoc::GetZoomFactor , jeśli dokument jest aktywny w miejscu.
Wsparcie MFC zmiany rozmiaru w miejscu
MFC pełni implementuje interfejs zmiany rozmiaru w miejscu, jak opisano w specyfikacji OLE 2.Interfejs użytkownika jest obsługiwany przez COleResizeBar klasy niestandardowy komunikat WM_SIZECHILDi specjalnej obsługi tej wiadomości w COleIPFrameWnd.
Można zaimplementować obsługę różnych tej wiadomości, niż to, co jest przewidziane w ramach.Jak opisano powyżej, ramach pozostawia wyniki w miejscu, zmiana rozmiaru do pojemnika — serwer odpowiada na zmianę współczynnika powiększenia.Jeśli kontener reaguje przez ustawienie zarówno zakres POJEMNIKA i położenie prostokąta podczas przetwarzania jej COleClientItem::OnChangeItemPosition (o nazwie z wywołania COleServerDoc::RequestPositionChange) zmiany rozmiaru w miejscu spowoduje wyświetlanie "więcej lub mniej" elementu w oknie edycji, a następnie.Jeśli kontener reaguje ustawiając właśnie prostokąta pozycji podczas przetwarzania COleClientItem::OnChangeItemPosition, będzie zmienić współczynnik powiększenia i elementu zostaną wyświetlone "powiększony lub".
Serwer można kontrolować (do pewnego stopnia), co się dzieje podczas tej negocjacji.Arkusz kalkulacyjny może być na przykład wybiera pokazać więcej lub mniej komórek, gdy użytkownik zmienia rozmiar okna podczas edycji elementu w miejscu.Edytorze Word może zdecydować się na zmiany "marginesy strony", więc są takie same, jak okno i zawijał tekst do nowego marginesu.Serwery zaimplementować to przez zmianę w zakresie naturalnych (rozmiar zwrócony z COleServerItem::OnGetExtent) po zakończeniu zmiany rozmiaru.Spowoduje to zarówno położenie prostokąta i zakres POJEMNIKA, aby zmienić o tę samą kwotę, powstałe w ten sam współczynnik powiększenia, ale większy lub mniejszy obszar wyświetlania.Dodatkowo, mniej lub bardziej dokumentu będą widoczne w metapliku, generowane przez OnDraw.W przypadku samego dokumentu jest zmiana, gdy użytkownik zmienia rozmiar elementu zamiast po prostu obszar wyświetlania.
Można zaimplementować niestandardowe zmiany rozmiaru i nadal korzystać interfejs użytkownika zapewniany przez COleResizeBar nadrzędnym WM_SIZECHILD wiadomości w sieci COleIPFrameWnd klasy.Aby uzyskać więcej informacji na temat WM_SIZECHILD, zobacz technicznej 24 Uwaga.