Udostępnij przez


Implementacja IWICBitmapCodecProgressNotification (Decoder)

IWICBitmapCodecProgressNotification

Gdy kodek wykonuje operację wejścia/wyjścia, taką jak CopyPixels na dużym obrazie, ukończenie może zająć kilka sekund lub nawet minut. Gdy użytkownicy końcowi nie mogą przerwać długotrwałej operacji, mogą myśleć, że aplikacja zawiesiła się. Użytkownicy często zamykają aplikację, a nawet ponownie uruchamiają swoje komputery, próbując odzyskać kontrolę nad komputerem, gdy aplikacja przestanie odpowiadać.

Ten interfejs umożliwia aplikacji określenie funkcji wywołania zwrotnego, którą kodek może wywołać w określonych odstępach czasu, aby powiadomić osobę wywołującą o postępie bieżącej operacji. Aplikacja może użyć tej funkcji wywołania zwrotnego, aby wyświetlić wskazanie postępu w interfejsie użytkownika w celu powiadomienia użytkownika o stanie operacji. Jeśli użytkownik kliknie przycisk Anuluj w oknie dialogowym Postęp, aplikacja zwróci WINCODEC_ERR_ABORTED z funkcji wywołania zwrotnego. W takim przypadku koder kodujący musi anulować określoną operację i propagować tę HRESULT z powrotem do obiektu wywołującego metodę wykonującą operację.

Ten interfejs należy zaimplementować w klasie dekodera na poziomie kontenera.

interface IWICBitmapCodecProgressNotification : public IUnknown
{
    HRESULT RegisterProgressNotification ( 
        PFNProgressNotification pfnProgressNotification,
        LPVOID pvData,
        DWORD dwProgressFlags );
}

RejestrujPowiadomienieOProgresie

RegisterProgressNotification jest wywoływana przez aplikację w celu zarejestrowania funkcji zwrotnej, którą kodek może wywołać w określonych odstępach czasu. Pierwszy parametr, pfnProgressNotification, jest wskaźnikiem do funkcji wywołania zwrotnego, którą kodek powinien wywoływać w regularnych odstępach czasu.

Parametr pvData wskazuje na jakiś obiekt, który wywołujący chce, aby koder przekazał z powrotem do funkcji zwrotnej przy każdym jej wywołaniu. Ten obiekt może być w ogóle dowolny i nie ma szczególnego znaczenia dla kodera.

dwProgressFlags parametr określa, kiedy kodek powinien wywołać funkcję zwrotną. Funkcję OR można wykonać z dwoma wyliczeniami dla tego parametru. Wyliczenie WICProgressOperation określa, czy należy wywołać funkcję zwrotną podczas dekodowania (WICProgressOperationCopyPixels), kodowania (WICProgressOperationWritePixels) lub obu tych operacji (WICProgressOperationAll).

enum WICProgressOperation
{
   WICProgressOperationCopyPixels,
   WICProgerssOperationWritePixels,
   WICProgressOperationAll      
};

Kodek powinien wywoływać funkcję zwrotną w regularnych odstępach czasu podczas operacji, ale obiekt wywołujący może określić pewne wymagania. Wyliczenie WICProgressNotification wskazuje, w którym momencie operacji należy wywołać funkcję zwrotną. Jeśli obiekt wywołujący określa WICProgressNotificationBegin, należy wywołać go na początku operacji (0.0). Jeśli obiekt wywołujący nie określi tego, jest opcjonalny. Podobnie, jeśli obiekt wywołujący określa WICProgerssNotificationEnd, należy wywołać ją po zakończeniu operacji (1.0). Jeśli obiekt wywołujący określa WICProgressNotificationAll, należy wywołać go na początku i na końcu, a także w regularnych odstępach czasu podczas operacji. Obiekt wywołujący może również określić WICProgerssNotificationFrequent, co wskazuje, że chce być wywoływany z powrotem w częstych odstępach czasu, być może po każdym z kilku wierszy skanowania. (Obiekt wywołujący zwykle używa tej flagi tylko dla bardzo dużego obrazu). W przeciwnym razie zwykle należy odwołać się w odstępach wynoszących około 10 procent całkowitej liczby skanowanych linii do przetworzenia.

enum WICProgressNotification
{
   WICProgressNotificationBegin,
   WICProgerssNotificationEnd,
   WICProgerssNotificationFrequent,
   WICProgressNotificationAll
};

Tylko jedna funkcja wywołania zwrotnego może być jednocześnie zarejestrowana dla określonej instancji dekodera lub kodera. Jeśli aplikacja wywołuje RegisterProgressNotification więcej niż raz, zastąp wcześniej zarejestrowaną funkcję wywołania zwrotnego nowym. Aby anulować rejestrację wywołania zwrotnego, obiekt wywołujący ustawi parametr pfnProgressNotificationnull.

PFNProgressNotification

PFNProgressNotification jest funkcją wywołania zwrotnego z następującym podpisem.

typedef HRESULT (*PFNProgressNotification) ( 
   LPVOID pvData,
   ULONG uFrameNum,
   WICProgressOperation operation,
   double dblProgress );

Podczas wywoływania funkcji wywołania zwrotnego użyj parametru pvData, aby przekazać ten sam pvData, który aplikacja określiła podczas rejestrowania funkcji wywołania zwrotnego.

Parametr uFrameNum powinien wskazywać indeks przetwarzanej ramki.

Ustaw parametr operacji na WICProgressOperationCopyPixels podczas dekodowania i WICProgressOperationWritePixels podczas kodowania.

Parametr dblProgress powinien być liczbą z zakresu od 0,0 (początek operacji) do 1.0 (ukończenie operacji). Wartość powinna odzwierciedlać proporcję przetworzonych wierszy skanowania względem całkowitej liczby wierszy skanowania do przetworzenia.

referencyjne

progressNotificationCallback

IWICBitmapCodecProgressNotification

koncepcyjne

Implementowanie IWICBitmapDecoder

Implementowanie IWICBitmapSource

Jak napisać WIC-Enabled kodek

Składnik programu Windows Imaging — omówienie