Fitur Jendela
Gambaran umum ini membahas fitur jendela seperti jenis jendela, status, ukuran, dan posisi.
-
Tipe Jendela
- Windows yang Tumpang Tindih
- Windows Pop-up
-
Windows Anak
- Penempatan
- Kliping
- hubungan dengan Jendela Induk
- Pesan
- Windows berlapis
- Message-Only Windows
- Hubungan Jendela
-
Status Peragaan Jendela
- Jendela Aktif
- Windows yang Dinonaktifkan
- Visibilitas Jendela
- Windows yang Diminimalkan, Dimaksimalkan, dan Dipulihkan
-
Ukuran dan Posisi Jendela
- Ukuran dan Posisi Default
- Ukuran Pelacakan
- Perintah Sistem
- Fungsi Ukuran dan Posisi
- Pesan Ukuran dan Posisi
- Animasi Jendela
- Tata Letak Jendela dan Pencerminan
- Penghancuran Jendela
Tipe Jendela
Bagian ini berisi topik berikut yang menjelaskan jenis jendela.
- Windows yang Tumpang Tindih
- Windows Pop-up
- Windows Anak
- Windows berlapis
- Message-Only Windows
Windows yang Tumpang Tindih
Jendela tumpang tindih adalah jendela tingkat atas (jendela non-anak) yang memiliki bilah judul, batas, dan area klien; ini dimaksudkan untuk berfungsi sebagai jendela utama aplikasi. Ini juga dapat memiliki menu jendela, meminimalkan dan memaksimalkan tombol, dan bilah gulir. Jendela tumpang tindih yang digunakan sebagai jendela utama biasanya mencakup semua komponen ini.
Dengan menentukan gaya WS_OVERLAPPED atau WS_OVERLAPPEDWINDOW dalam fungsiCreateWindowEx, aplikasi membuat jendela yang tumpang tindih. Jika Anda menggunakan gaya WS_OVERLAPPED, jendela memiliki bilah judul dan batas. Jika Anda menggunakan gaya WS_OVERLAPPEDWINDOW, jendela memiliki bilah judul, batas ukuran, menu jendela, dan meminimalkan dan memaksimalkan tombol.
Jendela Pop-up
Jendela pop-up adalah jenis khusus jendela tumpang tindih yang digunakan untuk kotak dialog, kotak pesan, dan jendela sementara lainnya yang muncul di luar jendela utama aplikasi. Bilah judul bersifat opsional untuk jendela pop-up; jika tidak, jendela pop-up sama dengan jendela yang tumpang tindih dari gaya WS_OVERLAPPED.
Anda membuat jendela pop-up dengan menentukan gaya WS_POPUP di CreateWindowEx. Untuk menyertakan bilah judul, tentukan gaya WS_CAPTION. Gunakan gaya WS_POPUPWINDOW untuk membuat jendela pop-up yang memiliki batas dan menu jendela. Gaya WS_CAPTION harus dikombinasikan dengan gaya WS_POPUPWINDOW untuk membuat menu jendela terlihat.
Jendela Anak
Jendela anak memiliki gaya WS_CHILD dan terbatas pada area klien jendela induknya. Aplikasi biasanya menggunakan jendela anak untuk membagi area klien jendela induk menjadi area fungsi. Anda membuat jendela anak dengan menentukan gaya WS_CHILD di fungsiCreateWindowEx.
Jendela anak harus memiliki jendela induk. Jendela induk dapat berupa jendela yang tumpang tindih, jendela pop-up, atau bahkan jendela anak lain. Anda menentukan jendela induk saat memanggil CreateWindowEx. Jika Anda menentukan gaya WS_CHILD di CreateWindowEx tetapi tidak menentukan jendela induk, sistem tidak membuat jendela.
Jendela anak memiliki area klien tetapi tidak ada fitur lain, kecuali jika diminta secara eksplisit. Aplikasi dapat meminta bilah judul, menu jendela, meminimalkan dan memaksimalkan tombol, batas, dan bilah gulir untuk jendela anak, tetapi jendela anak tidak dapat memiliki menu. Jika aplikasi menentukan handel menu, baik saat mendaftarkan kelas jendela anak atau membuat jendela anak, handel menu diabaikan. Jika tidak ada gaya batas yang ditentukan, sistem akan membuat jendela tanpa batas. Aplikasi dapat menggunakan jendela anak tanpa batas untuk membagi area klien jendela induk sambil menjaga pembagian tidak terlihat oleh pengguna.
Bagian ini membahas aspek jendela anak berikut:
- Penempatan
- Kliping
- hubungan dengan Jendela Induk
- Pesan
Posisi
Sistem selalu memposisikan jendela anak relatif terhadap sudut kiri atas area klien jendela induknya. Tidak ada bagian dari jendela anak yang pernah muncul di luar batas jendela induknya. Jika aplikasi membuat jendela anak yang lebih besar dari jendela induk atau memposisikan jendela anak sehingga beberapa atau semua jendela anak meluas di luar batas induk, sistem akan mengklip jendela anak; artinya, bagian di luar area klien jendela induk tidak ditampilkan. Tindakan yang memengaruhi jendela induk juga dapat memengaruhi jendela anak, sebagai berikut.
Jendela Induk | Jendela Anak |
---|---|
Hancur | Dihancurkan sebelum jendela induk dihancurkan. |
Sembunyi | Tersembunyi sebelum jendela induk disembunyikan. Jendela anak hanya terlihat ketika jendela induk terlihat. |
Pindah | Dipindahkan dengan area klien jendela induk. Jendela anak bertanggung jawab untuk melukis area kliennya setelah pemindahan. |
Ditunjukkan | Ditampilkan setelah jendela induk ditampilkan. |
Kliping
Sistem tidak secara otomatis mengklip jendela anak dari area klien jendela induk. Ini berarti jendela induk menggambar jendela anak jika melakukan gambar apa pun di lokasi yang sama dengan jendela anak. Namun, sistem memang mengklip jendela anak dari area klien jendela induk jika jendela induk memiliki gaya WS_CLIPCHILDREN. Jika jendela anak diklip, jendela induk tidak dapat menggambarnya.
Jendela anak dapat tumpang tindih dengan jendela anak lain di area klien yang sama. Jendela anak yang berbagi jendela induk yang sama dengan satu atau beberapa jendela anak lainnya disebut jendela saudara . Jendela saudara dapat menggambar di area klien satu sama lain, kecuali salah satu jendela anak memiliki gaya WS_CLIPSIBLINGS. Jika jendela anak memang memiliki gaya ini, bagian mana pun dari jendela saudaranya yang terletak di dalam jendela anak dipotong.
Jika jendela memiliki gaya WS_CLIPCHILDREN atau WS_CLIPSIBLINGS, sedikit kehilangan performa terjadi. Setiap jendela mengambil sumber daya sistem, sehingga aplikasi tidak boleh menggunakan jendela anak tanpa sembarangan. Untuk performa terbaik, aplikasi yang perlu membagi jendela utamanya secara logis harus melakukannya dalam prosedur jendela jendela utama daripada dengan menggunakan jendela anak.
Hubungan dengan Jendela Induk
Aplikasi dapat mengubah jendela induk jendela anak yang ada dengan memanggil fungsiSetParent. Dalam hal ini, sistem menghapus jendela anak dari area klien jendela induk lama dan memindahkannya ke area klien dari jendela induk baru. Jika SetParent menentukan handel NULL, jendela desktop menjadi jendela induk baru. Dalam hal ini, jendela anak digambar di desktop, di luar batas jendela lain. FungsiGetParentmengambil handel ke jendela induk jendela anak.
Jendela induk melepaskan sebagian area kliennya ke jendela anak, dan jendela anak menerima semua input dari area ini. Kelas jendela tidak perlu sama untuk setiap jendela anak dari jendela induk. Ini berarti bahwa aplikasi dapat mengisi jendela induk dengan jendela anak yang terlihat berbeda dan melakukan tugas yang berbeda. Misalnya, kotak dialog dapat berisi banyak jenis kontrol, masing-masing jendela anak yang menerima berbagai jenis data dari pengguna.
Jendela anak hanya memiliki satu jendela induk, tetapi induk dapat memiliki sejumlah jendela anak. Setiap jendela anak, pada gilirannya, dapat memiliki jendela anak. Dalam rantai jendela ini, setiap jendela anak disebut jendela turunan dari jendela induk asli. Aplikasi menggunakan fungsi IsChild untuk menemukan apakah jendela tertentu adalah jendela anak atau jendela turunan dari jendela induk tertentu.
Fungsi EnumChildWindows menghitung jendela anak dari jendela induk. Kemudian, EnumChildWindows meneruskan handel ke setiap jendela anak ke fungsi panggilan balik yang ditentukan aplikasi. Jendela turunan dari jendela induk yang diberikan juga dijumlahkan.
Pesan
Sistem meneruskan pesan input jendela anak langsung ke jendela anak; pesan tidak diteruskan melalui jendela induk. Satu-satunya pengecualian adalah jika jendela anak telah dinonaktifkan oleh fungsiEnableWindow. Dalam hal ini, sistem meneruskan pesan input apa pun yang akan masuk ke jendela anak ke jendela induk sebagai gantinya. Ini memungkinkan jendela induk untuk memeriksa pesan input dan mengaktifkan jendela anak, jika perlu.
Jendela anak dapat memiliki pengidentifikasi bilangan bulat yang unik. Pengidentifikasi jendela anak penting saat bekerja dengan jendela kontrol. Aplikasi mengarahkan aktivitas kontrol dengan mengiriminya pesan. Aplikasi ini menggunakan pengidentifikasi jendela anak kontrol untuk mengarahkan pesan ke kontrol. Selain itu, kontrol mengirim pesan pemberitahuan ke jendela induknya. Pesan pemberitahuan menyertakan pengidentifikasi jendela anak kontrol, yang digunakan induk untuk mengidentifikasi kontrol mana yang mengirim pesan. Aplikasi menentukan pengidentifikasi jendela anak untuk jenis jendela anak lainnya dengan mengatur parameter hMenu dari fungsi CreateWindowEx ke nilai daripada handel menu.
Windows Berlapis
Menggunakan jendela berlapis dapat secara signifikan meningkatkan performa dan efek visual untuk jendela yang memiliki bentuk kompleks, menganimasikan bentuknya, atau ingin menggunakan efek campuran alfa. Sistem secara otomatis menyusun dan mengecat ulang jendela berlapis dan jendela aplikasi yang mendasar. Akibatnya, jendela berlapis dirender dengan lancar, tanpa kedap-kedap khas wilayah jendela yang kompleks. Selain itu, jendela berlapis dapat tembus sebagian, yaitu alpha-blended.
Untuk membuat jendela berlapis, tentukan gaya jendela WS_EX_LAYERED diperluas saat memanggil fungsi CreateWindowEx, atau panggil fungsi SetWindowLong untuk mengatur WS_EX_LAYERED setelah jendela dibuat. Setelah panggilan CreateWindowEx, jendela berlapis tidak akan terlihat sampai fungsiSetLayeredWindowAttributes atauUpdateLayeredWindow telah dipanggil untuk jendela ini.
Nota
Dimulai dengan Windows 8, WS_EX_LAYERED dapat digunakan dengan jendela anak dan jendela tingkat atas. Versi Windows sebelumnya hanya mendukung WS_EX_LAYERED untuk jendela tingkat atas.
Untuk mengatur tingkat opasitas atau kunci warna transparansi untuk jendela berlapis tertentu, panggil SetLayeredWindowAttributes. Setelah panggilan, sistem mungkin masih meminta jendela untuk melukis ketika jendela ditampilkan atau diubah ukurannya. Namun, karena sistem menyimpan gambar jendela berlapis, sistem tidak akan meminta jendela untuk melukis jika bagian-bagiannya terungkap sebagai akibat dari gerakan jendela relatif di desktop. Aplikasi warisan tidak perlu merestrukturisasi kode lukisan mereka jika mereka ingin menambahkan efek transparansi atau transparansi untuk jendela, karena sistem mengalihkan pengecatan jendela yang disebut SetLayeredWindowAttributes ke dalam memori di luar layar dan mengolahnya kembali untuk mencapai efek yang diinginkan.
Untuk animasi yang lebih cepat dan lebih efisien atau jika alfa per piksel diperlukan, panggil UpdateLayeredWindow. UpdateLayeredWindow harus digunakan terutama ketika aplikasi harus secara langsung menyediakan bentuk dan konten jendela berlapis, tanpa menggunakan mekanisme pengalihan yang disediakan sistem melalui SetLayeredWindowAttributes. Selain itu, menggunakan UpdateLayeredWindow secara langsung menggunakan memori lebih efisien, karena sistem tidak memerlukan memori tambahan yang diperlukan untuk menyimpan gambar jendela yang dialihkan. Untuk efisiensi maksimum dalam menganimasikan jendela, panggil UpdateLayeredWindow untuk mengubah posisi dan ukuran jendela berlapis. Harap dicatat bahwa setelah SetLayeredWindowAttributes dipanggil, panggilan UpdateLayeredWindow berikutnya akan gagal sampai bit gaya lapisan dibersihkan dan diatur lagi.
Pengujian tekan jendela berlapis didasarkan pada bentuk dan transparansi jendela. Ini berarti bahwa area jendela yang diberi kunci warna atau yang nilai alfanya adalah nol akan membiarkan pesan mouse melalui. Namun, jika jendela berlapis memiliki gaya jendela WS_EX_TRANSPARENT diperluas, bentuk jendela berlapis akan diabaikan dan peristiwa mouse akan diteruskan ke jendela lain di bawah jendela berlapis.
Message-Only Windows
Jendela khusus pesan memungkinkan Anda mengirim dan menerima pesan. Ini tidak terlihat, tidak memiliki urutan z, tidak dapat dijumlahkan, dan tidak menerima pesan siaran. Jendela hanya mengirimkan pesan.
Untuk membuat jendela khusus pesan, tentukan konstanta HWND_MESSAGE atau handel ke jendela khusus pesan yang ada di parameter hWndParent dari fungsi CreateWindowEx. Anda juga dapat mengubah jendela yang ada menjadi jendela khusus pesan dengan menentukan HWND_MESSAGE dalam parameter hWndNewParent dari fungsiSetParent.
Untuk menemukan jendela khusus pesan, tentukan HWND_MESSAGE di parameter hwndParent dari fungsiFindWindowEx. Selain itu, FindWindowEx mencari jendela khusus pesan serta jendela tingkat atas jika parameter hwndParent dan hwndChildAfterNULL.
Hubungan Jendela
Ada banyak cara agar jendela dapat berhubungan dengan pengguna atau jendela lain. Jendela mungkin merupakan jendela yang dimiliki, jendela latar depan, atau jendela latar belakang. Jendela juga memiliki urutan z relatif terhadap jendela lain. Untuk informasi selengkapnya, lihat topik berikut ini:
Latar Depan dan Latar Belakang Windows
Setiap proses dapat memiliki beberapa utas eksekusi, dan setiap utas dapat membuat jendela. Utas yang membuat jendela tempat pengguna saat ini bekerja disebut utas latar depan, dan jendela disebut jendela latar depan . Semua utas lainnya adalah utas latar belakang, dan jendela yang dibuat oleh utas latar belakang disebut jendela latar belakang.
Setiap utas memiliki tingkat prioritas yang menentukan jumlah waktu CPU yang diterima utas. Meskipun aplikasi dapat mengatur tingkat prioritas utasnya, biasanya utas latar depan memiliki tingkat prioritas yang sedikit lebih tinggi daripada utas latar belakang. Karena memiliki prioritas yang lebih tinggi, utas latar depan menerima lebih banyak waktu CPU daripada utas latar belakang. Utas latar depan memiliki prioritas dasar normal 9; utas latar belakang memiliki prioritas dasar normal 7.
Pengguna mengatur jendela latar depan dengan mengklik jendela, atau dengan menggunakan kombinasi tombol ALT+TAB atau ALT+ESC. Untuk mengambil handel ke jendela latar depan, gunakan fungsiGetForegroundWindow. Untuk memeriksa apakah jendela aplikasi Anda adalah jendela latar depan, bandingkan handel yang dikembalikan oleh GetForegroundWindow dengan jendela aplikasi Anda.
Aplikasi mengatur jendela latar depan dengan menggunakan fungsisetForegroundWindow.
Sistem membatasi proses mana yang dapat mengatur jendela latar depan. Proses dapat mengatur jendela latar depan hanya jika:
- Semua kondisi berikut ini benar:
- Proses memanggil SetForegroundWindow milik aplikasi desktop, bukan aplikasi UWP atau aplikasi Windows Store yang dirancang untuk Windows 8 atau 8.1.
- Proses latar depan belum menonaktifkan panggilan ke SetForegroundWindow dengan panggilan sebelumnya ke fungsiLockSetForegroundWindow.
- Batas waktu kunci latar depan telah kedaluwarsa (lihat SPI_GETFOREGROUNDLOCKTIMEOUT di SystemParametersInfo).
- Tidak ada menu yang aktif.
- Selain itu, setidaknya salah satu kondisi berikut ini benar:
- Proses panggilan adalah proses latar depan.
- Proses panggilan dimulai oleh proses latar depan.
- Saat ini tidak ada jendela latar depan, dan dengan demikian tidak ada proses latar depan.
- Proses panggilan menerima peristiwa input terakhir.
- Baik proses latar depan atau proses panggilan sedang di-debug.
Dimungkinkan bagi proses untuk ditolak hak untuk mengatur jendela latar depan bahkan jika memenuhi kondisi ini.
Proses yang dapat mengatur jendela latar depan dapat memungkinkan proses lain untuk mengatur jendela latar depan dengan memanggil fungsi AllowSetForegroundWindow, atau dengan memanggil fungsi BroadcastSystemMessage dengan bendera BSF_ALLOWSFW. Proses latar depan dapat menonaktifkan panggilan ke setForegroundWindow dengan memanggil fungsiLockSetForegroundWindow.
Windows yang Dimiliki
Jendela tumpang tindih atau pop-up dapat dimiliki oleh jendela lain yang tumpang tindih atau pop-up. Menjadi milik tempat beberapa batasan pada jendela.
- Jendela yang dimiliki selalu di atas pemiliknya dalam urutan z.
- Sistem secara otomatis menghancurkan jendela yang dimiliki ketika pemiliknya dihancurkan.
- Jendela yang dimiliki disembunyikan ketika pemiliknya diminimalkan.
Hanya jendela pop-up yang tumpang tindih atau dapat menjadi jendela pemilik; jendela anak tidak boleh menjadi jendela pemilik. Aplikasi membuat jendela yang dimiliki dengan menentukan handel jendela pemilik sebagai parameter hwndParent CreateWindowEx saat membuat jendela dengan gaya WS_OVERLAPPED atau WS_POPUP. Parameter hwndParent harus mengidentifikasi jendela pop-up yang tumpang tindih atau tumpang tindih. Jika hwndParent mengidentifikasi jendela anak, sistem menetapkan kepemilikan ke jendela induk tingkat atas jendela anak. Setelah membuat jendela yang dimiliki, aplikasi tidak dapat mentransfer kepemilikan jendela ke jendela lain.
Kotak dialog dan kotak pesan dimiliki jendela secara default. Aplikasi menentukan jendela pemilik saat memanggil fungsi yang membuat kotak dialog atau kotak pesan.
Aplikasi dapat menggunakan fungsiGetWindowdengan bendera GW_OWNER untuk mengambil handel ke pemilik jendela.
Z-Order
z-order jendela menunjukkan posisi jendela di tumpukan jendela yang tumpang tindih. Tumpukan jendela ini berorientasi pada sumbu imajiner, sumbu z, meluas ke luar dari layar. Jendela di bagian atas z-order tumpang tindih dengan semua jendela lainnya. Jendela di bagian bawah urutan z tumpang tindih oleh semua jendela lainnya.
Sistem mempertahankan urutan z dalam satu daftar. Ini menambahkan jendela ke z-order berdasarkan apakah jendela paling atas, jendela tingkat atas, atau jendela anak. Jendela paling atas tumpang tindih dengan semua jendela non-teratas lainnya, terlepas dari apakah jendela tersebut adalah jendela aktif atau latar depan. Jendela paling atas memiliki gaya WS_EX_TOPMOST. Semua jendela paling atas muncul dalam z-order sebelum jendela non-atas. Jendela anak dikelompokkan dengan induknya dalam urutan z.
Ketika aplikasi membuat jendela, sistem menempatkannya di bagian atas z-order untuk jendela dengan jenis yang sama. Anda dapat menggunakan fungsiBringWindowToTop untuk membawa jendela ke bagian atas z-order untuk jendela dengan jenis yang sama. Anda dapat mengatur ulang urutan z dengan menggunakan fungsi SetWindowPos dan DeferWindowPos.
Pengguna mengubah z-order dengan mengaktifkan jendela yang berbeda. Sistem memposisikan jendela aktif di bagian atas z-order untuk jendela dengan jenis yang sama. Ketika jendela datang ke bagian atas z-order, jadi lakukan jendela anaknya. Anda dapat menggunakan fungsiGetTopWindowuntuk mencari semua jendela anak dari jendela induk dan mengembalikan handel ke jendela anak yang tertinggi dalam z-order. FungsiGetNextWindowmengambil handel ke jendela berikutnya atau sebelumnya dalam urutan z.
Status Peragaan Jendela
Pada waktu tertentu, jendela mungkin aktif atau tidak aktif; tersembunyi atau terlihat; dan diminimalkan, dimaksimalkan, atau dipulihkan. Kualitas ini disebut secara kolektif sebagai jendela menunjukkan status. Topik berikut membahas status peragaan jendela:
- Jendela Aktif
- Windows yang Dinonaktifkan
- Visibilitas Jendela
- Windows yang Diminimalkan, Dimaksimalkan, dan Dipulihkan
Jendela Aktif
Jendela aktif adalah jendela tingkat atas aplikasi tempat pengguna saat ini bekerja. Untuk memungkinkan pengguna dengan mudah mengidentifikasi jendela aktif, sistem menempatkannya di bagian atas urutan z dan mengubah warna bilah judul dan batasnya ke warna jendela aktif yang ditentukan sistem. Hanya jendela tingkat atas yang dapat menjadi jendela aktif. Saat pengguna bekerja dengan jendela anak, sistem mengaktifkan jendela induk tingkat atas yang terkait dengan jendela anak.
Hanya satu jendela tingkat atas dalam sistem yang aktif pada satu waktu. Pengguna mengaktifkan jendela tingkat atas dengan mengkliknya (atau salah satu jendela turunannya), atau dengan menggunakan kombinasi tombol ALT+ESC atau ALT+TAB. Aplikasi mengaktifkan jendela tingkat atas dengan memanggil fungsiSetActiveWindow. Fungsi lain dapat menyebabkan sistem mengaktifkan jendela tingkat atas yang berbeda, termasuk SetWindowPos, DeferWindowPos, SetWindowPlacement, dan DestroyWindow. Meskipun aplikasi dapat mengaktifkan jendela tingkat atas yang berbeda kapan saja, untuk menghindari membingungkan pengguna, aplikasi harus melakukannya hanya sebagai respons terhadap tindakan pengguna. Aplikasi menggunakan fungsiGetActiveWindowuntuk mengambil handel ke jendela aktif.
Ketika aktivasi berubah dari jendela tingkat atas dari satu aplikasi ke jendela tingkat atas aplikasi lain, sistem mengirim pesan WM_ACTIVATEAPP ke kedua aplikasi, memberi tahu mereka tentang perubahan tersebut. Ketika aktivasi berubah ke jendela tingkat atas yang berbeda dalam aplikasi yang sama, sistem mengirim kedua jendela pesan WM_ACTIVATE.
Windows Dinonaktifkan
Jendela dapat dinonaktifkan. Jendela dinonaktifkan tidak menerima input keyboard atau mouse dari pengguna, tetapi dapat menerima pesan dari jendela lain, dari aplikasi lain, dan dari sistem. Aplikasi biasanya menonaktifkan jendela untuk mencegah pengguna menggunakan jendela. Misalnya, aplikasi dapat menonaktifkan tombol tekan dalam kotak dialog untuk mencegah pengguna memilihnya. Aplikasi dapat mengaktifkan jendela yang dinonaktifkan kapan saja; mengaktifkan jendela memulihkan input normal.
Secara default, jendela diaktifkan saat dibuat. Aplikasi dapat menentukan gaya WS_DISABLED, namun, untuk menonaktifkan jendela baru. Aplikasi mengaktifkan atau menonaktifkan jendela yang ada dengan menggunakan fungsiEnableWindow. Sistem mengirim pesan WM_ENABLE ke jendela ketika status diaktifkan akan berubah. Aplikasi dapat menentukan apakah jendela diaktifkan dengan menggunakan fungsiIsWindowEnabled.
Ketika jendela anak dinonaktifkan, sistem meneruskan pesan input mouse anak ke jendela induk. Induk menggunakan pesan untuk menentukan apakah akan mengaktifkan jendela anak. Untuk informasi selengkapnya, lihat Input Mouse.
Hanya satu jendela pada satu waktu yang dapat menerima input keyboard; jendela tersebut dikatakan memiliki fokus keyboard. Jika aplikasi menggunakan fungsi EnableWindow untuk menonaktifkan jendela fokus keyboard, jendela akan kehilangan fokus keyboard selain dinonaktifkan. EnableWindow kemudian mengatur fokus keyboard ke NULL, yang berarti tidak ada jendela yang memiliki fokus. Jika jendela anak, atau jendela turunan lainnya, memiliki fokus keyboard, jendela turunan akan kehilangan fokus saat jendela induk dinonaktifkan. Untuk informasi selengkapnya, lihat Input Keyboard.
Visibilitas Jendela
Jendela dapat terlihat atau tersembunyi. Sistem menampilkan jendela terlihat pada layar. Ini menyembunyikan jendela tersembunyi dengan tidak menggambarnya. Jika jendela terlihat, pengguna dapat memberikan input ke jendela dan melihat output jendela. Jika jendela disembunyikan, jendela akan dinonaktifkan secara efektif. Jendela tersembunyi dapat memproses pesan dari sistem atau dari jendela lain, tetapi tidak dapat memproses input dari pengguna atau output tampilan. Aplikasi menetapkan status visibilitas jendela saat membuat jendela. Nantinya, aplikasi dapat mengubah status visibilitas.
Jendela terlihat saat gaya WS_VISIBLE diatur untuk jendela. Secara default, fungsi CreateWindowEx membuat jendela tersembunyi kecuali aplikasi menentukan gaya WS_VISIBLE. Biasanya, aplikasi mengatur gaya WS_VISIBLE setelah membuat jendela untuk menjaga detail proses pembuatan tetap tersembunyi dari pengguna. Misalnya, aplikasi dapat menjaga jendela baru tetap tersembunyi saat menyesuaikan tampilan jendela. Jika gaya WS_VISIBLE ditentukan dalam CreateWindowEx, sistem mengirim pesan WM_SHOWWINDOW ke jendela setelah membuat jendela, tetapi sebelum menampilkannya.
Aplikasi dapat menentukan apakah jendela terlihat dengan menggunakan fungsiIsWindowVisible. Aplikasi dapat menampilkan (membuat terlihat) atau menyembunyikan jendela dengan menggunakanShowWindow , SetWindowPos, DeferWindowPos, atau SetWindowPlacement atau fungsi SetWindowLong. Fungsi-fungsi ini memperlihatkan atau menyembunyikan jendela dengan mengatur atau menghapus gaya WS_VISIBLE untuk jendela. Mereka juga mengirim pesan WM_SHOWWINDOW ke jendela sebelum menampilkan atau menyembunyikannya.
Ketika jendela pemilik diminimalkan, sistem secara otomatis menyembunyikan jendela yang dimiliki terkait. Demikian pula, ketika jendela pemilik dipulihkan, sistem secara otomatis menunjukkan jendela yang dimiliki terkait. Dalam kedua kasus, sistem mengirim pesan WM_SHOWWINDOW ke jendela yang dimiliki sebelum menyembunyikan atau menunjukkannya. Terkadang, aplikasi mungkin perlu menyembunyikan jendela yang dimiliki tanpa harus meminimalkan atau menyembunyikan pemilik. Dalam hal ini, aplikasi menggunakan fungsiShowOwnedPopups. Fungsi ini mengatur atau menghapus gaya WS_VISIBLE untuk semua jendela yang dimiliki dan mengirim pesan WM_SHOWWINDOW ke jendela yang dimiliki sebelum menyembunyikan atau menampilkannya. Menyembunyikan jendela pemilik tidak berpengaruh pada status visibilitas jendela yang dimiliki.
Ketika jendela induk terlihat, jendela anak terkait juga terlihat. Demikian pula, ketika jendela induk disembunyikan, jendela anaknya juga tersembunyi. Meminimalkan jendela induk tidak berpengaruh pada status visibilitas jendela anak; artinya, jendela anak diminimalkan bersama dengan induk, tetapi gaya WS_VISIBLE tidak diubah.
Bahkan jika jendela memiliki gaya WS_VISIBLE, pengguna mungkin tidak dapat melihat jendela di layar; jendela lain mungkin sepenuhnya tumpang tindih atau mungkin telah dipindahkan di luar tepi layar. Selain itu, jendela anak yang terlihat tunduk pada aturan kliping yang ditetapkan oleh hubungan induk-anaknya. Jika jendela induk jendela tidak terlihat, jendela juga tidak akan terlihat. Jika jendela induk bergerak melampaui tepi layar, jendela anak juga bergerak karena jendela anak digambar relatif terhadap sudut kiri atas induk. Misalnya, pengguna dapat memindahkan jendela induk yang berisi jendela anak cukup jauh dari tepi layar sehingga pengguna mungkin tidak dapat melihat jendela anak, meskipun jendela anak dan jendela induknya keduanya memiliki gaya WS_VISIBLE.
Windows yang Diminimalkan, Dimaksimalkan, dan Dipulihkan
Jendela dimaksimalkan adalah jendela yang memiliki gaya WS_MAXIMIZE. Secara default, sistem memperbesar jendela yang dimaksimalkan sehingga memenuhi layar atau, dalam kasus jendela anak, area klien jendela induk. Meskipun ukuran jendela dapat diatur ke ukuran yang sama dari jendela yang dimaksimalkan, jendela yang dimaksimalkan sedikit berbeda. Sistem secara otomatis memindahkan bilah judul jendela ke bagian atas layar atau ke bagian atas area klien jendela induk. Selain itu, sistem menonaktifkan batas ukuran jendela dan kemampuan penempatan jendela bilah judul (sehingga pengguna tidak dapat memindahkan jendela dengan menyeret bilah judul).
Jendela diminimalkan adalah jendela yang memiliki gaya WS_MINIMIZE. Secara default, sistem mengurangi jendela yang diminimalkan ke ukuran tombol taskbar-nya dan memindahkan jendela yang diminimalkan ke taskbar. Jendela yang dipulihkan adalah jendela yang telah dikembalikan ke ukuran dan posisi sebelumnya, yaitu ukuran sebelum diminimalkan atau dimaksimalkan.
Jika aplikasi menentukan gaya WS_MAXIMIZE atau WS_MINIMIZE dalam fungsiCreateWindowEx, jendela awalnya dimaksimalkan atau diminimalkan. Setelah membuat jendela, aplikasi dapat menggunakan fungsiCloseWindowuntuk meminimalkan jendela. Fungsi ArrangeIconicWindows mengatur ikon di desktop, atau mengatur jendela anak yang diminimalkan jendela induk di jendela induk. FungsiOpenIconmemulihkan jendela yang diminimalkan ke ukuran dan posisi sebelumnya.
Fungsi ShowWindow dapat meminimalkan, memaksimalkan, atau memulihkan jendela. Ini juga dapat mengatur visibilitas jendela dan status aktivasi. FungsiSetWindowPlacementmencakup fungsionalitas yang sama dengan ShowWindow , tetapi dapat mengambil alih posisi default jendela yang diminimalkan, dimaksimalkan, dan dipulihkan.
FungsiIsZoomeddanIsIconic menentukan apakah jendela tertentu masing-masing dimaksimalkan atau diminimalkan. FungsiGetWindowPlacementmengambil posisi yang diminimalkan, dimaksimalkan, dan dipulihkan untuk jendela, dan juga menentukan status tampilan jendela.
Ketika sistem menerima perintah untuk memaksimalkan atau memulihkan jendela yang diminimalkan, sistem mengirim pesan WM_QUERYOPEN ke jendela. Jika prosedur jendela mengembalikan FALSE, sistem mengabaikan perintah maksimalkan atau pulihkan.
Sistem secara otomatis mengatur ukuran dan posisi jendela yang dimaksimalkan ke default yang ditentukan sistem untuk jendela yang dimaksimalkan. Untuk mengambil alih default ini, aplikasi dapat memanggil fungsiSetWindowPlacementatau memproses pesan WM_GETMINMAXINFO yang diterima oleh jendela saat sistem akan memaksimalkan jendela. WM_GETMINMAXINFO menyertakan pointer ke strukturMINMAXINFOyang berisi nilai yang digunakan sistem untuk mengatur ukuran dan posisi yang dimaksimalkan. Mengganti nilai-nilai ini akan mengambil alih default.
Ukuran dan Posisi Jendela
Ukuran dan posisi jendela dinyatakan sebagai persegi panjang pembatas, yang diberikan dalam koordinat relatif terhadap layar atau jendela induk. Koordinat jendela tingkat atas relatif terhadap sudut kiri atas layar; koordinat jendela anak relatif terhadap sudut kiri atas jendela induk. Aplikasi menentukan ukuran dan posisi awal jendela saat membuat jendela, tetapi dapat mengubah ukuran dan posisi jendela kapan saja. Untuk informasi selengkapnya, lihat Bentuk Terisi.
Bagian ini berisi topik berikut:
- Ukuran dan Posisi Default
- Ukuran Pelacakan
- Perintah Sistem
- Fungsi Ukuran dan Posisi
- Pesan Ukuran dan Posisi
Ukuran dan Posisi Default
Aplikasi dapat memungkinkan sistem menghitung ukuran atau posisi awal jendela tingkat atas dengan menentukan CW_USEDEFAULT di CreateWindowEx. Jika aplikasi mengatur koordinat jendela ke CW_USEDEFAULT dan tidak membuat jendela tingkat atas lainnya, sistem mengatur posisi jendela baru relatif terhadap sudut kiri atas layar; jika tidak, itu mengatur posisi relatif terhadap posisi jendela tingkat atas yang dibuat aplikasi baru-baru ini. Jika parameter lebar dan tinggi diatur ke CW_USEDEFAULT, sistem menghitung ukuran jendela baru. Jika aplikasi telah membuat jendela tingkat atas lainnya, sistem mendasarkan ukuran jendela baru pada ukuran jendela tingkat atas aplikasi yang terakhir dibuat. Menentukan CW_USEDEFAULT saat membuat anak atau jendela pop-up menyebabkan sistem mengatur ukuran jendela ke ukuran jendela minimum default.
Ukuran Pelacakan
Sistem mempertahankan ukuran pelacakan minimum dan maksimum untuk jendela gaya WS_THICKFRAME; jendela dengan gaya ini memiliki batas ukuran. Ukuran pelacakan minimum adalah ukuran jendela terkecil yang dapat Anda hasilkan dengan menyeret batas ukuran jendela. Demikian pula, ukuran pelacakan maksimum adalah ukuran jendela terbesar yang dapat Anda hasilkan dengan menyeret batas ukuran.
Ukuran pelacakan minimum dan maksimum jendela diatur ke nilai default yang ditentukan sistem saat sistem membuat jendela. Aplikasi dapat menemukan default dan menimpanya dengan memproses pesan WM_GETMINMAXINFO. Untuk informasi selengkapnya, lihat Pesan Ukuran dan Posisi.
Perintah Sistem
Aplikasi yang memiliki menu jendela dapat mengubah ukuran dan posisi jendela tersebut dengan mengirim perintah sistem. Perintah sistem dihasilkan ketika pengguna memilih perintah dari menu jendela. Aplikasi dapat meniru tindakan pengguna dengan mengirim pesan WM_SYSCOMMAND ke jendela. Perintah sistem berikut memengaruhi ukuran dan posisi jendela.
Perintah | Deskripsi |
---|---|
SC_CLOSE | Menutup jendela. Perintah ini mengirimkan pesan WM_CLOSE ke jendela. Jendela melakukan langkah-langkah apa pun yang diperlukan untuk membersihkan dan menghancurkan dirinya sendiri. |
SC_MAXIMIZE | Memaksimalkan jendela. |
SC_MINIMIZE | Meminimalkan jendela. |
SC_MOVE | Memindahkan jendela. |
SC_RESTORE | Memulihkan jendela yang diminimalkan atau dimaksimalkan ke ukuran dan posisi sebelumnya. |
SC_SIZE | Memulai perintah ukuran. Untuk mengubah ukuran jendela, gunakan mouse atau keyboard. |
Fungsi Ukuran dan Posisi
Setelah membuat jendela, aplikasi dapat mengatur ukuran atau posisi jendela dengan memanggil salah satu dari beberapa fungsi berbeda, termasuk SetWindowPlacement, MoveWindow, SetWindowPos, dan DeferWindowPos. SetWindowPlacement mengatur posisi jendela yang diminimalkan, posisi yang dimaksimalkan, ukuran dan posisi yang dipulihkan, dan menampilkan status. Fungsi MoveWindow dan SetWindowPos serupa; keduanya mengatur ukuran atau posisi satu jendela aplikasi. Fungsi SetWindowPos menyertakan sekumpulan bendera yang memengaruhi status peragaan jendela; MoveWindow tidak menyertakan bendera ini. Gunakan fungsi BeginDeferWindowPos, DeferWindowPos, dan EndDeferWindowPos untuk secara bersamaan mengatur posisi sejumlah jendela, termasuk ukuran, posisi, posisi dalam urutan z, dan status tampilkan.
Aplikasi dapat mengambil koordinat persegi panjang pembatas jendela dengan menggunakan fungsi GetWindowRect. GetWindowRect mengisi strukturRECT dengan koordinat sudut kiri atas dan kanan bawah jendela. Koordinat relatif terhadap sudut kiri atas layar, bahkan untuk jendela anak. Fungsi ScreenToClient atau MapWindowPoints memetakan koordinat layar persegi panjang pembatas jendela anak ke koordinat relatif terhadap area klien jendela induk.
Fungsi GetClientRect mengambil koordinat area klien jendela. GetClientRect mengisi strukturRECTdengan koordinat sudut kiri atas dan kanan bawah area klien, tetapi koordinatnya relatif terhadap area klien itu sendiri. Ini berarti koordinat sudut kiri atas area klien selalu (0,0), dan koordinat sudut kanan bawah adalah lebar dan tinggi area klien.
Fungsi CascadeWindows berjendela pada desktop atau kaskade jendela anak dari jendela induk yang ditentukan. Fungsi TileWindows petak peta jendela di desktop atau petak peta jendela anak dari jendela induk yang ditentukan.
Pesan Ukuran dan Posisi
Sistem mengirim pesan WM_GETMINMAXINFO ke jendela yang ukuran atau posisinya akan berubah. Misalnya, pesan dikirim saat pengguna mengklik Pindahkan atau ukuran dari menu jendela atau mengklik batas ukuran atau bilah judul; pesan juga dikirim ketika aplikasi memanggil SetWindowPos untuk memindahkan atau mengukur jendela. WM_GETMINMAXINFO menyertakan penunjuk ke strukturMINMAXINFOyang berisi ukuran dan posisi maksimum default untuk jendela, serta ukuran pelacakan minimum dan maksimum default. Aplikasi dapat mengambil alih default dengan memproses WM_GETMINMAXINFO dan mengatur anggota MINMAXINFO yang sesuai. Jendela harus memiliki gaya WS_THICKFRAME atau WS_CAPTION untuk menerima WM_GETMINMAXINFO. Jendela dengan gaya WS_THICKFRAME menerima pesan ini selama proses pembuatan jendela, serta ketika sedang dipindahkan atau berukuran.
Sistem mengirim pesan WM_WINDOWPOSCHANGING ke jendela yang ukuran, posisi, posisinya dalam urutan z, atau status peragaan akan berubah. Pesan ini mencakup penunjuk ke strukturWINDOWPOS yang menentukan ukuran, posisi, posisi baru jendela dalam urutan z, dan status peragaan. Dengan mengatur anggota WINDOWPOS, aplikasi dapat memengaruhi ukuran, posisi, dan tampilan baru jendela.
Setelah mengubah ukuran jendela, posisi, posisi dalam status z-order, atau show, sistem mengirimkan pesan WM_WINDOWPOSCHANGED ke jendela. Pesan ini mencakup penunjuk untuk WINDOWPOS yang menginformasikan jendela ukuran, posisi, posisi barunya dalam urutan z, dan status tampilkan. Mengatur anggota struktur WINDOWPOS yang diteruskan dengan WM_WINDOWPOSCHANGED tidak berpengaruh pada jendela. Jendela yang harus memproses pesan WM_SIZE dan WM_MOVE harus meneruskan WM_WINDOWPOSCHANGED ke fungsiDefWindowProc; jika tidak, sistem tidak mengirim pesan WM_SIZE dan WM_MOVE ke jendela.
Sistem mengirim pesan WM_NCCALCSIZE ke jendela saat jendela dibuat atau berukuran. Sistem menggunakan pesan untuk menghitung ukuran area klien jendela dan posisi area klien relatif terhadap sudut kiri atas jendela. Jendela biasanya meneruskan pesan ini ke prosedur jendela default; namun, pesan ini dapat berguna dalam aplikasi yang menyesuaikan area nonkelola jendela atau mempertahankan bagian area klien saat jendela berukuran. Untuk informasi selengkapnya, lihat Lukis dan Gambar.
Animasi Jendela
Anda dapat menghasilkan efek khusus saat menampilkan atau menyembunyikan jendela dengan menggunakan fungsiAnimateWindow. Ketika jendela dianimasikan dengan cara ini, sistem akan menggulung, menggeser, atau memudarkan jendela, tergantung pada bendera yang Anda tentukan dalam panggilan ke AnimateWindow.
Secara default, sistem menggunakan animasi roll . Dengan efek ini, jendela tampaknya bergulir terbuka (memperlihatkan jendela) atau gulung tertutup (menyembunyikan jendela). Anda dapat menggunakan parameter dwFlags untuk menentukan apakah jendela bergulir secara horizontal, vertikal, atau diagonal.
Saat Anda menentukan bendera AW_SLIDE, sistem menggunakan animasi slide . Dengan efek ini, jendela tampak meluncur ke tampilan (memperlihatkan jendela) atau geser keluar dari tampilan (menyembunyikan jendela). Anda dapat menggunakan parameter dwFlags untuk menentukan apakah jendela slide secara horizontal, vertikal, atau diagonal.
Saat Anda menentukan bendera AW_BLEND, sistem menggunakan fade alpha-blended.
Anda juga dapat menggunakan bendera AW_CENTER untuk membuat jendela tampak menciutkan ke dalam atau memperluas ke luar.
Tata Letak dan Pencerminan Jendela
Tata letak jendela menentukan bagaimana teks dan objek Windows Graphics Device Interface (GDI) ditata dalam konteks jendela atau perangkat (DC). Beberapa bahasa, seperti Inggris, Prancis, dan Jerman, memerlukan tata letak kiri-ke-kanan (LTR). Bahasa lain, seperti Arab dan Ibrani, memerlukan tata letak kanan-ke-kiri (RTL). Tata letak jendela berlaku untuk teks tetapi juga memengaruhi elemen GDI jendela lainnya, termasuk bitmap, ikon, lokasi asal, tombol, kontrol pohon berjenjang, dan apakah koordinat horizontal meningkat saat Anda pergi ke kiri atau kanan. Misalnya, setelah aplikasi mengatur tata letak RTL, asal diposisikan di tepi kanan jendela atau perangkat, dan angka yang mewakili koordinat horizontal meningkat saat Anda bergerak ke kiri. Namun, tidak semua objek dipengaruhi oleh tata letak jendela. Misalnya, tata letak untuk kotak dialog, kotak pesan, dan konteks perangkat yang tidak terkait dengan jendela, seperti metafile dan DC printer, harus ditangani secara terpisah. Spesifik untuk ini disebutkan nanti dalam topik ini.
Fungsi jendela memungkinkan Anda menentukan atau mengubah tata letak jendela dalam versi Windows Arab dan Ibrani. Perhatikan bahwa mengubah ke tata letak RTL (juga dikenal sebagai pencerminan) tidak didukung untuk jendela yang memiliki gaya CS_OWNDC atau untuk DC dengan mode grafik GM_ADVANCED.
Secara default, tata letak jendela kiri ke kanan (LTR). Untuk mengatur tata letak jendela RTL, panggil CreateWindowEx dengan gaya WS_EX_LAYOUTRTL. Juga secara default, jendela anak (yaitu, yang dibuat dengan gaya WS_CHILD dan dengan parameter hWnd induk yang valid dalam panggilan ke CreateWindow atau CreateWindowEx) memiliki tata letak yang sama dengan induknya. Untuk menonaktifkan pewarisan pencerminan ke semua jendela anak, tentukan WS_EX_NOINHERITLAYOUT dalam panggilan ke CreateWindowEx. Perhatikan, pencerminan tidak diwariskan oleh jendela yang dimiliki (yang dibuat tanpa gaya WS_CHILD) atau yang dibuat dengan parameter hWnd induk di CreateWindowEx diatur ke NULL. Untuk menonaktifkan pewarisan pencerminan untuk jendela individual, proses pesan WM_NCCREATE denganGetWindowLong dan SetWindowLong untuk menonaktifkan bendera WS_EX_LAYOUTRTL. Pemrosesan ini selain apa pun pemrosesan lain yang diperlukan. Fragmen kode berikut menunjukkan bagaimana hal ini dilakukan.
SetWindowLong (hWnd,
GWL_EXSTYLE,
GetWindowLong(hWnd,GWL_EXSTYLE) & ~WS_EX_LAYOUTRTL))
Anda dapat mengatur tata letak default ke RTL dengan memanggil SetProcessDefaultLayout(LAYOUT_RTL). Semua jendela yang dibuat setelah panggilan akan dicerminkan, tetapi jendela yang ada tidak terpengaruh. Untuk menonaktifkan pencerminan default, panggil SetProcessDefaultLayout(0).
Perhatikan, SetProcessDefaultLayout mencerminkan DC hanya dari jendela cermin. Untuk mencerminkan DC apa pun, panggil SetLayout(hdc, LAYOUT_RTL). Untuk informasi selengkapnya, lihat diskusi tentang mencerminkan konteks perangkat yang tidak terkait dengan jendela, yang muncul nanti dalam topik ini.
Bitmap dan ikon di jendela cermin juga dicerminkan secara default. Namun, tidak semua ini harus dicerminkan. Misalnya, mereka yang memiliki teks, logo bisnis, atau jam analog tidak boleh dicerminkan. Untuk menonaktifkan pencerminan bitmap, panggilSetLayoutdengan bit LAYOUT_BITMAPORIENTATIONPRESERVED diatur dalam dwLayout. Untuk menonaktifkan pencerminan di DC, panggil SetLayout(hdc, 0).
Untuk mengkueri tata letak default saat ini, panggil GetProcessDefaultLayout. Setelah berhasil mengembalikan, pdwDefaultLayout berisi LAYOUT_RTL atau 0. Untuk mengkueri pengaturan tata letak konteks perangkat, panggil GetLayout. Setelah berhasil mengembalikan, GetLayout mengembalikan DWORD yang menunjukkan pengaturan tata letak dengan pengaturan LAYOUT_RTL dan bit LAYOUT_BITMAPORIENTATIONPRESERVED.
Setelah jendela dibuat, Anda mengubah tata letak menggunakan fungsi SetWindowLong. Misalnya, ini diperlukan ketika pengguna mengubah bahasa antarmuka pengguna dari jendela yang ada dari Arab atau Ibrani ke Jerman. Namun, saat mengubah tata letak jendela yang ada, Anda harus membatalkan dan memperbarui jendela untuk memastikan bahwa konten jendela semuanya digambar pada tata letak yang sama. Contoh kode berikut berasal dari kode sampel yang mengubah tata letak jendela sesuai kebutuhan:
// Using ANSI versions of GetWindowLong and SetWindowLong because Unicode
// is not needed for these calls
lExStyles = GetWindowLongA(hWnd, GWL_EXSTYLE);
// Check whether new layout is opposite the current layout
if (!!(pLState -> IsRTLLayout) != !!(lExStyles & WS_EX_LAYOUTRTL))
{
// the following lines will update the window layout
lExStyles ^= WS_EX_LAYOUTRTL; // toggle layout
SetWindowLongA(hWnd, GWL_EXSTYLE, lExStyles);
InvalidateRect(hWnd, NULL, TRUE); // to update layout in the client area
}
Dalam pencerminan, Anda harus berpikir dalam hal "dekat" dan "jauh" alih-alih "kiri" dan "kanan". Kegagalan untuk melakukannya dapat menyebabkan masalah. Salah satu praktik pengodean umum yang menyebabkan masalah di jendela cermin terjadi saat pemetaan antara koordinat layar dan koordinat klien. Misalnya, aplikasi sering menggunakan kode yang mirip dengan yang berikut ini untuk memosisikan kontrol di jendela:
// DO NOT USE THIS IF APPLICATION MIRRORS THE WINDOW
// get coordinates of the window in screen coordinates
GetWindowRect(hControl, (LPRECT) &rControlRect);
// map screen coordinates to client coordinates in dialog
ScreenToClient(hDialog, (LPPOINT) &rControlRect.left);
ScreenToClient(hDialog, (LPPOINT) &rControlRect.right);
Ini menyebabkan masalah dalam pencerminan karena tepi kiri persegi panjang menjadi tepi kanan di jendela cermin, dan sebaliknya. Untuk menghindari masalah ini, ganti panggilanScreenToClientdengan panggilan ke MapWindowPoints sebagai berikut:
// USE THIS FOR MIRRORING
GetWindowRect(hControl, (LPRECT) &rControlRect);
MapWindowPoints(NULL, hDialog, (LPPOINT) &rControlRect, 2)
Kode ini berfungsi karena, pada platform yang mendukung pencerminan, MapWindowPoints dimodifikasi untuk menukar koordinat titik kiri dan kanan saat jendela klien dicerminkan. Untuk informasi selengkapnya, lihat bagian Keterangan dari MapWindowPoints.
Praktik umum lain yang dapat menyebabkan masalah di jendela cermin adalah memosisikan objek di jendela klien menggunakan offset dalam koordinat layar alih-alih koordinat klien. Misalnya, kode berikut menggunakan perbedaan koordinat layar saat posisi x dalam koordinat klien untuk memosisikan kontrol dalam kotak dialog.
// OK if LTR layout and mapping mode of client is MM_TEXT,
// but WRONG for a mirrored dialog
RECT rdDialog;
RECT rcControl;
HWND hControl = GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hDlg, &rcDialog); // gets rect in screen coordinates
GetWindowRect(hControl, &rcControl);
MoveWindow(hControl,
rcControl.left - rcDialog.left, // uses x position in client coords
rcControl.top - rcDialog.top,
nWidth,
nHeight,
FALSE);
Kode ini baik-baik saja ketika jendela dialog memiliki tata letak kiri-ke-kanan (LTR) dan mode pemetaan klien MM_TEXT, karena posisi x baru dalam koordinat klien sesuai dengan perbedaan di tepi kiri kontrol dan dialog dalam koordinat layar. Namun, dalam dialog cermin, kiri dan kanan dibalik, jadi sebagai gantinya Anda harus menggunakan MapWindowPoints sebagai berikut:
RECT rcDialog;
RECT rcControl;
HWND hControl - GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hControl, &rcControl);
// MapWindowPoints works correctly in both mirrored and non-mirrored windows.
MapWindowPoints(NULL, hDlg, (LPPOINT) &rcControl, 2);
// Now rcControl is in client coordinates.
MoveWindow(hControl, rcControl.left, rcControl.top, nWidth, nHeight, FALSE)
Mencerminkan Kotak Dialog dan Kotak Pesan
Kotak dialog dan kotak pesan tidak mewarisi tata letak, jadi Anda harus mengatur tata letak secara eksplisit. Untuk mencerminkan kotak pesan, panggilKotak Pesanatau MessageBoxEx dengan opsi MB_RTLREADING. Untuk tata letak kotak dialog kanan-ke-kiri, gunakan gaya yang diperluas WS_EX_LAYOUTRTL dalam struktur templat dialog DLGTEMPLATEEX. Lembar properti adalah kasus khusus kotak dialog. Setiap tab diperlakukan sebagai kotak dialog terpisah, jadi Anda perlu menyertakan gaya WS_EX_LAYOUTRTL di setiap tab yang ingin Anda cerminkan.
Mencerminkan Konteks Perangkat Yang Tidak Terkait dengan Jendela
DC yang tidak terkait dengan jendela, seperti metafile atau DC printer, jangan mewarisi tata letak, jadi Anda harus mengatur tata letak secara eksplisit. Untuk mengubah tata letak konteks perangkat, gunakan fungsiSetLayout.
Fungsi SetLayout jarang digunakan dengan jendela. Biasanya, windows hanya menerima DC terkait dalam memproses pesan WM_PAINT. Terkadang, program membuat DC untuk jendela dengan memanggil GetDC. Bagaimanapun, tata letak awal untuk DC diatur oleh BeginPaint atau GetDC sesuai dengan bendera WS_EX_LAYOUTRTL jendela.
Nilai yang dikembalikan oleh GetWindowOrgEx, GetWindowExtEx, GetViewportOrgEx dan GetViewportExtEx tidak terpengaruh dengan memanggil SetLayout.
Saat tata letak adalah RTL, GetMapMode akan mengembalikan MM_ANISOTROPIC alih-alih MM_TEXT. Memanggil SetMapMode dengan MM_TEXT akan berfungsi dengan benar; hanya nilai yang dikembalikan dari GetMapMode yang terpengaruh. Demikian pula, memanggil SetLayout(hdc, LAYOUT_RTL) ketika mode pemetaan MM_TEXT menyebabkan mode pemetaan yang dilaporkan berubah menjadi MM_ANISOTROPIC.
Penghancuran Jendela
Secara umum, aplikasi harus menghancurkan semua jendela yang dibuatnya. Ini dilakukan dengan menggunakan fungsi DestroyWindow. Ketika jendela dihancurkan, sistem menyembunyikan jendela, jika terlihat, lalu menghapus data internal yang terkait dengan jendela. Ini membatalkan handel jendela, yang tidak dapat lagi digunakan oleh aplikasi.
Aplikasi menghancurkan banyak jendela yang dibuat segera setelah membuatnya. Misalnya, aplikasi biasanya menghancurkan jendela kotak dialog segera setelah aplikasi memiliki input yang cukup dari pengguna untuk melanjutkan tugasnya. Aplikasi akhirnya menghancurkan jendela utama aplikasi (sebelum mengakhiri).
Sebelum menghancurkan jendela, aplikasi harus menyimpan atau menghapus data apa pun yang terkait dengan jendela, dan harus merilis sumber daya sistem apa pun yang dialokasikan untuk jendela. Jika aplikasi tidak merilis sumber daya, sistem akan membebaskan sumber daya apa pun yang tidak dibeberkan oleh aplikasi.
Menghancurkan jendela tidak memengaruhi kelas jendela tempat jendela dibuat. Jendela baru masih dapat dibuat menggunakan kelas tersebut, dan jendela kelas tersebut yang ada terus beroperasi. Menghancurkan jendela juga menghancurkan jendela turunan jendela. Fungsi DestroyWindow mengirim pesan WM_DESTROY terlebih dahulu ke jendela, lalu ke jendela turunan dan jendela turunannya. Dengan cara ini, semua jendela turunan jendela yang dihancurkan juga dihancurkan.
Jendela dengan menu jendela menerima pesan WM_CLOSE saat pengguna mengklik Tutup. Dengan memproses pesan ini, aplikasi dapat meminta konfirmasi kepada pengguna sebelum menghancurkan jendela. Jika pengguna mengonfirmasi bahwa jendela harus dihancurkan, aplikasi dapat memanggil fungsi DestroyWindow untuk menghancurkan jendela.
Jika jendela yang dihancurkan adalah jendela aktif, status aktif dan fokus ditransfer ke jendela lain. Jendela yang menjadi jendela aktif adalah jendela berikutnya, seperti yang ditentukan oleh kombinasi tombol ALT+ESC. Jendela aktif baru kemudian menentukan jendela mana yang menerima fokus keyboard.