共用方式為


實作 IWICBitmapCodecProgressNotification(解碼器)

IWICBitmapCodec進度通知

當編解碼器執行 I/O 作業時,例如在大型圖像上 CopyPixels,可能需要數秒甚至幾分鐘的時間才能完成。 當使用者無法中斷長時間執行的作業時,他們可能會認為應用程式已停止回應。 使用者通常會關閉應用程式,甚至重新啟動其計算機,以嘗試在應用程式變得沒有回應時重新取得其計算機的控制權。

這個介面可讓應用程式指定編解碼器可以在指定間隔呼叫的回呼函式,以通知呼叫者目前作業的進度。 應用程式可以使用這個回呼函式,在使用者介面中顯示進度指示,以通知使用者作業的狀態。 如果使用者按一下 [取消] 按鈕,在 [進度] 對話方塊上,應用程式會從回呼函式中傳回 WINCODEC_ERR_ABORTED。 發生這種情況時,編解碼器必須取消指定的作業,並將此 HRESULT 傳播回執行作業之方法的呼叫端。

此介面應該在您的容器層級譯碼器類別上實作。

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

註冊進度通知

RegisterProgressNotification 是由應用程式叫用,以註冊編解碼器可以在指定間隔呼叫的回呼函式。 第一個參數 pfnProgressNotification,是編解碼器應該定期呼叫的回調函式指標。

pvData 參數指向一個物件,當回呼函式被呼叫時,編解碼器會將該物件傳回給回呼函式。 此物件可能是任何東西,對編解碼器沒有特定的意義。

dwProgressFlags 參數會指定編解碼器何時應該呼叫回呼函式。 OR 函式可以使用此參數的兩個列舉來執行。 WICProgressOperation 列舉指定是否在解碼(WICProgressOperationCopyPixels)、編碼(WICProgressOperationWritePixels),或兩者(WICProgressOperationAll)時呼叫回呼函式。

enum WICProgressOperation
{
   WICProgressOperationCopyPixels,
   WICProgerssOperationWritePixels,
   WICProgressOperationAll      
};

編解碼器應該在整個作業中定期呼叫回調函式,但呼叫端可能會指定特定需求。 WICProgressNotification 列舉類型指出在操作的哪個階段呼叫回呼函數。 如果呼叫端指定 WICProgressNotificationBegin,您必須在作業 (0.0) 開頭呼叫它。 如果呼叫端未指定此專案,則為選擇性。 同樣地,如果呼叫端指定 WICProgersSNotificationEnd,則必須在作業完成時呼叫它 (1.0)。 如果呼叫方指定 WICProgressNotificationAll,您必須在操作開始和結束時呼叫它,並在整個過程中定期間隔地呼叫。 呼叫端可能會指定 WICProgerssNotificationFrequent,這表示他們希望頻繁地接收到回呼通知,也許是每隔幾條掃描線之後回呼一次。 (呼叫端通常會將此旗標用於非常大的影像。否則,您通常應該以大約 10% 遞增的間隔回呼要處理的掃描行總數。

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

一次只能註冊一個回呼函式給特定的譯碼器或編碼器實例。 如果應用程式呼叫 RegisterProgressNotification 一次以上,請將先前註冊的回呼函式取代為新的回呼函式。 若要取消回呼註冊,呼叫端會將 pfnProgressNotification 參數設定為 NULL

PFNProgress 通知

PFNProgressNotification 是具有下列簽名的回調函式。

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

當您叫用回呼函式時,請使用 pvData 參數,將應用程式在註冊回呼函式時指定的相同 pvData 傳回。

uFrameNum 參數應該指出正在處理的框架索引。

在解碼時,將操作參數設定為 WICProgressOperationCopyPixels;在編碼時,設定為 WICProgressOperationWritePixels

dblProgress 參數應該是介於 0.0(作業開頭)和 1.0 之間的數位(作業完成)。 值應該反映已處理之掃描行的比例,相對於要處理的掃描行總數。

參考

ProgressNotificationCallback

IWICBitmapCodecProgressNotification

概念

實作 IWICBitmapDecoder

實作 IWICBitmapSource

如何撰寫 WIC-Enabled CODEC

Windows 映射元件概觀