Aracılığıyla paylaş


Pencere Özellikleri

Bu genel bakışta pencere türleri, durumlar, boyut ve konum gibi pencerelerin özellikleri ele alınmaktadır.

Pencere Türleri

Bu bölüm, pencere türlerini açıklayan aşağıdaki konuları içerir.

Çakışan Windows

Katmanlı pencere, başlık çubuğu, kenarlık ve içerik alanı olan, alt pencere olmayan en üst düzey bir penceredir; bir uygulamanın ana penceresi olarak hizmet vermek içindir. Ayrıca pencere menüsü, küçült ve büyüt düğmeleri ile kaydırma çubukları da olabilir. Ana pencere olarak kullanılan çakışan bir pencere genellikle bu bileşenlerin tümünü içerir.

CreateWindowEx işlevinde WS_OVERLAPPED veya WS_OVERLAPPEDWINDOW stilini belirterek, uygulama çakışan bir pencere oluşturur. WS_OVERLAPPED stilini kullanırsanız, pencerede başlık çubuğu ve kenarlık vardır. WS_OVERLAPPEDWINDOW stilini kullanırsanız, pencerede başlık çubuğu, boyutlandırma kenarlığı, pencere menüsü, küçült ve büyüt düğmeleri bulunur.

Açılır Pencereler

Açılır pencere, bir uygulamanın ana penceresinin dışında görünen iletişim kutuları, ileti kutuları ve diğer geçici pencereler için kullanılan özel bir çakışan pencere türüdür. Başlık çubukları açılır pencereler için isteğe bağlıdır; aksi takdirde, açılır pencereler WS_OVERLAPPED stilinin çakışan pencereleriyle aynıdır.

CreateWindowEx'teWS_POPUP stilini belirterek bir açılır pencere oluşturursunuz. Başlık çubuğu eklemek için WS_CAPTION stilini belirtin. Kenarlık ve pencere menüsü içeren bir açılır pencere oluşturmak için WS_POPUPWINDOW stilini kullanın. Pencere menüsünü görünür hale getirmek için WS_CAPTION stili WS_POPUPWINDOW stiliyle birleştirilmelidir.

Çocuk Pencereler

Bir alt pencere, WS_CHILD stiline sahiptir ve ebeveyn penceresinin istemci alanı ile sınırlandırılmıştır. Bir uygulama genellikle bir ana pencerenin özalt alanını işlevsel alanlara bölmek için alt pencereler kullanır. CreateWindowEx işlevinde WS_CHILD stilini belirterek bir alt pencere oluşturursunuz.

Alt pencerenin bir ebeveyn penceresi olmalıdır. Ana pencere çakışan bir pencere, açılır pencere veya başka bir alt pencere olabilir. CreateWindowEx'i çağırdığınızda üst pencereyi belirtirsiniz. CreateWindowEx'teWS_CHILD stilini belirtirseniz ancak üst pencere belirtmezseniz, sistem pencereyi oluşturmaz.

Alt pencerenin bir istemci alanı vardır ancak başka özellikleri, açıkça talep edilmediği sürece yoktur. Uygulama bir alt pencere için başlık çubuğu, pencere menüsü, küçültme ve ekranı büyüt düğmeleri, kenarlık ve kaydırma çubukları isteyebilir, ancak alt pencere menüsü olamaz. Uygulama, çocuğun pencere sınıfını kaydederken veya alt pencereyi oluştururken bir menü tutamacını belirtirse, menü tutamacı yoksayılır. Kenarlık stili belirtilmezse, sistem kenarlıksız bir pencere oluşturur. Bir uygulama, ana pencerenin istemci alanını bölmek ve bölmeleri kullanıcıya görünmez tutmak için çerçevesiz alt pencereleri kullanabilir.

Bu bölümde alt pencerelerin aşağıdaki yönleri ele alınmaktadır:

Konumlandırma

Sistem her zaman bir çocuk pencereyi ebeveyn penceresinin istemci alanının sol üst köşesine göre konumlandırır. Alt pencerenin hiçbir bölümü asla üst penceresinin kenarlıklarının dışında görünmez. Bir uygulama, üst pencereden daha büyük bir alt pencere oluşturursa veya alt pencereyi, bir kısmı ya da tamamı üst pencerenin kenarlıklarının ötesine taşacak şekilde konumlandırırsa, sistem alt pencereyi kırpar; yani, üst pencerenin istemci alanının dışındaki bölüm görüntülenmez. Ana pencereyi etkileyen eylemler aşağıdaki gibi alt pencereyi de etkileyebilir.

Ana Pencere Alt Pencere
Yıkıldı Ana pencere yok edilmeden önce yok edilir.
Gizli Ana pencere gizlenmeden önce gizlenir. Alt pencere yalnızca ebeveyn pencere görünür olduğunda görünür.
Taşındı Ana pencerenin istemci alanıyla birlikte taşındı. Alt pencere, taşımadan sonra istemci alanını boyamaktan sorumludur.
Gösterilen Ana pencere gösterildikten sonra gösterilir.

 

Kırpma

Sistem, üst pencerenin istemci alanından bir alt pencereyi otomatik olarak kırpmaz. Bu, ebeveyn pencerenin ve alt pencerenin aynı konumda herhangi bir çizim yapması durumunda, ebeveyn pencerenin alt pencerenin üzerini çizdiği anlamına gelir. Ancak, üst pencere WS_CLIPCHILDREN stiline sahipse, sistem alt pencereyi üst pencerenin istemci alanından kırpıyor. Ana pencere, alt pencere kırpılmışsa üzerine çizemez.

Bir alt pencere aynı istemci alanındaki diğer alt pencerelerle çakışabilir. Aynı üst pencereyi bir veya daha fazla başka alt pencereyle paylaşan bir alt pencereye eşdüzey pencere denir. Alt pencerelerden biri WS_CLIPSIBLINGS stiline sahip değilse, eşdüzey pencereler birbirlerinin istemci alanında çizim yapabilir. Bir alt pencere bu stile sahipse, alt pencere dahilinde yer alan eş penceresinin herhangi bir bölümü kırpılır.

Bir pencerede WS_CLIPCHILDREN veya WS_CLIPSIBLINGS stili varsa, performansta küçük bir kayıp oluşur. Her pencere sistem kaynaklarını kaplar, bu nedenle bir uygulama ayrım gözetmeksizin alt pencereleri kullanmamalıdır. En iyi performans için, ana penceresini mantıksal olarak bölmesi gereken bir uygulama bunu alt pencereleri kullanmak yerine ana pencerenin pencere yordamında yapmalıdır.

Ana Pencereyle İlişki

Bir uygulama, SetParent işlevini çağırarak mevcut bir alt pencerenin ebeveyn penceresini değiştirebilir. Bu durumda, sistem alt pencereyi eski üst pencerenin istemci alanından kaldırır ve yeni üst pencerenin istemci alanına taşır. SetParent bir NULL tanıtıcı belirtirse, masaüstü penceresi yeni ebeveyn pencere olur. Bu durumda, child window masaüstünde, başka bir pencerenin kenarlıklarının dışında çizilir. GetParent işlevi, bir alt pencerenin üst penceresine ait tanıtıcıyı alır.

Üst pencere, istemci alanının bir bölümünü bir alt pencereye devreder ve alt pencere bu alandaki tüm girişleri alır. Pencere sınıfının, üst pencerenin alt pencerelerinin her biri için aynı olması gerekmez. Bu, bir uygulamanın üst pencereyi farklı görünen ve farklı görevler gerçekleştiren alt pencerelerle doldurabileceği anlamına gelir. Örneğin, bir iletişim kutusu, her biri kullanıcıdan farklı veri türlerini kabul eden bir alt pencere olan birçok denetim türü içerebilir.

Bir alt pencerenin sadece bir üst penceresi vardır, ancak bir üst pencerenin herhangi bir sayıda alt penceresi olabilir. Her bir alt pencere de, sırasıyla alt pencerelere sahip olabilir. Bu pencere zincirinde, her alt pencere özgün ana pencerenin nesil penceresi olarak adlandırılır. Uygulama, belirli bir pencerenin alt pencere mi yoksa belirli bir üst pencerenin alt penceresi mi olduğunu keşfetmek için IsChild işlevini kullanır.

EnumChildWindows işlevi, üst pencerenin alt pencerelerini numaralandırır. Ardından EnumChildWindows her bir alt pencerenin tanıtıcısını uygulama tanımlı bir geri çağırma işlevine geçirir. Verilen üst pencerenin alt pencereleri de numaralandırılır.

Messages

Sistem, bir alt pencerenin giriş iletilerini doğrudan alt pencereye geçirir; iletiler üst pencereden geçirilmiyor. Tek istisna, alt pencerenin EnableWindow işlevi tarafından devre dışı bırakılmasıdır. Bu durumda, sistem alt pencereye gitmiş olabilecek tüm giriş iletilerini, bunun yerine, üst pencereye geçirir. Bu, ana pencerenin gelen iletileri inceleyip gerekirse alt pencereyi etkinleştirmesine izin verir.

Alt pencere benzersiz bir tamsayı tanımlayıcısına sahip olabilir. Denetim pencereleriyle çalışırken alt pencere tanımlayıcıları önemlidir. Uygulama, bir denetimin etkinliğini ileti göndererek yönlendirir. Uygulama, iletileri denetime yönlendirmek için denetimin alt pencere tanımlayıcısını kullanır. Buna ek olarak, bir denetim bildirim iletilerini üst penceresine gönderir. Bildirim iletisi, üst pencerenin, iletiyi hangi denetimin gönderdiğini belirlemek için kullandığı denetimin alt pencere tanımlayıcısını içerir. Uygulama, CreateWindowEx işlevinin hMenu parametresini menü tutamacı yerine bir değere ayarlayarak diğer alt pencere türleri için alt pencere tanımlayıcısını belirtir.

Katmanlı Windows

Katmanlı bir pencere kullanmak, karmaşık bir şekle sahip olan, şekline animasyon uygulayan veya alfa karıştırma efektleri kullanmak isteyen bir pencerenin performansını ve görsel efektlerini önemli ölçüde iyileştirebilir. Sistem, katmanlı pencereleri ve temel alınan uygulamaların pencerelerini otomatik olarak oluşturur ve yeniden boyar. Sonuç olarak, katmanlı pencereler, karmaşık pencere bölgelerinin tipik yanıp sönmesi olmadan sorunsuz bir şekilde görsellenir. Buna ek olarak, katmanlı pencereler kısmen yarı saydam, yani alfa karışımlı olabilir.

Katmanlı pencere oluşturmak için CreateWindowEx işlevini çağırırken genişletilmiş WS_EX_LAYERED pencere stilini belirtin veya pencere oluşturulduktan sonra WS_EX_LAYERED ayarlamak için SetWindowLong işlevini çağırın. CreateWindowEx çağrısından sonra, bu pencere için SetLayeredWindowAttributes veya UpdateLayeredWindow işlevi çağrılana kadar katmanlı pencere görünmez.

Uyarı

Windows 8'de WS_EX_LAYERED alt pencerelerle ve üst düzey pencerelerle kullanılabilir. Önceki Windows sürümleri yalnızca üst düzey pencereler için WS_EX_LAYERED destekler.

 

Belirli bir katmanlı pencerenin opaklık düzeyini veya saydamlık renk anahtarını ayarlamak için SetLayeredWindowAttributes öğesini çağırın. Görüşmeden sonra sistem, pencere gösterildiğinde veya yeniden boyutlandırıldığında pencereye yine de boyama isteğinde bulunabilir. Ancak, sistem katmanlı pencere görüntüsünü depoladığı için, göreli pencere hareketleri sonucunda bölümleri açığa çıkarsa sistem pencereden boyamasını istemez. Sistem SetLayeredWindowAttributes adlı pencerelerin boyamasını ekran dışı belleğe yönlendirdiğinden ve istenen etkiyi elde etmek için yeniden birleştirdiğinden, eski uygulamaların pencere için saydamlık veya saydamlık efektleri eklemek istediklerinde boyama kodlarını yeniden yapılandırmaları gerekmez.

Daha hızlı ve daha verimli animasyon için veya piksel başına alfa gerekiyorsa UpdateLayeredWindow'u arayın. UpdateLayeredWindow öncelikli olarak, sistemin SetLayeredWindowAttributes aracılığıyla sağladığı yeniden yönlendirme mekanizmasını kullanmadan uygulamanın katmanlı bir pencerenin şeklini ve içeriğini doğrudan sağlaması gerektiğinde kullanılmalıdır. Ayrıca, sistem yeniden yönlendirilen pencerenin görüntüsünü depolamak için gereken ek belleğe ihtiyaç duymadığından UpdateLayeredWindow doğrudan belleği daha verimli kullanır. Pencere animasyonunda maksimum verimlilik için, katmanlı pencerenin konumunu ve boyutunu değiştirmek için UpdateLayeredWindow'u çağırın. SetLayeredWindowAttributes çağrıldıktan sonra, katman stili bit temizlenip yeniden ayarlanana kadar sonraki UpdateLayeredWindow çağrılarının başarısız olacağını lütfen unutmayın.

Katmanlı bir pencerenin isabet testi, pencerenin şeklini ve saydamlığını temel alır. Bu, pencerenin renk anahtarlı veya alfa değeri sıfır olan alanlarının fare mesajlarını ileteceği anlamına gelir. Ancak, katmanlı pencerede genişletilmiş WS_EX_TRANSPARENT pencere stili varsa, katmanlı pencerenin şekli yoksayılır ve fare olayları katmanlı pencerenin altındaki diğer pencerelere geçirilir.

Sadece Mesaj Windows'u

Yalnızca ileti içeren bir pencere, ileti göndermenizi ve almanızı sağlar. Görünür değil, z sırası yok, numaralandırılamaz ve yayın iletilerini almaz. Pencerede yalnızca iletiler gönderilir.

Yalnızca ileti penceresi oluşturmak için CreateWindowEx işlevinin hWndParent parametresinde HWND_MESSAGE sabitini belirtin. Ayrıca, SetParent işlevinin hWndNewParent parametresinde HWND_MESSAGE belirterek var olan bir pencereyi yalnızca ileti penceresiyle değiştirebilirsiniz.

Yalnızca ileti pencerelerini bulmak için, FindWindowEx işlevinin hwndParent parametresinde HWND_MESSAGE belirtin. Ayrıca, hem hwndParent hem de hwndChildAfter parametreleri NULL ise, FindWindowEx yalnızca ileti pencereleri ve üst düzey pencereleri arar.

Pencere İlişkileri

Bir pencerenin kullanıcıyla veya başka bir pencereyle ilişkilendirebileceği birçok yol vardır. Pencere, sahip olunan bir pencere, ön plan penceresi veya arka plan penceresi olabilir. Bir pencerenin diğer pencerelere göre z düzeni de vardır. Daha fazla bilgi için aşağıdaki konulara bakın:

Ön Plan ve Arka Plan Pencereleri

Her işlemin birden çok yürütme iş parçacığı olabilir ve her iş parçacığı pencere oluşturabilir. Kullanıcının çalışmakta olduğu pencereyi oluşturan iş parçacığı ön plan iş parçacığı olarak adlandırılır ve pencere ön plan penceresi olarak adlandırılır. Diğer tüm iş parçacıkları arka plan iş parçacıklarıdır ve arka plan iş parçacıkları tarafından oluşturulan pencerelere arka plan pencereleri adı verilir.

Her iş parçacığının, iş parçacığının aldığı CPU süresini belirleyen bir öncelik düzeyi vardır. Bir uygulama iş parçacıklarının öncelik düzeyini ayarlayasa da, normalde ön plan iş parçacığının öncelik düzeyi arka plan iş parçacıklarından biraz daha yüksektir. Daha yüksek önceliğe sahip olduğundan, ön plan iş parçacığı arka plan iş parçacıklarından daha fazla CPU süresi alır. Ön plan iş parçacığının normal temel önceliği 9'dır; arka plan iş parçacığının normal temel önceliği 7'dir.

Kullanıcı, bir pencereye tıklayarak veya ALT+SEKME veya ALT+ESC tuş bileşimini kullanarak ön plan penceresini ayarlar. Ön plan penceresine tanıtıcı elde etmek için GetForegroundWindow işlevini kullanın. Uygulama pencerenizin, ön plan penceresi olup olmadığını kontrol etmek için, GetForegroundWindow tarafından döndürülen tanıtıcıyı, uygulama pencerenizin tanıtıcısı ile karşılaştırın.

Uygulama, SetForegroundWindow işlevini kullanarak ön plan penceresini ayarlar.

Sistem, hangi işlemlerin ön plan penceresini ayarlayabileceğini kısıtlar. Bir işlem ön plan penceresini yalnızca aşağıdakiler için ayarlayabilir:

  • Aşağıdaki koşulların tümü doğrudur:
    • SetForegroundWindow çağrısı işlemi, UWP uygulamasına veya Windows 8 veya 8.1 için tasarlanmış bir Windows Mağazası uygulamasına değil bir masaüstü uygulamasına aittir.
    • Ön plan işlemi, LockSetForegroundWindow işlevine yapılan önceki bir çağrıyla SetForegroundWindow çağrılarını devre dışı bırakmamıştır.
    • Ön plan kilidi zaman aşımı süresi doldu (bkz. SystemParametersInfo'daSPI_GETFOREGROUNDLOCKTIMEOUT).
    • Etkin menü yok.
  • Ayrıca, aşağıdaki koşullardan en az biri doğrudur:
    • Çağrı işlemi ön plan işlemidir.
    • Arama işlemi ön plan işlemi tarafından başlatıldı.
    • Şu anda ön plan penceresi yoktur ve bu nedenle ön plan işlemi yoktur.
    • Çağrı işlemi son giriş olayını aldı.
    • Ön plan işlemi veya arama işleminde hata ayıklanıyor.

Bu koşulları karşılasa bile bir işlemin ön plan penceresini ayarlama hakkı reddedilebilir.

Ön plan penceresini ayarlayabilen bir işlem, AllowSetForegroundWindow işlevini çağırarak veya BSF_ALLOWSFW bayrağıyla BroadcastSystemMessage işlevini çağırarak başka bir işlemin ön plan penceresini ayarlamasını sağlayabilir. Ön plan işlemi, LockSetForegroundWindow işlevini çağırarak SetForegroundWindow çağrılarını devre dışı bırakabilir.

Sahip Olunan Windows

Çakışan veya açılan pencere başka bir çakışan veya açılan pencereye ait olabilir. Sahip olunması bir pencereye çeşitli kısıtlamalar yerleştirir.

  • Sahip olunan bir pencere her zaman z düzeninde sahibinin üzerindedir.
  • Sahibi yok edildiğinde, sistem sahip olunan bir pencereyi otomatik olarak yok eder.
  • Sahip olduğu pencere, sahibi simge durumuna küçültüldüğünde gizlenir.

Yalnızca çakışan veya açılan pencere sahip penceresi olabilir; alt pencere sahip penceresi olamaz. Uygulama, WS_OVERLAPPED veyaWS_POPUP stiline sahip bir pencere oluşturduğunda CreateWindowEx'inhwndParent parametresi olarak sahibinin pencere tutamacını belirterek sahip olunan bir pencere oluşturur. hwndParent parametresi çakışan veya açılan pencereyi tanımlamalıdır. hwndParent bir alt pencere tanımlarsa, sistem alt pencerenin en üst düzeydeki üst penceresine sahiplik atar. Sahip olunan bir pencere oluşturduktan sonra, uygulama pencerenin sahipliğini başka bir pencereye aktaramaz.

İletişim kutuları ve ileti kutuları varsayılan olarak windows'a aittir. Uygulama, bir iletişim kutusu veya ileti kutusu oluşturan bir işlev çağrılırken sahip penceresini belirtir.

Uygulama, bir pencerenin sahibine ait tanıtıcıyı almak için GetWindow işlevini GW_OWNER bayrağı ile kullanabilir.

Z Sırası

Pencerenin z sırası , pencerenin çakışan pencereler yığınındaki konumunu gösterir. Bu pencere yığını, ekrandan dışarı doğru genişletilen, sanal eksen olan z ekseni boyunca yönlendirilir. Z sırasının üst kısmındaki pencere diğer tüm pencerelerle çakışıyor. Z sırasının en altındaki pencere diğer tüm pencerelerle çakışıyor.

Sistem z sırasını tek bir listede tutar. En üstteki pencereler, en üst düzey pencereler veya alt pencereler olmasına bağlı olarak z düzenine pencereler ekler. En üstteki pencere, etkin veya ön plan penceresi olmasına bakılmaksızın en üstteki olmayan diğer tüm pencerelerle çakışıyor. En üstteki pencerede WS_EX_TOPMOST stili bulunur. En üstteki tüm pencereler, en üstteki olmayan pencerelerden önce z düzeninde görünür. Alt pencere, ana penceresiyle z sıralamasına göre gruplandırılır.

Bir uygulama bir pencere oluşturduğunda, sistem bunu aynı türdeki pencereler için z sırasının en üstüne yerleştirir. Aynı türde pencereler için z sırasının en üstüne bir pencere getirmek için BringWindowToTop işlevini kullanabilirsiniz. SetWindowPos ve DeferWindowPos işlevlerini kullanarak z düzenini yeniden düzenleyebilirsiniz.

Kullanıcı, farklı bir pencereyi etkinleştirerek z sırasını değiştirir. Sistem, etkin pencereyi aynı türdeki pencereler için z sırasının en üstüne konumlandırmış olur. Bir pencere z-sırasının en üstüne geldiğinde, alt pencereleri de en üstte yer alır. GetTopWindow işlevini kullanarak bir üst pencerenin tüm alt pencerelerinde arama yapabilir ve en yüksek z sırasına sahip alt pencereye bir tanıtıcı döndürebilirsiniz. GetNextWindow işlevi, z sıralamasına göre sonraki veya önceki pencerenin tanıtıcısını döndürür.

Pencere Durumu Göster

Belirli bir zamanda, bir pencere etkin veya etkin değil; gizli veya görünür; simge durumuna küçültülmüş, büyütülmüş veya geri yüklenmiş olabilir. Bu nitelikler, pencere gösterme durumu olarak toplu olarak adlandırılır. Aşağıdaki konular, pencerenin gösterim durumunu ele alıyor.

Etkin Pencere

Etkin pencere, kullanıcının çalışmakta olduğu uygulamanın en üst düzey penceresidir. Kullanıcının etkin pencereyi kolayca tanımlamasını sağlamak için, sistem bunu z sırasının en üstüne yerleştirir ve başlık çubuğunun ve kenarlığının rengini sistem tarafından tanımlanan etkin pencere renklerine değiştirir. Yalnızca en üst düzey bir pencere etkin bir pencere olabilir. Kullanıcı bir alt pencereyle çalışırken, sistem alt pencereyle ilişkili en üst düzey ebeveyn pencereyi etkinleştirir.

Sistemdeki tek bir üst düzey pencere aynı anda etkindir. Kullanıcı, bir üst düzey pencereyi tıklayarak (veya alt pencerelerinden biriyle) ya da ALT+ESC veya ALT+SEKME tuş bileşimini kullanarak etkinleştirir. Bir uygulama , SetActiveWindow işlevini çağırarak üst düzey bir pencereyi etkinleştirir. Diğer işlevler sistemin SetWindowPos, DeferWindowPos,SetWindowPlacement ve DestroyWindow gibi farklı bir üst düzey pencereyi etkinleştirmesine neden olabilir. Bir uygulama herhangi bir zamanda farklı bir üst düzey pencereyi etkinleştirebileceğinden, kullanıcının kafasını karıştırmamak için bunu yalnızca bir kullanıcı eylemine yanıt olarak yapmalıdır. Bir uygulama etkin pencereye tanıtıcı almak için GetActiveWindow işlevini kullanır.

Etkinleştirme, bir uygulamanın en üst düzey penceresinden başka bir uygulamanın en üst düzey penceresine değiştiğinde, sistem her iki uygulamaya da değişikliği bildiren bir WM_ACTIVATEAPP iletisi gönderir. Etkinleştirme aynı uygulamadaki farklı bir üst düzey pencereye değiştiğinde, sistem her iki pencereye de WM_ACTIVATE iletisi gönderir.

Devre Dışı Bırakılmış Windows

Bir pencere devre dışı bırakılabilir. Devre dışı bırakılmış bir pencere kullanıcıdan klavye veya fare girişi almaz, ancak diğer pencerelerden, diğer uygulamalardan ve sistemden ileti alabilir. Bir uygulama genellikle kullanıcının pencereyi kullanmasını engellemek için pencereyi devre dışı bırakır. Örneğin, bir uygulama kullanıcının bunu seçmesini önlemek için iletişim kutusundaki bir düğmeyi devre dışı bırakabilir. Bir uygulama, devre dışı bırakılmış bir pencereyi istediğiniz zaman etkinleştirebilir; bir pencerenin etkinleştirilmesi normal girişi geri yükler.

Varsayılan olarak, bir pencere oluşturulduğunda etkinleştirilir. Ancak bir uygulama, yeni bir pencereyi devre dışı bırakmak için WS_DISABLED stilini belirtebilir. Bir uygulama EnableWindow işlevini kullanarak var olan bir pencereyi etkinleştirir veya devre dışı bırakır. Sistem, etkin durumu değişmek üzereyken pencereye bir WM_ENABLE iletisi gönderir. Bir uygulama , IsWindowEnabled işlevini kullanarak bir pencerenin etkinleştirilip etkinleştirilmediğini belirleyebilir.

Bir alt pencere devre dışı bırakıldığında, sistem çocuğun fare giriş iletilerini üst pencereye geçirir. Üst öğe, alt pencerenin etkinleştirilip etkinleştirilmemesi gerektiğini belirlemek için iletileri kullanır. Daha fazla bilgi için bkz. Fare Girişi.

Bir kerede yalnızca bir pencere klavye girişi alabilir; bu pencerenin klavye odağına sahip olduğu söylenir. Bir uygulama klavye odağı penceresini devre dışı bırakmak için EnableWindow işlevini kullanıyorsa, pencere devre dışı bırakılmasına ek olarak klavye odağını da kaybeder. EnableWindow daha sonra klavye odağını NULL olarak ayarlar; başka bir deyişle odak pencereye sahip değildir. Çocuk pencere veya başka bir alt öğe pencere klavye odağına sahipse, ana pencere devre dışı bırakıldığında alt öğe pencere odak kaybeder. Daha fazla bilgi için bkz. Klavye Girişi.

Pencere Görünürlüğü

Pencere görünebilir veya gizlenebilir. Sistem ekranda görünür bir pencere görüntüler. Gizli bir pencereyi çizmeyerek gizler. Bir pencere görünür durumdaysa, kullanıcı pencereye giriş sağlayabilir ve pencerenin çıkışını görüntüleyebilir. Bir pencere gizlenirse, etkin bir şekilde devre dışı bırakılır. Gizli bir pencere, sistemden veya diğer pencerelerden gelen iletileri işleyebilir, ancak kullanıcıdan gelen girişleri işleyemez veya çıkışı görüntüleyemez. Uygulama, pencereyi oluştururken pencerenin görünürlük durumunu ayarlar. Daha sonra uygulama görünürlük durumunu değiştirebilir.

Pencere için WS_VISIBLE stili ayarlandığında bir pencere görünür. Varsayılan olarak CreateWindowEx işlevi, uygulama WS_VISIBLE stilini belirtmedikçe gizli bir pencere oluşturur. Genellikle bir uygulama, oluşturma işleminin ayrıntılarını kullanıcıdan gizli tutmak için bir pencere oluşturduktan sonra WS_VISIBLE stilini ayarlar. Örneğin, bir uygulama pencerenin görünümünü özelleştirirken yeni bir pencereyi gizli tutabilir. WS_VISIBLE stili CreateWindowEx'te belirtilirse, sistem pencereyi oluşturduktan sonra ancak görüntülemeden önce WM_SHOWWINDOW iletisini pencereye gönderir.

Bir uygulama , IsWindowVisible işlevini kullanarak bir pencerenin görünür olup olmadığını belirleyebilir. Bir uygulama ShowWindow, SetWindowPos, DeferWindowPos veya SetWindowPlacement veya SetWindowLong işlevini kullanarak bir pencereyi gösterebilir (görünür yapabilir) veya gizleyebilir. Bu işlevler, pencerenin WS_VISIBLE stilini ayarlayarak veya kaldırarak bir pencereyi gösterir veya gizler. Ayrıca WM_SHOWWINDOW iletisini pencereye göstermeden veya gizlemeden önce gönderirler.

Sahip penceresi simge durumuna küçültüldüğünde, sistem ilişkili olan sahipli pencereleri otomatik olarak gizler. Benzer şekilde, bir sahip penceresi geri yüklendiğinde, sistem otomatik olarak ilişkili sahip olunan pencereleri gösterir. Her iki durumda da, sistem WM_SHOWWINDOW iletisini gizlemeden veya göstermeden önce sahip olunan pencerelere gönderir. Bazen, bir uygulamanın sahip olunan pencereleri gizlemesi gerekirken, sahip olanı simge durumuna küçültmek veya gizlemek zorunda kalmayabilir. Bu durumda uygulama ShowOwnedPopups işlevini kullanır. Bu işlev, sahip olunan tüm pencereler için WS_VISIBLE stilini ayarlar veya kaldırır ve gizlemeden veya göstermeden önce WM_SHOWWINDOW iletisini sahip olunan pencerelere gönderir. Sahip penceresini gizlemek, sahip olunan pencerelerin görünürlük durumunu etkilemez.

Ana pencere görünür olduğunda, ilişkili alt pencereler de görünür hale gelir. Benzer şekilde, ana pencere gizlendiğinde, alt pencereleri de gizlenir. Üst pencerenin en aza indirilmesi alt pencerelerin görünürlük durumunu etkilemez; başka bir ifadeyle, alt pencereler üst pencereyle birlikte simge durumuna küçültülür, ancak WS_VISIBLE stili değiştirilmez.

Bir pencere WS_VISIBLE stiline sahip olsa bile, kullanıcı pencereyi ekranda göremeyebilir; diğer pencereler tamamen örtüşebilir veya ekranın kenarının dışına taşınmış olabilir. Ayrıca, görünür bir çocuk pencere, ebeveyn-çocuk ilişkisi tarafından oluşturulan kırpma kurallarına tabidir. Eğer pencerenin üst penceresi görünür değilse, pencere de görünmez olacaktır. Ana pencere ekranın kenarının ötesine geçerse, alt pencere de ana pencerenin sol üst köşesine göre konumlandırıldığı için taşınır. Örneğin, bir kullanıcı alt pencereyi içeren üst pencereyi ekranın kenarından yeterince uzağa taşıyabilir, ancak alt pencere ve üst penceresinin her ikisi de WS_VISIBLE stiline sahip olsa bile, kullanıcı alt pencereyi göremeyebilir.

Simge Durumuna Küçültülmüş, Maksimuma Büyütülmüş ve Geri Yüklenmiş Pencereler

Maksimize edilmiş bir pencere, WS_MAXIMIZE stiline sahip bir penceredir. Varsayılan olarak, sistem bir pencereyi büyüterek ekranı veya alt pencere durumunda üst pencerenin istemci alanını tamamen kaplar. Pencerenin boyutu, maksimize edilmiş bir pencerenin boyutuyla aynı boyuta ayarlansa da, maksimize edilmiş bir pencere biraz farklıdır. Sistem, pencerenin başlık çubuğunu otomatik olarak ekranın en üstüne veya üst pencerenin istemci alanının en üstüne taşır. Ayrıca sistem, pencerenin boyutlandırma kenarlığı ve başlık çubuğunun pencere konumlandırma özelliğini devre dışı bırakır (böylece kullanıcı, başlık çubuğunu sürükleyerek pencereyi taşıyamaz).

Simge durumuna küçültülmüş pencere, WS_MINIMIZE stiline sahip bir penceredir. Varsayılan olarak, sistem simge durumuna küçültülmüş bir pencereyi görev çubuğu düğmesinin boyutuna küçültür ve simge durumuna küçültülmüş pencereyi görev çubuğuna taşır. Geri getirilen pencere, simge durumuna küçültülmeden veya maksimize edilmeden önceki eski boyutuna ve konumuna döndürülmüş bir penceredir.

tr-TR: Uygulama CreateWindowEx işlevinde WS_MAXIMIZE veya WS_MINIMIZE stilini belirtirse, pencere başlangıçta maksimuma çıkar veya simge durumuna küçültülür. Bir pencere oluşturduktan sonra, bir uygulama pencereyi simge durumuna küçültmek için CloseWindow işlevini kullanabilir. ArrangeIconicWindows işlevi, simgeleri masaüstünde düzenler veya bir üst pencerenin simge durumuna küçültülmüş alt pencerelerini aynı pencerenin içinde düzenler. OpenIcon işlevi, simge durumuna küçültülmüş bir pencereyi önceki boyutuna ve konumuna geri yükler.

ShowWindow işlevi bir pencereyi simge durumuna küçültebilir, büyütebilir veya eski haline getirebilir. Ayrıca pencerenin görünürlüğünü ve etkinleştirme durumlarını da ayarlayabilir. SetWindowPlacement işlevi ShowWindow ile aynı işlevselliğini içerir, ancak pencerenin varsayılan simge durumuna küçültme, ekranı kaplama ve geri yükleme konumlarını geçersiz kılabilir.

IsZoomed ve IsIconic işlevleri, belirli bir pencerenin sırasıyla ekranı kaplayıp küçültmediğini belirler. GetWindowPlacement fonksiyonu pencere için simge durumuna küçültülmüş, maksimize edilmiş ve geri yüklenmiş konumları alır ve ayrıca pencerenin gösterme durumunu belirler.

Sistem simge durumuna küçültülmüş bir pencereyi en üst düzeye çıkarmak veya geri yüklemek için bir komut aldığında, pencereye bir WM_QUERYOPEN iletisi gönderir. Pencere işlemi YANLIŞ döndürürse, sistem büyüt veya geri yükle komutunu yoksayar.

Sistem, büyütülmüş bir pencerenin boyutunu ve konumunu, büyütülmüş bir pencere için sistem tarafından tanımlanan varsayılan ayarlarına otomatik olarak ayarlar. Bu varsayılanları geçersiz kılmak için bir uygulama SetWindowPlacement işlevini çağırabilir veya sistem pencereyi büyütmek üzereyken bir pencerenin aldığı WM_GETMINMAXINFO iletisini işleyebilir. WM_GETMINMAXINFO, sistemin maksimum boyut ve konumu ayarlamak için kullandığı değerleri içeren bir MINMAXINFO yapısına işaretçi içerir. Bu değerlerin değiştirilmesi varsayılanları geçersiz kılar.

Pencere Boyutu ve Konumu

Pencerenin boyutu ve konumu, ekran veya üst pencereyle ilgili olarak verilen koordinatlarla bir sınırlayıcı dikdörtgen şeklinde ifade edilir. Üst düzey pencerenin koordinatları ekranın sol üst köşesine göre belirlenir; alt pencerenin koordinatları üst pencerenin sol üst köşesine göredir. Uygulama, pencereyi oluştururken pencerenin başlangıç boyutunu ve konumunu belirtir, ancak pencerenin boyutunu ve konumunu istediği zaman değiştirebilir. Daha fazla bilgi için bkz. Doldurulmuş Şekiller.

Bu bölüm aşağıdaki konuları içerir:

Varsayılan Boyut ve Konum

Uygulama , CreateWindowEx'te CW_USEDEFAULT belirterek sistemin en üst düzey pencerenin başlangıç boyutunu veya konumunu hesaplamasına izin verebilir. Uygulama pencerenin koordinatlarını CW_USEDEFAULT olarak ayarlarsa ve başka üst düzey pencere oluşturmadıysa, sistem yeni pencerenin konumunu ekranın sol üst köşesine göre ayarlar; aksi takdirde, konumu uygulamanın en son oluşturduğu en üst düzey pencerenin konumuna göre ayarlar. Genişlik ve yükseklik parametreleri CW_USEDEFAULT olarak ayarlanırsa, sistem yeni pencerenin boyutunu hesaplar. Uygulama başka üst düzey pencereler oluşturduysa, sistem yeni pencerenin boyutunu uygulamanın en son oluşturulan en üst düzey penceresinin boyutuna göre temel alır. Alt pencere veya açılır pencere oluştururken CW_USEDEFAULT belirtilmesi, sistemin pencerenin boyutunu varsayılan en düşük pencere boyutuna ayarlamasına neden olur.

İzleme Boyutu

Sistem, WS_THICKFRAME stilindeki bir pencere için en düşük ve en yüksek izleme boyutunu korur; bu stile sahip bir pencerenin boyutlandırma kenarlıkları vardır. Minimum izleme boyutu , pencerenin boyutlandırma kenarlığını sürükleyerek üretebileceğiniz en küçük pencere boyutudur. Benzer şekilde, maksimum izleme boyutu , boyutlandırma kenarlığını sürükleyerek üretebileceğiniz en büyük pencere boyutudur.

Bir pencerenin minimum ve maksimum izleme boyutları, sistem pencereyi oluşturduğunda sistem tarafından tanımlanan varsayılan değerlere ayarlanır. Bir uygulama varsayılanları bulabilir ve WM_GETMINMAXINFO iletisini işleyerek bunları geçersiz kılabilir. Daha fazla bilgi için bkz Boyut ve Konum Mesajları.

Sistem Komutları

Pencere menüsü olan bir uygulama, sistem komutları göndererek bu pencerenin boyutunu ve konumunu değiştirebilir. Kullanıcı pencere menüsünden komutları seçtiğinde sistem komutları oluşturulur. Uygulama, pencereye bir WM_SYSCOMMAND iletisi göndererek kullanıcı eylemine öykünebilir. Aşağıdaki sistem komutları pencerenin boyutunu ve konumunu etkiler.

Komut Description
SC_CLOSE Pencereyi kapatır. Bu komut pencereye bir WM_CLOSE iletisi gönderir. Pencere, kendini temizlemek ve yok etmek için gereken tüm adımları yürütür.
SC_MAXIMIZE Pencereyi büyütür.
SC_MINIMIZE Pencereyi simge durumuna küçültür.
SC_MOVE Pencereyi taşır.
SC_RESTORE Simge durumuna küçültülmüş veya büyütülmüş bir pencereyi orijinal boyutuna ve konumuna geri yükler.
SC_SIZE Bir boyut komutu başlatır. Pencerenin boyutunu değiştirmek için fareyi veya klavyeyi kullanın.

 

Boyut ve Konum İşlevleri

Bir uygulama, pencere oluşturduktan sonra SetWindowPlacement, MoveWindow, SetWindowPos ve DeferWindowPos gibi çeşitli işlevlerden birini çağırarak pencerenin boyutunu veya konumunu ayarlayabilir. SetWindowPlacement bir pencerenin simge durumuna küçültülmüş konumunu, ekranı kaplamış konumunu, geri yüklenen boyutunu ve konumunu ve gösterim durumunu ayarlar. MoveWindow ve SetWindowPos işlevleri birbirine benzer; her ikisi de tek bir uygulama penceresinin boyutunu veya konumunu ayarlar. SetWindowPos işlevi, pencerenin gösteri durumunu etkileyen bir dizi bayrak içerir; MoveWindow bu bayrakları içermez. BeginDeferWindowPos, DeferWindowPos ve EndDeferWindowPos işlevlerini kullanarak boyut, konum, z düzenindeki konum ve durum gösterimi dahil olmak üzere bir dizi pencereyi aynı anda ayarlayın.

Uygulama, GetWindowRect işlevini kullanarak pencerenin sınırlayıcı dikdörtgeninin koordinatlarını alabilir. GetWindowRect bir RECT yapısını pencerenin sol üst ve sağ alt köşelerinin koordinatlarıyla doldurur. Koordinatlar, çocuk pencere için bile ekranın sol üst köşesine göredir. ScreenToClient veya MapWindowPoints işlevi, alt pencerenin sınırlayıcı dikdörtgeninin ekran koordinatlarını üst pencerenin istemci alanına göre koordinatlarla eşler.

GetClientRect işlevi, pencerenin istemci alanının koordinatlarını alır. GetClientRect , rect yapısını istemci alanının sol üst ve sağ alt köşelerinin koordinatlarıyla doldurur, ancak koordinatlar istemci alanının kendisine göredir. Bu, istemci alanının sol üst köşesinin koordinatlarının her zaman (0,0) olduğu ve sağ alt köşenin koordinatlarının istemci alanının genişliği ve yüksekliği olduğu anlamına gelir.

CascadeWindows işlevi, masaüstündeki pencereleri veya belirtilen üst pencerenin alt pencerelerini dizer. TileWindows işlevi, pencereleri masaüstünde döşer ya da belirtilen üst pencerenin alt pencerelerini döşer.

Boyut ve Konum İletileri

Sistem , boyutu veya konumu değişmek üzere olan bir pencereye WM_GETMINMAXINFO iletisi gönderir. Örneğin, kullanıcı pencere menüsünden Taşı veya Boyut'a tıkladığında ya da boyutlandırma kenarlığa veya başlık çubuğuna tıkladığında ileti gönderilir; bir uygulama pencereyi taşımak veya boyutlandırmak için SetWindowPos'ı çağırdığında da ileti gönderilir. WM_GETMINMAXINFO , pencerenin varsayılan en büyük boyutunu ve konumunu, ayrıca varsayılan en küçük ve en büyük izleme boyutlarını içeren MINMAXINFO yapısına yönelik bir işaretçi içerir. Uygulama , WM_GETMINMAXINFO işleyip MINMAXINFO'nun uygun üyelerini ayarlayarak varsayılanları geçersiz kılabilir. WM_GETMINMAXINFO mesajını almak için bir pencerenin WS_THICKFRAME veya WS_CAPTION stiline sahip olması gerekir. WS_THICKFRAME stiline sahip bir pencere, bu iletiyi pencere oluşturma işlemi sırasında ve taşındığında veya boyutlandırıldığında alır.

Sistem WM_WINDOWPOSCHANGING iletisini boyutu, konumu, z düzenindeki konumu veya gösterme durumu değişmek üzere olan bir pencereye gönderir. Bu ileti, pencerenin yeni boyutunu, konumunu, z düzenindeki konumunu ve gösterme durumunu belirten bir WINDOWPOS yapısına yönelik bir işaretçi içerir. WINDOWPOS üyelerini ayarlayarak, bir uygulama pencerenin yeni boyutunu, konumunu ve görünümünü etkileyebilir.

Bir pencerenin boyutunu, konumunu, z sırasındaki konumunu veya gösterme durumunu değiştirdikten sonra, sistem pencereye WM_WINDOWPOSCHANGED iletisini gönderir. Bu ileti, pencereye yeni boyutunu, konumunu, z-düzenindeki konumunu ve gösterim durumunu bildiren WINDOWPOS işaretçisini içerir. WM_WINDOWPOSCHANGED ile geçirilen WINDOWPOS yapısının üyelerini ayarlamanın pencere üzerinde hiçbir etkisi yoktur. WM_SIZE ve WM_MOVE iletileri işlemesi gereken bir pencere, WM_WINDOWPOSCHANGED DefWindowProc işlevine geçirmelidir; aksi takdirde, sistem pencereye WM_SIZE ve WM_MOVE iletileri göndermez.

Sistem, pencere oluşturulduğunda veya boyutlandırıldığında WM_NCCALCSIZE iletisini bir pencereye gönderir. Sistem, bir pencerenin istemci alanının boyutunu ve istemci alanının pencerenin sol üst köşesine göre konumunu hesaplamak için iletiyi kullanır. Bir pencere genellikle bu iletiyi varsayılan pencere yordamına geçirir; ancak bu ileti, pencerenin istemci olmayan alanını özelleştiren veya pencere boyutlandırıldığında istemci alanının bölümlerini koruyan uygulamalarda yararlı olabilir. Daha fazla bilgi için bkz . Boyama ve Çizim.

Pencere Animasyonu

AnimateWindow işlevini kullanarak pencereleri gösterirken veya gizlerken özel efektler oluşturabilirsiniz. Pencere bu şekilde animasyonlandığında, sistem AnimateWindow çağrısında belirttiğiniz bayraklara bağlı olarak pencereyi döndürür, kaydırır veya söndürür.

Varsayılan olarak, sistem roll animasyonu kullanır. Bu etkiyle, pencere açılır (pencereyi gösterir) veya kapalı yuvarlanır (pencereyi gizler) görünür. Pencerenin yatay, dikey veya çapraz olarak yuvarlanıp yuvarlanmayacağını belirtmek için dwFlags parametresini kullanabilirsiniz.

AW_SLIDE bayrağını belirttiğinizde sistem slayt animasyonu kullanır. Bu efektle, pencere görünür hale gelmek için kaydırılır (pencereyi gösterir) veya görünmez hale gelmek için kaydırılır (pencereyi gizler). Pencerenin yatay, dikey veya çapraz olarak kaydırılacağını belirtmek için dwFlags parametresini kullanabilirsiniz.

AW_BLEND bayrağını belirttiğinizde, sistem alfa harmanlanmış bir soldurma kullanır.

Ayrıca AW_CENTER bayrağını kullanarak bir pencerenin içe doğru daraltılmış veya dışa doğru genişletiliyor gibi görünmesini sağlayabilirsiniz.

Pencere Düzeni ve Yansıtma

Pencere düzeni, metin ve Windows Grafik Cihaz Arabirimi (GDI) nesnelerinin bir pencerede veya cihaz bağlamında (DC) nasıl yerleştirildiğini tanımlar. İngilizce, Fransızca ve Almanca gibi bazı diller için soldan sağa (LTR) düzen gerekir. Arapça ve İbranice gibi diğer diller sağdan sola (RTL) düzen gerektirir. Pencere düzeni metne uygulanır, ancak bit eşlemler, simgeler, kaynağın konumu, düğmeler, basamaklı ağaç denetimleri ve siz sola veya sağa gittiğiniz sürece yatay koordinatın artıp artmayacağı gibi pencerenin diğer GDI öğelerini de etkiler. Örneğin, bir uygulama RTL düzenini ayarladıktan sonra başlangıç noktası pencerenin veya cihazın sağ kenarına yerleştirilir ve siz sola ilerledikçe yatay koordinatı temsil eden sayı artar. Ancak, tüm nesneler bir pencerenin düzeninden etkilenmez. Örneğin, meta dosyası ve yazıcı DC'leri gibi bir pencereyle ilişkilendirilmemiş iletişim kutuları, ileti kutuları ve cihaz bağlamlarının düzeni ayrı olarak işlenmelidir. Bunların ayrıntıları bu konunun ilerleyen bölümlerinde belirtilmiştir.

Pencere işlevleri, Windows'un Arapça ve İbranice sürümlerinde pencere düzenini belirtmenize veya değiştirmenize olanak sağlar. RtL düzenine geçmenin (yansıtma olarak da bilinir) stil CS_OWNDC olan pencereler veya GM_ADVANCED grafik moduna sahip DC'ler için desteklenmediğini unutmayın.

Varsayılan olarak, pencere düzeni soldan sağa (LTR) şeklindedir. RTL pencere düzenini ayarlamak için, WS_EX_LAYOUTRTL stiliyle CreateWindowEx'i çağırın. Ayrıca varsayılan olarak, bir alt pencere (yani, WS_CHILD stiliyle oluşturulan ve hWnd parametresiyle CreateWindow veya CreateWindowEx çağrısında geçerli bir ana pencere ile) ana penceresiyle aynı düzene sahiptir. Tüm alt pencerelere yansıtma devralmayı devre dışı bırakmak için WS_EX_NOINHERITLAYOUT değerini CreateWindowEx çağrısında belirtin. Sahip olunan pencereler (WS_CHILD stili olmadan oluşturulanlar) veya CreateWindowEx işlevi kullanılarak oluşturulup üst hWnd parametresi NULL olarak ayarlanan pencerelerde yansıtmanın devralınmadığını unutmayın. Tek bir pencere için yansıtma devralmayı devre dışı bırakmak için WM_NCCREATE iletisini GetWindowLong ve SetWindowLong ile işleyerek WS_EX_LAYOUTRTL bayrağını kapatın. Bu işlem, diğer işlemlere ek olarak gereklidir. Aşağıdaki kod parçası bunun nasıl yapıldığını gösterir.

SetWindowLong (hWnd, 
               GWL_EXSTYLE, 
               GetWindowLong(hWnd,GWL_EXSTYLE) & ~WS_EX_LAYOUTRTL))

SetProcessDefaultLayout(LAYOUT_RTL) öğesini çağırarak varsayılan düzeni RTL olarak ayarlayabilirsiniz. Çağrıdan sonra oluşturulan tüm pencereler yansıtılır, ancak mevcut pencereler etkilenmez. Varsayılan yansıtmayı kapatmak için SetProcessDefaultLayout(0) öğesini çağırabilirsiniz.

SetProcessDefaultLayout'un yalnızca yansıtılan pencerelerin DC'lerini yansıtacağını unutmayın. Herhangi bir DC'yi yansıtmak için SetLayout(hdc, LAYOUT_RTL) çağrısı yapın. Daha fazla bilgi için, bu konunun ilerleyen bölümlerinde yer alan windows ile ilişkili olmayan cihaz bağlamlarını yansıtma konusuna bakın.

Yansıtılmış bir penceredeki bit eşlemler ve simgeler de varsayılan olarak yansıtılır. Ancak, bunların tümü yansıtılmamalıdır. Örneğin, metin, iş logosu veya analog saat içerenler yansıtılmamalıdır. Bit eşlemlerin yansıtmasını devre dışı bırakmak için, dwLayout içerisine LAYOUT_BITMAPORIENTATIONPRESERVED bitini ayarlayarak SetLayout’u çağırın. DC'de yansıtmayı devre dışı bırakmak için SetLayout(hdc, 0) çağrısı yapın.

Geçerli varsayılan düzeni sorgulamak için GetProcessDefaultLayout öğesini çağırın. Başarılı bir dönüş gerçekleşirse, pdwDefaultLayout LAYOUT_RTL veya 0 içerir. Cihaz bağlamının düzen ayarlarını sorgulamak için GetLayout'u çağırın. Başarılı bir dönüşte GetLayout , düzen ayarlarını LAYOUT_RTL ve LAYOUT_BITMAPORIENTATIONPRESERVED bitlerine göre gösteren bir DWORD döndürür.

Bir pencere oluşturulduktan sonra , SetWindowLong işlevini kullanarak düzeni değiştirirsiniz. Örneğin, kullanıcı var olan bir pencerenin kullanıcı arabirimi dilini Arapça veya İbranice'den Almanca'ya değiştirdiğinde bu gereklidir. Ancak, var olan bir pencerenin düzenini değiştirirken, pencerenin içeriğinin aynı düzende çizildiğinden emin olmak için pencereyi geçersiz kılmanız ve güncelleştirmeniz gerekir. Aşağıdaki kod örneği, pencere düzenini gerektiği gibi değiştiren örnek koddan alınmalıdır:

// 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
}

Yansıtmada, "sol" ve "sağ" yerine "yakın" ve "uzak" olarak düşünmelisiniz. Bunun yapılmaması sorunlara neden olabilir. Yansıtılmış pencerede sorunlara neden olan yaygın kodlama uygulamalarından biri, ekran koordinatları ile istemci koordinatları arasında eşleme yapılırken oluşur. Örneğin, uygulamalar bir denetimi pencereye konumlandırmak için genellikle aşağıdakine benzer bir kod kullanır:

// 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);

Dikdörtgenin sol kenarı yansıtılmış bir pencerede sağ kenar haline geldiğinden ve tam tersi olduğundan bu durum yansıtmada sorunlara neden olur. Bu sorunu önlemek için ScreenToClient çağrılarını aşağıdaki gibi MapWindowPoints çağrısıyla değiştirin:

// USE THIS FOR MIRRORING

GetWindowRect(hControl, (LPRECT) &rControlRect);
MapWindowPoints(NULL, hDialog, (LPPOINT) &rControlRect, 2)

Bu kod çalışır çünkü yansıtmayı destekleyen platformlarda, istemci penceresi yansıtıldığında MapWindowPoints sol ve sağ nokta koordinatlarını değiştirmek için değiştirilir. Daha fazla bilgi için MapWindowPoints'in Açıklamalar bölümüne bakın.

Yansıtılmış pencerelerde sorunlara neden olabilecek bir diğer yaygın uygulama, istemci koordinatları yerine ekran koordinatlarında uzaklıkları kullanarak nesneleri istemci penceresinde konumlandırmaktır. Örneğin, aşağıdaki kod, iletişim kutusundaki denetimi konumlandırmak için istemci koordinatlarındaki x konumu olarak ekran koordinatlarındaki farkı kullanır.

// 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);

Bu kod, iletişim penceresinde soldan sağa (LTR) düzen tarzı olduğunda ve istemcinin eşleme modu MM_TEXT olduğunda uygundur; çünkü istemci koordinatlarındaki yeni x konumu, kontrol ve ekran koordinatlarında iletişim kutusunun sol kenarları arasındaki farkla uyumlu hale gelir. Ancak, yansıtılmış bir iletişim kutusunda, sol ve sağ ters çevrilir, bu nedenle bunun yerine MapWindowPoints'i aşağıdaki gibi kullanmanız gerekir:

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)

İletişim Kutularını ve İleti Kutularını Yansıtma

İletişim kutuları ve ileti kutuları düzeni devralmadığından, düzeni açıkça ayarlamanız gerekir. İleti kutusunu yansıtmak için MB_RTLREADING seçeneğiyleMessageBox veya MessageBoxEx'i çağırın. İletişim kutusunu sağdan sola düzenlemek için, DLGTEMPLATEEX iletişim kutusu şablonu yapısındaki genişletilmiş stil WS_EX_LAYOUTRTL kullanın. Özellik sayfaları, iletişim kutularının özel bir örneğidir. Her sekme ayrı bir iletişim kutusu olarak kabul edilir, bu nedenle yansıtılmasını istediğiniz her sekmeye WS_EX_LAYOUTRTL stilini eklemeniz gerekir.

Pencereyle İlişkili Olmayan Cihaz Bağlamlarını Yansıtma

Meta dosyası veya yazıcı DC'leri gibi bir pencereyle ilişkilendirilmemiş DC'ler düzeni devralmadığından, düzeni açıkça ayarlamanız gerekir. Cihaz bağlam düzenini değiştirmek için SetLayout işlevini kullanın.

SetLayout işlevi windows ile nadiren kullanılır. Windows genellikle yalnızca WM_PAINT iletisini işlerken ilişkili bir DC alır. Bazen, bir program GetDC'yi çağırarak bir pencere için DC oluşturur. Her iki durumda da, DC'nin ilk düzeni pencerenin WS_EX_LAYOUTRTL bayrağına göre BeginPaint veya GetDC tarafından ayarlanır.

GetWindowOrgEx, GetWindowExtEx, GetViewportOrgEx ve GetViewportExtEx tarafından döndürülen değerler SetLayout çağrısından etkilenmez.

Düzen RTL olduğunda , GetMapMode MM_TEXT yerine MM_ANISOTROPIC döndürür. MM_TEXT ile SetMapMode çağrısı düzgün çalışır; yalnızca GetMapMode'dan döndürülen değer etkilenir. Benzer şekilde, eşleme modu MM_TEXT olduğunda SetLayout(hdc, LAYOUT_RTL) çağrılması, bildirilen eşleme modunun MM_ANISOTROPIC olarak değişmesine neden olur.

Pencere Yok Etme

Genel olarak, bir uygulamanın oluşturduğu tüm pencereleri yok etmesi gerekir. Bunu DestroyWindow işlevini kullanarak yapar. Bir pencere yok edildiğinde, sistem görünür durumdaysa pencereyi gizler ve ardından pencereyle ilişkili tüm iç verileri kaldırır. Bu, uygulama tarafından artık kullanılamayan pencere tutamacını geçersiz kılabilir.

Bir uygulama, oluşturduktan kısa süre sonra oluşturduğu pencerelerin çoğunu yok eder. Örneğin, bir uygulama genellikle kullanıcıdan görevine devam etmek için yeterli girişe sahip olduğu anda bir iletişim kutusu penceresini yok eder. Bir uygulama sonunda uygulamanın ana penceresini yok eder (sonlandırmadan önce).

Bir pencereyi yok etmeden önce, bir uygulama pencereyle ilişkili tüm verileri kaydetmeli veya kaldırmalı ve pencere için ayrılan sistem kaynaklarını serbest bırakmalıdır. Uygulama kaynakları serbest bırakmazsa sistem, uygulama tarafından serbest bırakılmayan tüm kaynakları serbest bırakır.

Bir pencereyi yok etmek, pencerenin oluşturulduğu pencere sınıfını etkilemez. Bu sınıf kullanılarak yeni pencereler oluşturulmaya devam edilebilir ve bu sınıfın mevcut pencereleri çalışmaya devam eder. Bir pencereyi yok etmek, pencerenin alt pencerelerini de yok eder. DestroyWindow işlevi önce pencereye, ardından alt pencerelerine ve bunlara bağlı alt pencerelere bir WM_DESTROY iletisi gönderir. Bu şekilde, yok edilen pencerenin tüm alt pencereleri de yok edilir.

Kullanıcı Kapat'a tıkladığında pencere menüsüne sahip bir pencere WM_CLOSE iletisi alır. Bir uygulama, bu iletiyi işleyerek pencereyi yok etmeden önce kullanıcıdan onay isteyebilir. Kullanıcı pencerenin yok edilmesi gerektiğini onaylarsa uygulama, pencereyi yok etmek için DestroyWindow işlevini çağırabilir.

Yok edilen pencere etkin pencereyse, hem etkin hem de odak durumları başka bir pencereye aktarılır. Etkin pencereye dönüşen pencere, ALT+ESC tuş bileşimi tarafından belirlenen bir sonraki penceredir. Yeni etkin pencere, klavye odağını alacak pencereyi belirler.