Fitur Jendela

Gambaran umum ini membahas fitur jendela seperti jenis jendela, status, ukuran, dan posisi.

Tipe Jendela

Bagian ini berisi topik berikut yang menjelaskan jenis jendela.

Windows tumpang tindih

Jendela yang 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 fungsi CreateWindowEx , 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 tombol minimalkan dan maksimalkan.

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 gaya WS_OVERLAPPED yang tumpang tindih.

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 agar 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 dalam fungsi CreateWindowEx .

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-aspek jendela anak berikut:

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 Orang Tua Jendela Anak
Dihancurkan Dihancurkan sebelum jendela induk dihancurkan.
Tersembunyi 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 otomatis mengklip jendela anak dari area klien jendela induk. Ini berarti jendela induk menarik 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 terpotong, 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 kandung. Jendela saudara dapat menggambar di area klien satu sama lain, kecuali salah satu jendela anak memiliki gaya WS_CLIPSIBLINGS . Jika jendela anak memiliki gaya ini, bagian mana pun dari jendela saudara kandungnya 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 sembarangan. Untuk performa terbaik, aplikasi yang perlu membagi jendela utamanya secara logis harus melakukannya dalam prosedur jendela jendela utama daripada menggunakan jendela anak.

Hubungan ke Jendela Induk

Aplikasi dapat mengubah jendela induk jendela anak yang ada dengan memanggil fungsi SetParent . 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. Fungsi GetParent mengambil 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 boleh 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 fungsi EnableWindow . 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 penpaduan 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 fungsi SetLayeredWindowAttributes atau UpdateLayeredWindow telah dipanggil untuk jendela ini.

Catatan

Dimulai dengan Windows 8, WS_EX_LAYERED dapat digunakan dengan jendela anak dan jendela tingkat atas. Versi Windows sebelumnya mendukung WS_EX_LAYERED hanya untuk jendela tingkat atas.

 

Untuk mengatur tingkat keburaman 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 lukisan 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 dengan lebih efisien, karena sistem tidak memerlukan memori tambahan yang diperlukan untuk menyimpan gambar jendela yang dialihkan. Untuk efisiensi maksimum di jendela animasi, 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 nol akan membiarkan pesan mouse melaluinya. 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 fungsi SetParent .

Untuk menemukan jendela khusus pesan, tentukan HWND_MESSAGE dalam parameter hwndParent dari fungsi FindWindowEx . Selain itu, FindWindowEx mencari jendela khusus pesan serta jendela tingkat atas jika parameter hwndParent dan hwndChildAfter adalah NULL.

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:

Jendela Latar Depan dan Latar Belakang

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 fungsi GetForegroundWindow . 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 fungsi SetForegroundWindow .

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 fungsi LockSetForegroundWindow .
    • 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 fungsi LockSetForegroundWindow .

Windows yang Dimiliki

Jendela tumpang tindih atau pop-up dapat dimiliki oleh jendela lain yang tumpang tindih atau pop-up. Dimiliki menempatkan 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 yang tumpang tindih atau pop-up yang dapat menjadi jendela pemilik; jendela anak tidak boleh menjadi jendela pemilik. Aplikasi membuat jendela yang dimiliki dengan menentukan handel jendela pemilik sebagai parameter hwndParent dari CreateWindowEx saat membuat jendela dengan gaya WS_OVERLAPPED atau WS_POPUP . Parameter hwndParent harus mengidentifikasi jendela tumpang tindih atau pop-up. 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 fungsi GetWindow dengan bendera GW_OWNER untuk mengambil handel ke pemilik jendela.

Z-Order

Urutan z jendela menunjukkan posisi jendela dalam tumpukan jendela yang tumpang tindih. Tumpukan jendela ini berorientasi di sepanjang sumbu imajiner, sumbu z, meluas ke luar dari layar. Jendela di bagian atas urutan z 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 urutan z berdasarkan apakah jendela tersebut adalah jendela paling atas, jendela tingkat atas, atau jendela anak. Jendela paling atas tumpang tindih dengan semua jendela non-paling atas 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 urutan z sebelum jendela non-topmost. Jendela anak dikelompokkan dengan induknya dalam urutan z.

Ketika aplikasi membuat jendela, sistem meletakkannya di bagian atas urutan z untuk jendela dengan jenis yang sama. Anda dapat menggunakan fungsi BringWindowToTop untuk membawa jendela ke bagian atas urutan z untuk jendela dengan jenis yang sama. Anda dapat mengatur ulang urutan z dengan menggunakan fungsi SetWindowPos dan DeferWindowPos .

Pengguna mengubah urutan z dengan mengaktifkan jendela yang berbeda. Sistem memposisikan jendela aktif di bagian atas urutan z untuk jendela dengan jenis yang sama. Ketika jendela datang ke bagian atas z-order, begitu juga jendela anaknya. Anda dapat menggunakan fungsi GetTopWindow untuk mencari semua jendela anak dari jendela induk dan mengembalikan handel ke jendela anak yang tertinggi dalam urutan z. Fungsi GetNextWindow mengambil 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 status jendela menunjukkan. Topik berikut membahas status peragaan jendela:

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. Ketika 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 fungsi SetActiveWindow . 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 fungsi GetActiveWindow untuk 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 di aplikasi yang sama, sistem mengirim pesan WM_ACTIVATE ke jendela.

Windows Yang Dinonaktifkan

Jendela dapat dinonaktifkan. Jendela yang 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 dorong 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. Namun, aplikasi dapat menentukan gaya WS_DISABLED untuk menonaktifkan jendela baru. Aplikasi mengaktifkan atau menonaktifkan jendela yang ada dengan menggunakan fungsi EnableWindow . Sistem mengirim pesan WM_ENABLE ke jendela ketika status diaktifkan akan berubah. Aplikasi dapat menentukan apakah jendela diaktifkan dengan menggunakan fungsi IsWindowEnabled .

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 itu 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 yang 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 mungkin menjaga jendela baru tetap tersembunyi saat menyesuaikan tampilan jendela. Jika gaya WS_VISIBLE ditentukan di CreateWindowEx, sistem mengirim pesan WM_SHOWWINDOW ke jendela setelah membuat jendela, tetapi sebelum menampilkannya.

Aplikasi dapat menentukan apakah jendela terlihat dengan menggunakan fungsi IsWindowVisible . Aplikasi dapat menampilkan (terlihat) atau menyembunyikan jendela dengan menggunakan fungsi ShowWindow, SetWindowPos, DeferWindowPos, atau SetWindowPlacement atau 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 menampilkannya. Terkadang, aplikasi mungkin perlu menyembunyikan jendela yang dimiliki tanpa harus meminimalkan atau menyembunyikan pemiliknya. Dalam hal ini, aplikasi menggunakan fungsi ShowOwnedPopups . 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 memperlihatkannya. Menyembunyikan jendela pemilik tidak berpengaruh pada status visibilitas jendela yang dimiliki.

Saat jendela induk terlihat, jendela anak terkait juga terlihat. Demikian pula, ketika jendela induk disembunyikan, jendela anaknya juga disembunyikan. 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 tumpang tindih sepenuhnya 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 yang dimaksimalkan adalah jendela yang memiliki gaya WS_MAXIMIZE . Secara default, sistem memperbesar jendela yang dimaksimalkan sehingga mengisi layar atau, dalam kasus jendela anak, area klien jendela induk. Meskipun ukuran jendela dapat diatur ke ukuran jendela yang sama dengan 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 yang 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 fungsi CreateWindowEx , jendela awalnya dimaksimalkan atau diminimalkan. Setelah membuat jendela, aplikasi dapat menggunakan fungsi CloseWindow untuk meminimalkan jendela. Fungsi ArrangeIconicWindows mengatur ikon di desktop, atau mengatur jendela anak jendela induk yang diminimalkan di jendela induk. Fungsi OpenIcon memulihkan 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. Fungsi SetWindowPlacement mencakup fungsionalitas yang sama dengan ShowWindow, tetapi dapat menggantikan posisi jendela yang diminimalkan, dimaksimalkan, dan dipulihkan secara default.

Fungsi IsZoomed dan IsIconic menentukan apakah jendela tertentu masing-masing dimaksimalkan atau diminimalkan. Fungsi GetWindowPlacement mengambil posisi yang diminimalkan, dimaksimalkan, dan dipulihkan untuk jendela, dan juga menentukan status peragaan jendela.

Ketika sistem menerima perintah untuk memaksimalkan atau memulihkan jendela yang diminimalkan, sistem mengirimkan 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 fungsi SetWindowPlacement atau memproses pesan WM_GETMINMAXINFO yang diterima oleh jendela saat sistem akan memaksimalkan jendela. WM_GETMINMAXINFO menyertakan penunjuk ke struktur MINMAXINFO yang berisi nilai yang digunakan sistem untuk mengatur ukuran dan posisi yang dimaksimalkan. Mengganti nilai-nilai ini akan menggantikan 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

Aplikasi dapat memungkinkan sistem menghitung ukuran awal atau posisi 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 mengambil alihnya 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 dimaksimalkan, ukuran dan posisi yang dipulihkan, dan memperlihatkan 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 mengatur posisi sejumlah jendela secara bersamaan, termasuk ukuran, posisi, posisi dalam urutan z, dan status peragaan.

Aplikasi dapat mengambil koordinat persegi panjang pembatas jendela dengan menggunakan fungsi GetWindowRect . GetWindowRect mengisi struktur RECT 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 struktur RECT dengan 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 menjangkau jendela di desktop atau mengaskade jendela anak dari jendela induk yang ditentukan. Fungsi TileWindows memutihkan 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 struktur MINMAXINFO yang 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 struktur WINDOWPOS 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, posisi, posisi jendela dalam urutan z, atau status peragaan, sistem mengirim pesan WM_WINDOWPOSCHANGED ke jendela. Pesan ini mencakup penunjuk ke 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 fungsi DefWindowProc ; jika tidak, sistem tidak mengirim WM_SIZE dan WM_MOVE pesan ke jendela.

Sistem mengirim pesan WM_NCCALCSIZE ke jendela ketika 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 Melukis dan Menggambar.

Animasi Jendela

Anda dapat menghasilkan efek khusus saat menampilkan atau menyembunyikan jendela dengan menggunakan fungsi AnimateWindow . 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 dalam tampilan (memperlihatkan jendela) atau slide keluar dari tampilan (menyembunyikan jendela). Anda dapat menggunakan parameter dwFlags untuk menentukan apakah jendela meluncur secara horizontal, vertikal, atau diagonal.

Saat Anda menentukan bendera AW_BLEND , sistem menggunakan pudar alpha-blended.

Anda juga dapat menggunakan bendera AW_CENTER untuk membuat jendela tampak runtuh ke dalam atau meluas ke luar.

Tata Letak dan Pencerminan Jendela

Tata letak jendela menentukan bagaimana teks dan objek Windows Graphics Device Interface (GDI) ditata di jendela atau konteks 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 adalah 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 dengan GetWindowLong 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).

Catatan, 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, panggil SetLayout dengan 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 dikembalikan, pdwDefaultLayout berisi LAYOUT_RTL atau 0. Untuk mengkueri pengaturan tata letak konteks perangkat, panggil GetLayout. Setelah berhasil dikembalikan, 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 pengkodean 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 memposisikan 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);

Hal ini menyebabkan masalah dalam pencerminan karena tepi kiri persegi panjang menjadi tepi kanan di jendela cermin, dan sebaliknya. Untuk menghindari masalah ini, ganti panggilan ScreenToClient dengan 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 memposisikan objek di jendela klien menggunakan offset dalam koordinat layar alih-alih koordinat klien. Misalnya, kode berikut menggunakan perbedaan koordinat layar sebagai posisi x dalam koordinat klien untuk memposisikan 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 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, panggil MessageBox atau MessageBoxEx dengan opsi MB_RTLREADING . Untuk mengatur 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, tidak mewarisi tata letak, jadi Anda harus mengatur tata letak secara eksplisit. Untuk mengubah tata letak konteks perangkat, gunakan fungsi SetLayout .

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.

Ketika 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) saat 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 apa pun yang terkait dengan jendela. Ini membatalkan handel jendela, yang tidak dapat lagi digunakan oleh aplikasi.

Aplikasi menghancurkan banyak jendela yang dibuatnya segera setelah membuatnya. Misalnya, aplikasi biasanya menghancurkan jendela kotak dialog segera setelah aplikasi memiliki input yang memadai 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 dibebaskan 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 mengirimkan pesan WM_DESTROY terlebih dahulu ke jendela, lalu ke jendela anak dan jendela turunannya. Dengan cara ini, semua jendela keturunan 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.