Udostępnij za pośrednictwem


Tworzenie programów obsługi podglądu

W tym temacie omówiono określone interfejsy i metody wymagane do utworzenia procedury obsługi w wersji zapoznawczej.

Program obsługi w wersji zapoznawczej musi implementować następujące interfejsy:

Jeśli program obsługi w wersji zapoznawczej obsługuje ustawienia wizualizacji udostępniane przez hosta, takie jak kolor tła i czcionka, musi również zaimplementować następujący interfejs:

W tym temacie założono, że program obsługi podglądu jest zainicjowany za pomocą strumienia i zarejestrowany dla określonego rozszerzenia nazwy pliku.

IInitializeWithStream::Initialize

Przechowuj parametry IStream i trybu, aby można było odczytywać dane elementu, gdy będziesz gotowy do wyświetlenia podglądu elementu. Nie ładuj danych w Inicjowanie. Załaduj dane w IPreviewHandler::DoPreview tuż przed renderowaniem.

IObjectWithSite

IObjectWithSite::SetSite

Zapisz wskaźnik IUnknown, aby uzyskać późniejszy dostęp.

Jeśli obecnie masz odwołanie do obiektu IPreviewHandlerFrame, zwolnij go. Użyj przechowywanego wskaźnika IUnknown, aby wywołać QueryInterface na stronie w celu uzyskania nowego odwołania IPreviewHandlerFrame.

Jeśli obecnie masz tabelę akceleratora, zniszcz ją. Wywołaj IPreviewHandlerFrame::GetWindowContext, aby uzyskać nową tabelę akceleratora. Zapisz tę tabelę. Należy pamiętać, że jest on używany tylko jako lista kluczy akceleratora, które obsługuje ramka. Polecenia we wpisach akceleratora są ignorowane.

IObjectWithSite::GetSite

Zwróć wskaźnik lokacji, cokolwiek to jest.

IOleWindow

IOleWindow::ContextSensitiveHelp

Zwróć E_NOTIMPL dla tej metody.

IOleWindow::GetWindow

Jeśli okno programu obsługi podglądu istnieje obecnie, zwróć HWND tego okna i S_OK. Jeśli okno nie istnieje, zwróć E_FAIL.

IPreviewHandler

IPreviewHandler::SetWindow

Ustaw parametr hwnd tej metody na obiekt nadrzędny HWND Twojego programu obsługującego podgląd. Tę metodę można wywołać wiele razy. Zmień rozmiar podglądu tak, aby był renderowany tylko w obszarze opisanym przez parametr prc.

Jeśli podgląd jest w trakcie renderowania, użyj metody IPreviewHandler::SetWindow, aby zmienić element nadrzędny podglądu. Zmień również obszar, w którym podgląd jest renderowany.

IPreviewHandler::SetRect

Zmień rozmiar podglądu, aby był renderowany tylko w obszarze opisanym przez prc tej metody.

Jeśli podgląd jest w trakcie procesu renderowania, zmień obszar, w którym renderowany jest podgląd.

IPreviewHandler::DoPreview

W tym miejscu wykonywana jest prawdziwa praca. Ponieważ wersja zapoznawcza jest dynamiczna, zawartość podglądu powinna być ładowana tylko wtedy, gdy jest potrzebna. Nie ładuj zawartości podczas inicjowania.

Jeśli okno obsługi podglądu nie istnieje, utwórz je. Okna programu obsługi podglądu powinny być elementami podrzędnymi okna dostarczonego przez IPreviewHandler::SetWindow. Powinny one być rozmiarem dostarczonym przez program IPreviewHandler::SetWindow i IPreviewHandler::SetRect (w zależności od tego, co zostało ostatnio wywołane).

Utworzywszy okno, załaduj dane z IStream, które służyły do zainicjowania procedury obsługi podglądu, i wyrenderuj te dane w oknie obsługi podglądu.

IPreviewHandler::SetFocus

Ta metoda jest wywoływana, gdy fokus przechodzi do okienka odczytu przez akcję związaną z zakładką. Ponieważ można przemieszczać focus jako tabulator do przodu lub do tyłu, użyj obecnego stanu klawisza SHIFT, aby zdecydować, czy pierwszy czy ostatni punkt tabulacji w okienku odczytu powinien mieć ustawioną uwagę.

IPreviewHandler::QueryFocus

Ta metoda powinna wywołać funkcję GetFocus i zwrócić wynik tego wywołania w parametrze phwnd.

IPreviewHandler::TranslateAccelerator

Ta metoda jest wywoływana przez pompę komunikatów procesu obsługi podglądu (czy to prevhost.exe, czy niestandardowy serwer lokalny) w odpowiedzi na naciśnięcia klawiszy przez użytkownika. Programy obsługi w wersji zapoznawczej powinny obsługiwać te naciśnięcia lub przekazywać je do hosta zgodnie z algorytmem opisanym poniżej.

Jednak ponieważ wersje zapoznawcze są tylko do odczytu, dane wejściowe z klawiatury powinny być minimalne, dlatego optymalizacje takie jak ta nie są potrzebne w wielu przypadkach.

Jeśli akcelerator klawiatury przekazany do tej metody za pośrednictwem pompy komunikatów jest akceleratorem akceptowanym przez program obsługi podglądu, należy go przetworzyć i zwrócić S_OK. Jeśli program obsługi nie akceptuje tego akceleratora, komunikat akceleratora może zostać wysłany z powrotem aż do ramki, aby został obsłużony.

Istnieją dwie opcje przekazywania akceleratorów klawiatury z powrotem do ramki:

Najprostszym modelem jest przesyłanie wszystkich nacisków klawiszy do hosta za pomocą IPreviewHandlerFrame::TranslateAccelerator. Odbywa się to w przykładzie procedury obsługi w wersji zapoznawczej dostarczonej z zestawem Sdk (Software Development Kit) systemu Windows. Programy obsługujące podgląd o niskiej integralności muszą używać tego modelu. Jeśli akcelerator nie jest obsługiwany przez program obsługi w wersji zapoznawczej, wywołaj IPreviewHandlerFrame::TranslateAccelerator i zwróć jego wynik.

Drugi model polega na użyciu tabeli akceleratora jako optymalizacji, aby uniknąć wysyłania zbyt wielu naciśnięć klawiszy przez granice procesu.

  1. Po wywołaniu IObjectWithSite::SetSite w module obsługi podglądu należy uzyskać tabelę akceleratora za pomocą IPreviewHandlerFrame::GetWindowContext. (Pamiętaj, aby zwolnić uchwyt do tablicy akceleratora, gdy twój podgląd zostanie zniszczony).
  2. Jeśli akcelerator jest obsługiwany przez program obsługi w wersji zapoznawczej, obsłuż go i zwróć S_OK.
  3. Jeśli akcelerator nie jest obsługiwany przez program obsługi w wersji zapoznawczej, porównaj komunikat przy użyciu IsAccelerator względem uzyskanej tabeli akceleratora.
  4. Jeśli akcelerator pasuje do wpisu w tej tabeli akceleratora, wywołaj IPreviewHandlerFrame::TranslateAccelerator i zwróć jego wynik.
  5. Jeśli akcelerator nie pasuje do żadnego wpisu w tabeli akceleratora, zwróć S_FALSE.

IPreviewHandler::Unload

Po wywołaniu tej metody zatrzymaj renderowanie, zwolnij wszystkie zasoby przydzielone podczas odczytywania danych ze strumienia i zwolnij IStream.

Po wywołaniu tej metody obsługa musi zostać ponownie zainicjalizowana przed próbą wywołania IPreviewHandler::DoPreview.

IPreviewHandlerVisuals

Te metody należy zaimplementować podczas kierowania programu obsługi w wersji zapoznawczej w celu reagowania na schematy kolorów i czcionek hosta. Host wysyła zapytanie do programu obsługi IPreviewHandlerVisuals. Jeśli okaże się, że jest obsługiwany, host zapewnia mu odpowiedni kolor, czcionkę i kolor tekstu.

IPreviewHandlerVisuals::SetBackgroundColor

Zapisz ten kolor i użyj go podczas renderowania, gdy chcesz podać kolor tła. Aby na przykład wypełnić okno, gdy program obsługi renderuje obszar mniejszy niż obszar dostarczony przez IPreviewHandler::SetWindow i IPreviewHandler::SetRect. Należy jednak pamiętać, że nie należy rysować poza obszarem dostarczonym przez te metody.

Jeśli ta metoda jest wywoływana podczas renderowania podglądu, renderowanie powinno zostać uruchomione ponownie przy użyciu tego koloru tła.

IPreviewHandlerVisuals::SetFont

Zapisz te informacje o czcionkach i użyj ich podczas renderowania, gdy chcesz wyświetlić tekst zgodny z bieżącymi ustawieniami systemu Windows Vista.

IPreviewHandlerVisuals::SetTextColor

Zapisz te informacje o kolorze tekstu i użyj ich podczas renderowania, gdy chcesz wyświetlić tekst zgodny z bieżącymi ustawieniami systemu Windows Vista.

Programy obsługi w wersji zapoznawczej i hosta powłoki w wersji zapoznawczej

Jak zarejestrować handler podglądu

Wytyczne dotyczące obsługi wersji zapoznawczej