TN040: MFC/OLE W miejscu powiększanie i zmiana rozmiaru

Uwaga ta będzie omówienia kwestii odnoszących się do miejsca edycji, jak serwer należy wykonać poprawną powiększanie i miejsce zmiana rozmiaru. W miejscu aktywacji WYSIWYG pojęcia są podejmowane jeden krok dalej w tym kontenerów i serwery współpracować ze sobą, a w szczególności interpretacji specyfikacja OLE w stopniu tak samo.

Ze względu na bliskie współdziałanie między kontenera i wspieranie w miejscu aktywacji serwera istnieje szereg oczekiwania użytkowników końcowych, które powinny zostać utrzymane:

Uwaga   Ponieważ w miejscu aktywacji stosuje się tylko do elementów, które są osadzane (a nie przyłączane), powiększanie dotyczy tylko do obiektów osadzonych. Zobaczysz interfejsów API zarówno COleServerDoc , jak i COleServerItem , które są używane do powiększania. Powodem ten podział jest, że tylko te funkcje, które są ważne dla połączone i osadzone elementy znajdują się w COleServerItem (dzięki temu można mieć wspólnej realizacji) i funkcje, które są ważne tylko dla obiektów osadzonych znajdują się w klasie COleServerDoc (z perspektywy serwera, jest to dokument , który jest osadzony).

Większość obciążenia jest umieszczony na implementor serwera, serwer musi być świadomy współczynnika powiększenia kontenera i zmodyfikować jego interfejs edycji odpowiednio. Ale w jaki sposób serwer ustalić współczynnik powiększenia, korzystający z pojemnika?

Obsługa MFC powiększanie

Bieżące współczynnik powiększenia można ustalić poprzez wywołanie COleServerDoc::GetZoomFactor. To wywołanie, gdy dokument nie jest aktywny w miejscu zawsze spowoduje się czynnikiem powiększenie 100% (lub stosunek 1: 1). Wywołanie, podczas gdy aktywny w miejscu może zwrócić coś innego niż 100 %.

Aby zapoznać się z przykładem powiększanie poprawnie zobacz przykładowy MFC OLE HIERSVR. Powiększanie: HIERSVR jest skomplikowana przez 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 komplikują sprawy). Nadal, HIERSVR jest uzasadnione odniesienia dla wdrażania, powiększanie poprawnie, a więc jest samouczek MFC BAZGROŁY (krok 7).

COleServerDoc::GetZoomFactor określa współczynnik powiększenia w oparciu o szereg wskaźników w różnych dostępnych z kontenera lub z wprowadzenia w życie Twoje klas COleServerItem i COleServerDoc . Krótko mówiąc bieżący współczynnik powiększenia ustala się według następującego wzoru

Położenie prostokąta (PR) / zakres pojemnika (CE)

PROSTOKĄT stanowisko jest określana przez kontener. To jest zwracany do serwera podczas aktywacji w miejscu COleClientItem::OnGetItemPosition nazywa się i jest aktualizowany, gdy kontenera wywołuje serwer COleServerDoc::OnSetItemRects (z zaproszeniem do COleClientItem::SetItemRects).

ZAKRES kontenera jest nieco bardziej skomplikowane obliczenia. Jeśli kontener wywołał COleServerItem::OnSetExtent (z zaproszeniem do COleClientItem::SetExtent), następnie w zakresie kontenera jest tej wartości konwertowane na piksele na podstawie liczby pikseli na cal logiczny. Jeśli kontener nie zakwestionowała SetExtent, (który jest zazwyczaj w przypadku), zakres kontenera jest rozmiar zwrócony przez COleServerItem::OnGetExtent. Tak Jeśli pojemnik nie zakwestionowała SetExtent, ramy zakłada, że jeśli tak kontenera mogłoby mieć nazwał go z 100% naturalnego zasięgu (wartość zwracany z COleServerItem::GetExtent). Lub w inny sposób, ramy zakłada się, że kontener jest wyświetlanie 100% (mniej więcej, no) elementu.

Należy pamiętać, że chociaż COleServerItem::OnSetExtent i COleServerItem::OnGetExtent mają podobne nazwy, one nie manipulacji samym atrybucie elementu. OnSetExtent nazywa się pozwalających na serwerze wiedzieć, ile obiektu jest widoczna w kontenerze (niezależnie od o współczynnik powiększenia) i OnGetExtent jest wywoływana przez kontener do określenia idealne rozmiar obiektu.

Patrząc na poszczególnych interfejsów API w grę można uzyskać lepszy obraz:

COleServerItem::OnGetExtent

Ta funkcja powinna powrócić "wielkości naturalnej" w HIMETRIC jednostek zapasu. Najlepszym sposobem traktować "wielkości naturalnej" jest zdefiniowany jako rozmiar, który może się pojawić po wydrukowaniu. Rozmiar zwrócone, Oto stała zawartość 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. Zwykle nie zmienia się podczas kontenera daje więcej lub mniej miejsca na element przez wywołanie OnSetExtent. Przykładem zmiany może być prosty edytora z nie możliwość "Marża" Oblewający tekst na podstawie ostatniego stopnia wysyłane przez kontener. Zmiana serwera Serwer prawdopodobnie należy ustawić OLEMISC_RECOMPOSEONRESIZE bitów w rejestrze systemowym (patrz: więcej informacji można znaleźć w dokumentacji zestawu SDK OLE na tej opcji).

COleServerItem::OnSetExtent

Ta funkcja zostaje wywołana, gdy kontenera pokazuje "bardziej lub mniej" obiektu. Większość kontenerów nie wywoła to wcale. Domyślna implementacja przechowuje ostatnią wartość otrzymanych z kontenera w 'm_sizeExtent', używanego 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. Jest ona nazywana po kontenera aktualizuje położenie elementu lub odcinania zastosowane do elementu. POŁOŻENIE prostokąta, omówionego powyżej, przewiduje licznik obliczania współczynnika powiększenia. Serwer może wnioskować, że położenie elementu można zmienić przez wywołanie 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 metapliku utworzone nadrzędnym z COleServerItem::OnDraw produkuje dokładnie te same metaplik, niezależnie od współczynnika bieżącego powiększenia. Kontener będą skalowane metapliku jako właściwe. Jest to ważne rozróżnienie pomiędzy widoku OnDraw i elementu serwera OnDraw. Uchwyty widoku, powiększanie, element po prostu tworzy zoomable metapliku i pozostawia do pojemnika do odpowiednich powiększanie.

Najlepszym sposobem na zapewnienie, że serwer działa poprawnie jest użycie wprowadzenia w życie COleServerDoc::GetZoomFactor , jeśli dokument jest aktywny w miejscu.

Obsługa MFC 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 klasę COleResizeBar , niestandardowy komunikat WM_SIZECHILDi specjalnego traktowania tej wiadomości w COleIPFrameWnd.

Może chcesz zaimplementować obsługę różnych tej wiadomości niż to, co jest przewidziane w ramach. Jak opisano powyżej, ramy pozostawia wyniki w miejscu zmiany rozmiaru do kontenera — serwer odpowiada na zmianę współczynnika powiększenia. Jeśli kontener reaguje ustawiając zarówno zakres POJEMNIKA i zmienić położenie prostokąta podczas przetwarzania jego COleClientItem::OnChangeItemPosition (zwanego od wywołanie COleServerDoc::RequestPositionChange), a następnie w miejscu spowoduje wykazujące "bardziej lub mniej" elementu w oknie edycji. Jeśli kontener reaguje podobnie ustawienie PROSTOKĄT stanowiska podczas przetwarzania COleClientItem::OnChangeItemPosition, zmieni się współczynnikiem powiększenia i zapasu zostaną wyświetlone "w powiększeniu albo pomniejszeniu."

Serwer można kontrolować (do pewnego stopnia), co dzieje się podczas tej negocjacji. Arkusza kalkulacyjnego, na przykład wybiera może wyświetlić więcej lub mniej komórek, gdy użytkownik zmienia rozmiar okna podczas edycji elementu w miejscu. Edytorze Word może zdecydować się na zmianę "marginesy strony", są takie same, jak okno i zawijał tekst do nowego marginesu. Serwery zaimplementowania tej przez zmianę w zakresie naturalnych (rozmiar, w powrócił z COleServerItem::OnGetExtent) po zakończeniu zmiany rozmiaru. Spowoduje to, że zarówno PROSTOKĄT stanowisko, jak i w zakresie kontenera zmienić o tę samą kwotę, w wyniku którego ten sam współczynnik powiększenia, ale większych lub mniejszych wyświetlanie obszaru. Dodatkowo, mniej lub bardziej dokumentu będą widoczne w metapliku generowanych przez OnDraw. W tym przypadku samego dokumentu zmienia się, gdy użytkownik zmienia rozmiar elementu, zamiast po prostu obszar wyświetlania.

Można zaimplementować niestandardowego rozmiaru i nadal korzystać z interfejs użytkownika zapewniany przez COleResizeBar nadrzędnym komunikat WM_SIZECHILD w klasie COleIPFrameWnd . Aby uzyskać więcej informacji na temat WM_SIZECHILDzobacz technicznych Uwaga 24.

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index