TN040: MFC/OLE — zmienianie rozmiaru i powiększanie w miejscu
[!UWAGA]
Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.
Uwaga Ta omówi zagadnień odnoszących się do edycji w miejscu i jak serwer powinien osiągnąć prawidłowe powiększanie i zmiana rozmiaru w miejscu.Z aktywacją na miejscu koncepcja WYSIWYG są podejmowane kolejnym krokiem w tym kontenerów i serwery współpracować ze sobą, a w szczególności interpretować specyfikacji OLE w taki sam sposób.
Z powodu bliskiej współpracy między kontener i serwera obsługującego aktywacji w miejscu istnieje szereg oczekiwania użytkownika końcowego, który ma zostać zachowany:
Wyświetlanie prezentacji (metaplik sporządzone w COleServerItem::OnDraw zastąpić) powinien wyglądać dokładnie tak samo jako kiedy jest rysowany do edycji (chyba, że narzędzia do edycji nie są widoczne).
Gdy kontener powiększa, okno serwer powinien zbyt!
Zarówno kontenera, jak i serwer powinien być wyświetlany do edycji przy użyciu metryki sam obiekt.Oznacza to używanie trybu mapowania, na podstawie liczby logiczne pikseli na cal — nie fizycznych pikseli na cal, podczas renderowania na urządzenia wyświetlającego.
[!UWAGA]
Ponieważ aktywacja w miejscu stosuje się tylko do elementów, które są osadzone (niepołączone), powiększanie dotyczy tylko obiekty osadzone.Interfejsy API zobaczą w obu COleServerDoc i COleServerItem służące do zmiany stopnia powiększenia.Powodem tej dychotomii jest, że tylko te funkcje, które są ważne dla elementów połączonych i osadzonych znajdują się w COleServerItem (dzięki temu można mieć wspólnej realizacji) i funkcje, które są prawidłowe tylko dla obiektów osadzonych znajdują się w COleServerDoc klasy (z punktu widzenia serwera, jest document który jest osadzony).
Większość obciążeń jest umieszczony na realizujący serwera, w tym serwer musi znać współczynnik powiększenia kontenera i zmodyfikować jego interfejs edytowania, w stosownych przypadkach.Ale w jaki sposób serwer określa współczynnik powiększenia, który używa kontener?
Obsługa MFC powiększanie
Bieżący współczynnik powiększenia można ustalić wywołując COleServerDoc::GetZoomFactor.To wywołanie, gdy dokument nie jest aktywny w miejscu zawsze spowoduje współczynnik powiększenia 100% (lub stosunek 1:1).Nazywając go, podczas gdy aktywny w miejscu może zwracać coś innego niż 100%.
Na przykład poprawnie powiększanie Zobacz próbki MFC OLE HIERSVR.Powiększanie HIERSVR komplikuje fakt, że wyświetla tekst i tekst, na ogół nie jest skalowany w sposób liniowy (wskazówki, konwencje typograficzne, projekt szerokości i wysokości wszystkich skomplikować sprawy).Mimo to, HIERSVR jest uzasadnione odniesienia dla wykonania powiększanie poprawnie, a więc jest samouczek MFC BAZGROŁY (krok 7).
COleServerDoc::GetZoomFactorOkreśla współczynnik powiększenia na podstawie liczby różnych typów danych dostępnych z kontenera lub z realizacji swojej COleServerItem i COleServerDoc klas.W skrócie bieżące współczynnik powiększenia jest określana 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 wezwaniem do COleClientItem::SetItemRects).
W zakresie kontenera jest nieco bardziej skomplikowane obliczenia.Jeśli kontener jest nazywany COleServerItem::OnSetExtent (z wezwaniem do COleClientItem::SetExtent), a następnie w zakresie kontenera jest to wartość zamienioną na piksele na podstawie liczby pikseli na cal logiczny.Jeśli kontener nie wywołała SetExtent (który jest zazwyczaj w przypadku), a następnie w zakresie kontenera jest rozmiar zwrócony z COleServerItem::OnGetExtent.Tak, jeśli kontener nie wywołana SetExtent, ramach zakłada, że jeśli kontenera wezwał to 100% zakresu, w jakim naturalnych (wartość zwracana z COleServerItem::GetExtent).Stwierdził inny sposób ramach zakłada, że w kontenerze są wyświetlane 100% (nie więcej, nie mniej) towaru.
Ważne jest, aby pamiętać, że chociaż COleServerItem::OnSetExtent i COleServerItem::OnGetExtent mają podobne nazwy, one nie mogą manipulować ani sam atrybut elementu.OnSetExtentnazywa się zezwolić serwerowi wiedzieć, ile obiekt jest widoczny w kontenerze (niezależnie od tego, współczynnik powiększenia) i OnGetExtent jest wywoływany 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 powinien zwrócić "wielkości naturalnej" w HIMETRIC jednostek zapasu.Najlepszym sposobem, aby myśleć o "wielkości naturalnej" jest określenie go jako rozmiar, który może się pojawić podczas drukowania.Rozmiar zwrócony w tym miejscu jest stały dla zawartości określonego towaru, (podobnie jak metapliku, który jest stały dla konkretnego towaru).Ten rozmiar nie zmienia się podczas powiększania jest stosowany do elementu.Zwykle nie zmienia się podczas kontenera daje towaru więcej lub mniej miejsca na przez wywołanie OnSetExtent.Przykładem zmiany może być edytora zwykłego tekstu z możliwością nie "margines", który Oblewający tekst ze względu na zakres Ostatni wysłany przez kontener.Zmiana serwera serwer prawdopodobnie należy ustawić OLEMISC_RECOMPOSEONRESIZE bit w rejestrze systemowym (zobacz w dokumentacji zestawu SDK OLE, aby uzyskać więcej informacji na temat tej opcji).
COleServerItem::OnSetExtent
Ta funkcja jest wywoływana, gdy kontener zawiera "mniej lub bardziej" obiektu.Większość kontenerów nie zgłosi się to w ogóle.Domyślna implementacja przechowuje ostatnią wartość otrzymanych z kontenera w 'm_sizeExtent', który jest używany w COleServerDoc::GetZoomFactor przy obliczaniu wartości zakresu kontenera opisane powyżej.
COleServerDoc::OnSetItemRects
Ta funkcja jest wywoływana tylko wtedy, gdy dokument jest aktywny w miejscu.To jest wywoływane, gdy kontener aktualizuje położenie elementu lub odcinania zastosowane do elementu.PROSTOKĄT pozycji, jak opisano powyżej, przewiduje licznik Obliczanie współczynnika powiększenia.Serwer może żądać, aby położenie elementu można zmienić poprzez wywołanie COleServerDoc::RequestPositionChange.Kontener może lub nie może odpowiedzieć na to żądanie, wywołując OnSetItemRects (z wezwaniem do COleServerItem::SetItemRects).
COleServerDoc::OnDraw
Ważne jest, aby uświadomić sobie, że metaplik tworzone przez zastąpienie COleServerItem::OnDraw produkuje dokładnie samej metaplik, niezależnie od bieżącego współczynnik powiększenia.Kontener będą skalowane metapliku odpowiednio.Jest to istotna różnica między widokiem OnDraw i elementu serwera OnDraw.Uchwyty widoku powiększanie, element po prostu tworzy zoomable metafile i pozostawienie kontenera do odpowiednich powiększania.
Najlepszym sposobem, aby upewnić się, że serwer działa poprawnie jest użycie wykonania COleServerDoc::GetZoomFactor Jeśli dokument jest aktywny w miejscu.
Obsługa MFC zmieniania rozmiaru w miejscu
MFC pełni implementuje interfejs zmiany rozmiaru na miejscu, zgodnie z opisem w specyfikacji OLE 2.Interfejs użytkownika jest obsługiwany przez COleResizeBar klasy niestandardowy komunikat WM_SIZECHILDi specjalnej obsługi 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 miejsce zmiana rozmiaru do pojemnika — Serwer odpowiada na zmianę współczynnika powiększenia.Jeśli kontener reaguje przez ustawienie obu zakres POJEMNIKA i położenie prostokąta podczas przetwarzania jego COleClientItem::OnChangeItemPosition (o nazwie w wyniku wywołania COleServerDoc::RequestPositionChange) spowoduje zmiany rozmiaru w miejscu wyświetlono "mniej lub bardziej" elementu w oknie edycji, a następnie.Jeśli kontener reaguje tylko położenie prostokąta o ustawienie podczas przetwarzania COleClientItem::OnChangeItemPosition, zmieni współczynnik powiększenia i elementu pojawi się "Powiększanie lub pomniejszanie."
Serwer można kontrolować (w pewnym stopniu), co się dzieje podczas tej negocjacji.Arkusz kalkulacyjny może być na przykład wybrać opcję Pokaż więcej lub mniej komórek, gdy użytkownik zmienia rozmiar okna podczas edycji elementu w miejscu.Znaki mogą zdecydować się na zmienianie "marginesy strony", więc są takie same, jak okno i zawinąć tekst do nowych marginesów.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, jak i w zakresie kontenera, aby zmienić o tę samą wartość, co ten sam współczynnik powiększenia, ale większy lub mniejszy obszar wyświetlania.Ponadto, mniej lub bardziej dokumentu będą widoczne w metapliku generowane przez OnDraw.W tym przypadku zmienia się dokumentem, gdy użytkownik zmienia rozmiar elementu, a nie tylko do obszaru wyświetlania.
Można zaimplementować niestandardowe zmiany rozmiaru i nadal dźwigni interfejs użytkownika zapewniany przez COleResizeBar przez zastąpienie WM_SIZECHILD wiadomości w sieci COleIPFrameWnd klasy.Aby uzyskać więcej informacji na temat WM_SIZECHILD, zobacz technicznej 24 Uwaga.