Создание компонентов предварительного просмотра
В этой главе описываются, как создать Ваш собственный компонент предварительного просмотра. Перечисление демонстрационного компонента включено.
Обзор
Компоненты предварительного просмотра, создающие предварительные просмотры, имеют тип 'pmak' и подтип, соответствующий тип файла, для которого они создают предварительные просмотры.
Компоненты предварительного просмотра, выводящие на экран предварительные просмотры, имеют тип 'pnot' и подтип, соответствующий тип ресурса, который они выводят на экран.
Можно использовать следующие константы для обращения к кодам запроса для каждой из функций, которые должен поддерживать компонент предварительного просмотра.
enum { |
kPreviewShowDataSelector = 1, /* PreviewShowData */ |
kPreviewMakePreviewSelector = 2, /* PreviewMakePreview */ |
kPreviewMakePreviewReferenceSelector = 3, /* PreviewMakePreviewReference */ |
kPreviewEventSelector = 4 /* PreviewEvent */ |
}; |
Этот раздел представляет пример программы, выводящий на экран компонент предварительного просмотра для дисплея файлов анимации PICS. Сначала это реализует требуемые функции Менеджера компонентов. Тогда это преобразовывает данные изображения PICT в формат для дисплея как предварительный просмотр.
Реализация требуемых функций компонента
Перечисление 5-1 предоставляет диспетчеров компонента для компонента предварительного просмотра вместе с банкой, делают, присваивают версию, открываются, и близко функционирует.
Перечисление 5-1 Реализовывая требуемые функции Менеджера компонентов
typedef struct { |
ComponentInstance self; |
} PICSPreviewRecord, **PICSPreviewGlobals; |
/* entry point for all Component Manager requests */ |
pascal ComponentResult PICSPreviewDispatch |
(ComponentParameters *params, Handle store) |
{ |
OSErr err = badComponentSelector; |
ComponentFunction componentProc = 0; |
switch (params->what) { |
case kComponentOpenSelect: |
componentProc = PICSPreviewOpen; break; |
case kComponentCloseSelect: |
componentProc = PICSPreviewClose; break; |
case kComponentCanDoSelect: |
componentProc = PICSPreviewCanDo; break; |
case kComponentVersionSelect: |
componentProc = PICSPreviewVersion; break; |
case kPreviewShowDataSelector: |
componentProc = PICSPreviewShowData; break; |
} |
if (componentProc) |
err = CallComponentFunctionWithStorage (store, params, |
componentProc); |
return err; |
} |
pascal ComponentResult PICSPreviewCanDo |
(PICSPreviewGlobals store, short ftnNumber) |
{ |
switch (ftnNumber) { |
case kComponentOpenSelect: |
case kComponentCloseSelect: |
case kComponentCanDoSelect: |
case kComponentVersionSelect: |
case kPreviewShowDataSelector: |
return true; |
default: |
return false; |
} |
} |
pascal ComponentResult PICSPreviewVersion |
(PICSPreviewGlobals store) |
{ |
return 0x00010001; |
} |
pascal ComponentResult PICSPreviewOpen (PICSPreviewGlobals store, |
ComponentInstance self) |
{ |
store = (PICSPreviewGlobals)NewHandle |
(sizeof (PICSPreviewRecord)); |
if (!store) return MemError(); |
SetComponentInstanceStorage (self, (Handle)store); |
(**store).self = self; |
return noErr; |
} |
pascal ComponentResult PICSPreviewClose |
(PICSPreviewGlobals store, |
ComponentInstance self) |
{ |
if (store) DisposeHandle ((Handle)store); |
return noErr; |
} |
Отображение данных изображения как предварительный просмотр
Вывести на экран просмотр изображения файла, Ваш PreviewShowData функция вызвана. Перечисление 5-2 включает PICSPreviewShowData функция, предварительно просматривающая файл PICS. Функция загружает первое изображение PICT из файла PICS и использует компонент предварительного просмотра файла PICT для отображения его.
Перечисление 5-2 , Преобразовывающее данные в форму, которая может быть выведена на экран как предварительный просмотр
pascal ComponentResult PICSPreviewShowData( |
PICSPreviewGlobals store, OSType dataType, Handle data, |
const Rect *inHere) |
{ |
OSErr err = noErr; |
short resRef = 0, saveRes = CurResFile(); |
FSSpec theFile; |
Boolean whoCares; |
Handle thePict = nil; |
ComponentInstance ci; |
/* because your component has the pnotComponentNeedsNoCache |
flag set, it should only be called to display files */ |
if (dataType != rAliasType) |
return paramErr; |
/* open up the file to preview */ |
if (err = ResolveAlias (nil, (AliasHandle)data, &theFile, |
&whoCares)) goto bail; |
resRef = FSpOpenResFile (&theFile, fsRdPerm); |
if (err = ResError()) goto bail; |
/* get the first 'PICT' */ |
UseResFile (resRef); |
thePict = Get1IndResource ('PICT', 1); |
if (!thePict) goto bail; |
/* use the PICT preview component to display the preview */ |
if (ci = OpenDefaultComponent (ShowFilePreviewComponentType, 'PICT')) |
{ |
PreviewShowData (ci, 'PICT', thePict, inHere); |
CloseComponent (ci); |
} |
bail: |
if (resRef) CloseResFile (resRef); |
if (thePict) DisposeHandle (thePict); |
UseResFile (saveRes); |
return err; |
} |