Bagikan melalui


Menerapkan IWICBitmapCodecProgressNotification (Decoder)

IWICBitmapCodecProgressNotification

Ketika codec melakukan operasi I/O seperti CopyPixels pada gambar besar, mungkin perlu waktu beberapa detik atau bahkan menit untuk menyelesaikannya. Ketika pengguna akhir tidak dapat mengganggu operasi yang berjalan lama, mereka mungkin berpikir aplikasi telah digantung. Pengguna akan sering menutup aplikasi, atau bahkan menghidupkan ulang komputer mereka, dalam upaya untuk mendapatkan kembali kontrol komputer mereka ketika aplikasi menjadi tidak responsif.

Antarmuka ini memungkinkan aplikasi untuk menentukan fungsi panggilan balik yang dapat dipanggil codec pada interval tertentu untuk memberi tahu pemanggil tentang kemajuan operasi saat ini. Aplikasi dapat menggunakan fungsi panggilan balik ini untuk menampilkan indikasi kemajuan di antarmuka pengguna untuk memberi tahu pengguna tentang status operasi. Jika pengguna mengklik tombol Batalkan pada kotak dialog Kemajuan , aplikasi mengembalikan WINCODEC_ERR_ABORTED dari fungsi panggilan balik. Ketika ini terjadi, codec harus membatalkan operasi yang ditentukan dan menyebarluaskan HRESULT ini kembali ke pemanggil metode yang melakukan operasi.

Antarmuka ini harus diimplementasikan pada kelas dekoder tingkat kontainer Anda.

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

RegisterProgressNotification

RegisterProgressNotification dipanggil oleh aplikasi untuk mendaftarkan fungsi panggilan balik yang dapat dipanggil codec pada interval yang ditentukan. Parameter pertama, pfnProgressNotification, adalah penunjuk ke fungsi panggilan balik yang harus dipanggil codec secara berkala.

Parameter pvData menunjuk ke beberapa objek yang diinginkan pemanggil codec untuk meneruskan kembali ke fungsi panggilan balik setiap kali fungsi panggilan balik dipanggil. Objek ini mungkin apa saja dan tidak memiliki signifikansi khusus untuk codec.

Parameter dwProgressFlags menentukan kapan codec harus memanggil fungsi panggilan balik. Fungsi OR dapat dilakukan dengan dua enumerasi untuk parameter ini. Enum WICProgressOperation menentukan apakah akan memanggil fungsi panggilan balik selama decoding (WICProgressOperationCopyPixels), pengodean (WICProgerssOperationWritePixels), atau keduanya (WICProgressOperationAll).

enum WICProgressOperation
{
   WICProgressOperationCopyPixels,
   WICProgerssOperationWritePixels,
   WICProgressOperationAll      
};

Codec harus memanggil fungsi panggilan balik secara berkala di seluruh operasi, tetapi pemanggil dapat menentukan persyaratan tertentu. Enum WICProgressNotification menunjukkan pada titik mana dalam operasi untuk memanggil fungsi panggilan balik. Jika pemanggil menentukan WICProgressNotificationBegin, Anda harus memanggilnya di awal operasi (0.0). Jika penelepon tidak menentukan ini, pemanggil bersifat opsional. Demikian juga, jika pemanggil menentukan WICProgerssNotificationEnd, Anda harus memanggilnya ketika operasi selesai (1.0). Jika pemanggil menentukan WICProgressNotificationAll, Anda harus memanggilnya di awal dan akhir, serta pada interval reguler di seluruh operasi. Pemanggil juga dapat menentukan WICProgerssNotificationFrequent, yang menunjukkan bahwa mereka ingin dipanggil kembali pada interval yang sering, mungkin setelah setiap beberapa baris pemindaian. (Pemanggil biasanya akan menggunakan bendera ini hanya untuk gambar yang sangat besar.) Jika tidak, Anda biasanya harus memanggil kembali pada interval sekitar 10 persen kenaikan dari jumlah total baris pemindaian yang akan diproses.

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

Hanya satu fungsi panggilan balik pada satu waktu yang dapat didaftarkan untuk instans decoder atau encoder tertentu. Jika aplikasi memanggil RegisterProgressNotification lebih dari sekali, ganti fungsi panggilan balik yang terdaftar sebelumnya dengan yang baru. Untuk membatalkan pendaftaran panggilan balik, penelepon akan mengatur parameter pfnProgressNotification ke NULL.

PFNProgressNotification

PFNProgressNotification adalah fungsi panggilan balik dengan tanda tangan berikut.

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

Saat Anda memanggil fungsi panggilan balik, gunakan parameter pvData untuk meneruskan kembali pvData yang sama dengan yang ditentukan aplikasi saat mendaftarkan fungsi panggilan balik.

Parameter uFrameNum harus menunjukkan indeks bingkai yang sedang diproses.

Atur parameter operasi ke WICProgressOperationCopyPixels saat decoding dan WICProgressOperationWritePixels saat pengodean.

Parameter dblProgress harus berupa angka antara 0,0 (awal operasi) dan 1,0 (penyelesaian operasi). Nilai harus mencerminkan proporsi baris pemindaian yang sudah diproses relatif terhadap jumlah total baris pemindaian yang akan diproses.

Referensi

ProgressNotificationCallback

IWICBitmapCodecProgressNotification

Konseptual

Menerapkan IWICBitmapDecoder

Menerapkan IWICBitmapSource

Cara Menulis WIC-Enabled CODEC

Gambaran Umum Komponen Pencitraan Windows