Bagikan melalui


Tentang Daftar Gambar

Daftar gambar adalah kumpulan gambar dengan ukuran yang sama, yang masing-masing dapat dirujuk oleh indeksnya. Daftar gambar digunakan untuk mengelola kumpulan ikon atau bitmap yang besar secara efisien. Semua gambar dalam daftar gambar terkandung dalam satu bitmap lebar dalam format perangkat layar. Daftar gambar juga dapat menyertakan bitmap monokrom yang berisi masker yang digunakan untuk menggambar gambar secara transparan (gaya ikon).

Microsoft Win32 API menyediakan fungsi dan makro daftar gambar yang memungkinkan Anda membuat dan menghancurkan daftar gambar, menambahkan dan menghapus gambar, mengganti dan menggabungkan gambar, menggambar gambar, dan menyeret gambar. Untuk menggunakan fungsi daftar gambar, sertakan file header kontrol umum dalam file kode sumber Anda dan tautkan dengan pustaka ekspor kontrol umum. Selain itu, sebelum memanggil fungsi daftar gambar apa pun, gunakan fungsi InitCommonControls atau InitCommonControlsEx untuk memastikan bahwa DLL kontrol umum dimuat.

Topik berikut dibahas di bagian ini:

Jenis

Ada dua jenis daftar gambar: nonmasked dan masked. Daftar gambar yang tidak dimasak terdiri dari bitmap warna yang berisi satu atau beberapa gambar. Daftar gambar bertopeng terdiri dari dua bitmap dengan ukuran yang sama. Yang pertama adalah bitmap warna yang berisi gambar, dan yang kedua adalah bitmap monokrom yang berisi serangkaian masker—satu untuk setiap gambar di bitmap pertama.

Ketika gambar yang tidak dimasak digambar, gambar tersebut hanya disalin ke dalam konteks perangkat target; artinya, itu digambar di atas warna latar belakang konteks perangkat yang ada. Ketika gambar bertopeng digambar, bit gambar dikombinasikan dengan bit masker, biasanya menghasilkan area transparan di bitmap tempat warna latar belakang konteks perangkat target ditunjukkan. Ada beberapa gaya menggambar yang dapat Anda tentukan saat menggambar gambar bertopeng. Misalnya, Anda dapat menentukan bahwa gambar dialihkan untuk menunjukkan objek yang dipilih.

Membuat dan Menghancurkan Daftar Gambar

Anda membuat daftar gambar dengan memanggil fungsi ImageList_Create. Parameter termasuk jenis daftar gambar yang akan dibuat, dimensi setiap gambar, dan jumlah gambar yang ingin Anda tambahkan ke daftar. Untuk daftar gambar yang tidak dimasak, fungsi membuat bitmap tunggal yang cukup besar untuk menahan jumlah gambar yang ditentukan dari dimensi yang diberikan. Kemudian membuat konteks perangkat yang kompatibel dengan layar dan memilih bitmap ke dalamnya. Untuk daftar gambar bertopeng, fungsi membuat dua bitmap dan dua konteks perangkat yang kompatibel dengan layar. Ini memilih bitmap gambar ke dalam satu konteks perangkat dan bitmap mask ke yang lain. DLL kontrol umum berisi kode yang dapat dieksekusi untuk fungsi daftar gambar.

Dalam ImageList_Create, Anda menentukan jumlah awal gambar yang akan berada dalam daftar gambar serta jumlah gambar di mana daftar dapat bertambah. Jadi, jika Anda mencoba menambahkan lebih banyak gambar daripada yang Anda tentukan awalnya, daftar gambar secara otomatis tumbuh untuk mengakomodasi gambar baru.

Jika ImageList_Create berhasil, maka akan mengembalikan handel ke jenis HIMAGELIST. Anda menggunakan handel ini di fungsi daftar gambar lain untuk mengakses daftar gambar dan mengelola gambar. Anda dapat menambahkan dan menghapus gambar, menyalin gambar dari satu daftar gambar ke daftar gambar lainnya, dan menggabungkan gambar dari dua daftar gambar yang berbeda. Ketika Anda tidak lagi memerlukan daftar gambar, Anda dapat menghancurkannya dengan menentukan handelnya dalam panggilan ke fungsi ImageList_Destroy.

Menambahkan dan Menghapus Gambar

Anda dapat menambahkan gambar, ikon, atau kursor bitmapped ke daftar gambar. Anda menambahkan gambar bitmapped dengan menentukan handel ke dua bitmap dalam panggilan ke fungsi ImageList_Add. Bitmap pertama berisi satu atau beberapa gambar untuk ditambahkan ke bitmap gambar, dan bitmap kedua berisi masker untuk ditambahkan ke bitmap mask. Untuk daftar gambar yang tidak dimasak, handel bitmap kedua diabaikan; dapat diatur ke NULL.

Fungsi ImageList_AddMasked juga menambahkan gambar bitmapped ke daftar gambar yang ditutupi. Fungsi ini mirip dengan ImageList_Add, kecuali Anda tidak menentukan bitmap mask. Sebagai gantinya, Anda menentukan warna yang digabungkan sistem dengan bitmap gambar untuk secara otomatis menghasilkan masker. Setiap piksel warna yang ditentukan dalam bitmap gambar diubah menjadi hitam, dan bit yang sesuai dalam masker diatur ke 1. Akibatnya, piksel apa pun dalam gambar yang cocok dengan warna yang ditentukan transparan saat gambar digambar.

Makro ImageList_AddIcon menambahkan ikon atau kursor ke daftar gambar. Jika daftar gambar ditutupi, ImageList_AddIcon menambahkan masker yang disediakan dengan ikon atau kursor ke bitmap mask. Jika daftar gambar tidak dikemas, masker untuk ikon atau kursor tidak digunakan saat menggambar gambar.

Anda dapat membuat ikon berdasarkan gambar dan masker dalam daftar gambar dengan menggunakan fungsi ImageList_GetIcon. Fungsi mengembalikan handel ke ikon baru.

ImageList_Add, ImageList_AddMasked, dan ImageList_AddIcon menetapkan indeks ke setiap gambar saat ditambahkan ke daftar gambar. Indeks berbasis nol; artinya, gambar pertama dalam daftar memiliki indeks nol, yang berikutnya memiliki indeks satu, dan sebagainya. Setelah menambahkan satu gambar, fungsi mengembalikan indeks gambar. Ketika lebih dari satu gambar ditambahkan pada satu waktu, fungsi mengembalikan indeks gambar pertama.

Fungsi ImageList_Remove menghapus gambar dari daftar gambar.

Mengganti dan Menggabungkan Gambar

Fungsi ImageList_Replace dan ImageList_ReplaceIcon menggantikan gambar dalam daftar gambar dengan gambar baru. ImageList_Replace mengganti gambar dengan gambar dan masker bitmapped, dan ImageList_ReplaceIcon mengganti gambar dengan ikon atau kursor.

Fungsi ImageList_Merge menggabungkan dua gambar, menyimpan gambar baru dalam daftar gambar baru. Gambar baru dibuat dengan menggambar gambar kedua secara transparan di atas gambar pertama. Masker untuk gambar baru adalah hasil dari melakukan operasi LOGIS ATAU pada bit mask untuk dua gambar yang ada.

Gambar Gambar

Untuk menggambar gambar, Anda menggunakan fungsi ImageList_Draw atau ImageList_DrawEx. Anda menentukan handel ke daftar gambar, indeks gambar yang akan digambar, handel ke konteks perangkat tujuan, lokasi dalam konteks perangkat, dan satu atau beberapa gaya gambar.

Saat Anda menentukan gaya ILD_TRANSPARENT, ImageList_Draw atau ImageList_DrawEx menggunakan proses dua langkah untuk menggambar gambar bertopeng. Pertama, ia melakukan operasi DAN logis pada bit gambar dan bit masker. Kemudian melakukan operasi XOR logis pada hasil operasi pertama dan bit latar belakang konteks perangkat tujuan. Proses ini menciptakan area transparan dalam gambar yang dihasilkan; artinya, setiap bit putih dalam masker menyebabkan bit yang sesuai dalam gambar yang dihasilkan menjadi transparan.

Sebelum menggambar gambar bertopeng pada latar belakang warna solid, Anda harus menggunakan fungsi ImageList_SetBkColor untuk mengatur warna latar belakang daftar gambar ke warna yang sama dengan tujuan. Mengatur warna menghilangkan kebutuhan untuk membuat area transparan dalam gambar dan memungkinkan ImageList_Draw atau ImageList_DrawEx untuk hanya menyalin gambar ke konteks perangkat tujuan, menghasilkan peningkatan performa yang signifikan. Untuk menggambar gambar, tentukan gaya ILD_NORMAL dalam panggilan ke ImageList_Draw atau ImageList_DrawEx.

Anda dapat mengatur warna latar belakang untuk daftar gambar bertopeng kapan saja sehingga menggambar dengan benar pada latar belakang yang solid. Mengatur warna latar belakang ke CLR_NONE menyebabkan gambar digambar secara transparan secara default. Untuk mengambil warna latar belakang daftar gambar, gunakan fungsi ImageList_GetBkColor.

Gaya ILD_BLEND25 dan ILD_BLEND50 menyaring gambar dengan warna sorotan sistem. Gaya ini berguna jika Anda menggunakan gambar bertopeng untuk mewakili objek yang dapat dipilih pengguna. Misalnya, Anda dapat menggunakan gaya ILD_BLEND50 untuk menggambar gambar saat pengguna memilihnya.

Gambar yang tidak dimasak disalin ke konteks perangkat tujuan dengan menggunakan operasi raster SRCCOPY. Warna dalam gambar tampak sama terlepas dari warna latar belakang konteks perangkat. Gaya gambar yang ditentukan dalam ImageList_Draw atau ImageList_DrawEx juga tidak berpengaruh pada tampilan gambar yang tidak dimasak.

Menyeret Gambar

API Win32 mencakup fungsi untuk menyeret gambar di layar. Fungsi seret memindahkan gambar dengan halus, berwarna, dan tanpa flash kursor apa pun. Gambar yang ditutupi dan tidak dimasak dapat diseret.

Fungsi ImageList_BeginDrag memulai operasi seret. Parameter termasuk handel ke daftar gambar, indeks gambar yang akan diseret, dan lokasi hot spot dalam gambar. Hot spot adalah satu piksel yang dikenali oleh fungsi penyeretan sebagai lokasi layar gambar yang tepat. Biasanya, aplikasi mengatur hot spot sehingga bertepatan dengan hot spot kursor mouse. Fungsi ImageList_DragMove memindahkan gambar ke lokasi baru.

Fungsi ImageList_DragEnter mengatur posisi awal gambar seret di dalam jendela dan menggambar gambar pada posisi tersebut. Parameter mencakup handel ke jendela untuk menggambar gambar dan koordinat posisi awal di dalam jendela. Koordinat relatif terhadap sudut kiri atas jendela, bukan area klien. Hal yang sama berlaku untuk semua fungsi penyeretan gambar yang mengambil koordinat sebagai parameter. Ini berarti Anda harus mengimbangi lebar elemen jendela seperti batas, bilah judul, dan bilah menu saat menentukan koordinat. Jika Anda menentukan handel jendela NULL saat memanggil ImageList_DragEnter, fungsi seret menggambar gambar dalam konteks perangkat yang terkait dengan jendela desktop, dan koordinat relatif terhadap sudut kiri atas layar.

Fungsi ImageList_SetDragCursorImage membuat gambar seret baru dengan menggabungkan gambar yang diberikan (biasanya gambar kursor mouse) dengan gambar seret saat ini. Karena fungsi penyeretan menggunakan gambar baru selama operasi seret, Anda harus menggunakan fungsi ShowCursor untuk menyembunyikan kursor mouse aktual setelah memanggil ImageList_SetDragCursorImage. Jika tidak, sistem mungkin tampak memiliki dua kursor mouse selama durasi operasi seret.

Saat aplikasi memanggil ImageList_BeginDrag, sistem membuat daftar gambar internal sementara lalu menyalin gambar seret yang ditentukan ke daftar internal. Anda dapat mengambil handel ke daftar gambar seret sementara dengan menggunakan fungsi ImageList_GetDragImage. Fungsi ini juga mengambil posisi seret saat ini dan offset gambar seret relatif terhadap posisi seret.

Informasi Gambar

Ada sejumlah fungsi yang mengambil informasi dari daftar gambar. Fungsi ImageList_GetImageInfo mengisi struktur IMAGEINFO dengan informasi tentang satu gambar, termasuk gagang bitmap gambar dan mask, jumlah bidang warna dan bit per piksel, dan persegi panjang pembatas gambar dalam bitmap gambar. Anda dapat menggunakan informasi ini untuk memanipulasi bitmap secara langsung untuk gambar. Fungsi ImageList_GetImageCount mengambil jumlah gambar dalam daftar gambar.

Overlay Gambar

Setiap daftar gambar menyertakan daftar indeks yang akan digunakan sebagai overlay. Overlay adalah gambar yang digambar secara transparan di atas gambar lain. Gambar apa pun yang saat ini ada dalam daftar gambar dapat digunakan sebagai overlay. Anda dapat menentukan hingga empat overlay per daftar gambar. Batas ini telah diperluas ke 15 dalam versi 4.71.

Anda menambahkan indeks gambar ke daftar overlay dengan menggunakan fungsi ImageList_SetOverlayImage , menentukan handel ke daftar gambar, indeks gambar yang ada, dan indeks overlay yang diinginkan. Ini, berlaku, memberi tahu daftar gambar bahwa "gambar di indeks x dapat digunakan sebagai overlay, dan saya ingin merujuk ke overlay sebagai indeks overlay y." Indeks overlay berbasis satu daripada berbasis nol karena indeks overlay nol berarti bahwa tidak ada overlay yang akan digunakan.

Anda menentukan overlay saat menggambar gambar dengan fungsi ImageList_Draw atau ImageList_DrawEx. Overlay ditentukan dengan melakukan operasi LOGIS ATAU antara bendera gambar yang diinginkan dan hasil makro INDEXTOOVERLAYMASK. Makro INDEXTOOVERLAYMASK mengambil indeks overlay dan memformatnya untuk dimasukkan dengan bendera untuk fungsi-fungsi ini. Ini akan menggambar gambar dengan overlay yang ditentukan. Contoh berikut menunjukkan bagaimana overlay ditambahkan dan ditentukan saat menggambar gambar.

ImageList_SetOverlayImage(himl, 0, 3);
ImageList_Draw(himl, 1, hdc, 0, 0, ILD_MASK | INDEXTOOVERLAYMASK(3));

Ini akan menggambar gambar 1 dan kemudian melapisi gambar tersebut dengan gambar 0. Karena 3 adalah indeks overlay yang Anda tentukan dalam panggilan ImageList_SetOverlayImage, 3 ditempatkan dalam makro INDEXTOOVERLAYMASK.

Ikon Antialisi 32-Bit

Antialias adalah teknik untuk melembutkan atau mengaburkan tepi tajam. Ini memberikan gambar penampilan yang lebih alami. Daftar gambar di Windows Vista dan Windows 7 mendukung penggunaan ikon dan bitmap antialisi 32-bit. Nilai warna menggunakan 24 bit, dan 8 bit digunakan sebagai saluran alfa pada ikon. Untuk membuat daftar gambar yang dapat menangani gambar 32 bit per piksel (bpp), panggil fungsi ImageList_Create , meneruskan bendera ILC_COLOR32.

Untuk menulis ikon 32-bit dengan benar, Anda harus membuat beberapa gambar untuk setiap ikon, seperti yang ditunjukkan dalam ilustrasi berikut.

illustration showing three sizes of icons for each of three color depths

  • Tiga gambar pertama berada dalam mode 16 warna untuk digunakan dalam mode aman.
  • Tiga ikon berikutnya digunakan dalam mode 256 warna.
  • Tiga ikon terakhir memiliki saluran alfa dan hanya dapat digunakan dalam sistem operasi yang menjalankan warna 24-bit atau lebih tinggi.
  • Urutan gambar dalam format ikon memang penting. Jika pesanan salah, versi Windows yang lebih lama berfungsi dengan buruk saat mengekstrak ikon. Mengekstrak ikon salah dapat menyebabkan kerusakan memori dan penyajian yang tidak tepat.
  • Versi Windows sebelumnya memiliki batas sumber daya 10 ikon.

Catatan

Anda dapat menggunakan alat pihak ketiga untuk menghasilkan file ikon dan bitmap yang berisi saluran alfa. Jika Anda menggunakan LoadImage untuk memuat bitmap 32 bpp yang berisi alfa, Anda perlu menentukan bendera LR_CREATEDIBSECTION.