Aracılığıyla paylaş


Pencere Sınıfları Hakkında

Her pencere sınıfı, aynı sınıfın tüm pencereleri tarafından paylaşılan ilişkili bir pencere yordamına sahiptir. Pencere yordamı, bu sınıfın tüm pencereleri için iletileri işler ve bu nedenle davranışlarını ve görünümlerini denetler. Daha fazla bilgi için bkz . Pencere Yordamları.

Bir işlemin, bu sınıfın penceresini oluşturabilmesi için önce bir pencere sınıfını kaydetmesi gerekir. Bir pencere sınıfının kaydedilmesi bir pencere yordamını, sınıf stillerini ve diğer sınıf özniteliklerini bir sınıf adıyla ilişkilendirir. Bir işlem CreateWindow veya CreateWindowEx işlevinde bir sınıf adı belirttiğinde, sistem bu sınıf adıyla ilişkili pencere yordamını, stilleri ve diğer öznitelikleri içeren bir pencere oluşturur.

Bu bölümde aşağıdaki konular ele alınmaktadır.

Pencere Sınıfı Türleri

Üç tür pencere sınıfı vardır:

Bu türler kapsam bakımından ve ne zaman ve nasıl kaydedilip yok edildiklerinde farklılık gösterir.

Sistem Sınıfları

Sistem sınıfı, sistem tarafından kaydedilen bir pencere sınıfıdır. Birçok sistem sınıfı tüm işlemlerin kullanımı için kullanılabilirken, diğerleri yalnızca sistem tarafından dahili olarak kullanılır. Sistem bu sınıfları kaydettirdiğinden, bir işlem bunları yok edemez.

Sistem, iş parçacıklarından biri bir Kullanıcı veya Windows Grafik Cihaz Arabirimi (GDI) işlevini ilk kez çağırdığında, bir işlem için sistem sınıflarını kaydeder.

Her uygulama, sistem sınıflarının kendi kopyasını alır. Aynı VDM'deki tüm 16 bit Windows tabanlı uygulamalar, 16 bit Windows'ta olduğu gibi sistem sınıflarını paylaşır.

Aşağıdaki tabloda, tüm işlemler tarafından kullanılabilecek sistem sınıfları açıklanmaktadır.

Sınıf Açıklama
Düğme Bir düğmenin sınıfı.
ComboBox Kombinasyon kutusu sınıfı.
Düzenle Düzenleme denetimi sınıfı.
ListBox Liste kutusunun sınıfı.
MDIClient MDI istemci penceresi sınıfı.
Kaydırma Çubuğu Kaydırma çubuğunun sınıfı.
Statik Statik denetim sınıfı.

 

Aşağıdaki tabloda, yalnızca sistem tarafından kullanılabilecek sistem sınıfları açıklanmaktadır. Tamlık uğruna burada listelenirler.

Sınıf Açıklama
ComboLBox Birleşik giriş kutusunda yer alan liste kutusunun sınıfı.
DDEMLEvent Dinamik Veri Değişimi Yönetim Kitaplığı (DDEML) olayları sınıfı.
Mesaj Mesaj içeren pencere sınıfı.
#32768 Menü sınıfı.
#32769 Masaüstü penceresinin sınıfı.
#32770 İletişim kutusunun sınıfı.
#32771 Görev geçişi penceresinin sınıfı.
#32772 Simge başlıkları sınıfı.

 

Uygulama Genel Sınıfları

Uygulama genel sınıfı, yürütülebilir dosya veya DLL tarafından kaydedilen ve işlemdeki diğer tüm modüllerin kullanımına sunulan bir pencere sınıfıdır. Örneğin, .dll özel denetimi uygulama genel sınıfı olarak tanımlayan bir pencere sınıfını kaydetmek için RegisterClassEx işlevini çağırabilir, böylece .dll yükleyen bir işlem özel denetimin örneklerini oluşturabilir.

Her işlemde kullanılabilecek bir sınıf oluşturmak için pencere sınıfını bir .dll oluşturun ve her işlemde .dll yükleyin. .dll her işlemde yüklemek için adını aşağıdaki kayıt defteri anahtarındaki AppInit_DLLs değerine ekleyin:

\ HKEY_LOCAL_MACHINEYazılım\Microsoft\Windows NT\CurrentVersion\Windows

Her bir işlem başlatıldığında, sistem belirtilen .dll'i yeni başlatılan işlem bağlamında yükler ve ardından giriş noktası işlevini çağırır. .dll başlatma yordamı sırasında sınıfı kaydetmeli ve CS_GLOBALCLASS stilini belirtmelidir. Daha fazla bilgi için bkz . Sınıf Stilleri.

Uygulama genel sınıfını kaldırmak ve onunla ilişkili depolama alanını boşaltmak için UnregisterClass işlevini kullanın.

Uygulama Yerel Sınıfları

Uygulama yerel sınıfı, bir yürütülebilir dosya veya .dll tarafından özel kullanım için kaydedilen herhangi bir pencere sınıfıdır. İstediğiniz sayıda yerel sınıfı kaydedebilirsiniz ancak yalnızca bir tane kaydetmek normaldir. Bu pencere sınıfı, uygulamanın ana penceresinin pencere yordamını destekler.

Sistem, yerel sınıfı kaydeden modül kapatıldığında yok eder. Bir uygulama ayrıca unregisterClass işlevini kullanarak yerel sınıfı kaldırabilir ve onunla ilişkili depolama alanını serbest bırakabilirsiniz.

Sistem Bir Pencere Sınıfını Nasıl Bulur?

Sistem, üç pencere sınıfı türünün her biri için yapıların listesini tutar. Bir uygulama belirtilen sınıfa sahip bir pencere oluşturmak için CreateWindow veya CreateWindowEx işlevini çağırdığında, sistem sınıfı bulmak için aşağıdaki yordamı kullanır.

  1. Belirtilen ada sahip ve örnek tanıtıcısı modülün örnek tanıtıcısıyla eşleşen bir sınıfı bulmak için uygulama yerel sınıfları listesinde arama yapın. (Çeşitli modüller aynı işlemde yerel sınıfları kaydetmek için aynı adı kullanabilir.)
  2. Ad uygulama yerel sınıf listesinde değilse, uygulama genel sınıfları listesinde arama yapın.
  3. Ad uygulama genel sınıf listesinde değilse sistem sınıfları listesinde arama yapın.

Uygulama tarafından oluşturulan tüm pencereler, iletişim kutuları gibi uygulama adına sistem tarafından oluşturulan pencereler de dahil olmak üzere bu yordamı kullanır. Diğer uygulamaları etkilemeden sistem sınıflarını geçersiz kılmak mümkündür. Yani bir uygulama, sistem sınıfıyla aynı ada sahip bir uygulama yerel sınıfını kaydedebilir. Bu, uygulama bağlamında sistem sınıfının yerini alır, ancak diğer uygulamaların sistem sınıfını kullanmasını engellemez.

Pencere Sınıfı Kaydetme

Pencere sınıfı, bir pencerenin stili, simgesi, imleci, menüsü ve pencere yordamı gibi özniteliklerini tanımlar. Pencere sınıfını kaydetmenin ilk adımı, WNDCLASSEX yapısını pencere sınıfı bilgileriyle doldurmaktır. Daha fazla bilgi için bkz. Pencere Sınıfının Öğeleri. Ardından, yapıyı RegisterClassEx işlevine geçirin. Daha fazla bilgi için bkz. Pencere Sınıflarını Kullanma.

Uygulama genel sınıfını kaydetmek için WNDCLASSEX yapısının stil üyesinde CS_GLOBALCLASS stilini belirtin. Uygulama yerel sınıfını kaydederken CS_GLOBALCLASS stilini belirtmeyin.

Window sınıfını RegisterClassEx, RegisterClassExA'nın ANSI sürümünü kullanarak kaydederseniz, uygulama sistemin ANSI karakter kümesini kullanarak oluşturulan sınıfın pencerelerine ileti metin parametrelerini geçirmesini isterse; Sınıfı RegisterClassEx,RegisterClassExW'nin Unicode sürümünü kullanarak kaydederseniz uygulama, sistemin oluşturulan sınıfın pencerelerine Unicode karakter kümesini kullanarak iletinin metin parametrelerini geçirmesini istemektedir. IsWindowUnicode işlevi, uygulamaların her pencerenin doğasını sorgulamasına olanak tanır. ANSI ve Unicode işlevleri hakkında daha fazla bilgi için bkz. İşlev Prototipleri için Kurallar.

Sınıfı kaydeden yürütülebilir dosya veya DLL, sınıfın sahibidir. Sistem, sınıf kaydedildiğinde RegisterClassEx işlevine geçirilen WNDCLASSEX yapısının hInstance üyesinden sınıf sahipliğini belirler. DLL'ler için hInstance üyesinin .dll örneğinin tanıtıcısı olması gerekir.

Sahibi .dll kaldırıldığında sınıf yok edilmez ve bütünlüğünü korur. Bu nedenle, sistem bu sınıfın penceresi için pencere yordamını çağırırsa, pencere yordamını içeren .dll artık bellekte olmadığından erişim ihlaline neden olur. İşlem, .dll kaldırılmadan ve UnregisterClass işlevini çağırmadan önce sınıfı kullanarak tüm pencereleri yok etmelidir.

Pencere Sınıfının Öğeleri

Bir pencere sınıfının öğeleri, sınıfına ait pencerelerin varsayılan davranışını tanımlar. Bir pencere sınıfı kaydeden uygulama, WNDCLASSEX yapısında uygun üyeleri ayarlayarak ve yapıyı RegisterClassEx işlevine geçirerek sınıfa öğeler atar. GetClassInfoEx ve GetClassLong işlevleri, belirli bir pencere sınıfı hakkındaki bilgileri alır. SetClassLong işlevi, uygulamanın önceden kaydettiği yerel veya genel sınıfın öğelerini değiştirir.

Tam bir pencere sınıfı birçok öğeden oluşsa da, sistem yalnızca bir uygulamanın bir sınıf adı, pencere yordamı adresi ve örnek tanıtıcısı sağlamasını gerektirir. İmlecin şekli ve pencerenin menüsünün içeriği gibi sınıfın pencereleri için varsayılan öznitelikleri tanımlamak için diğer öğeleri kullanın. WNDCLASSEX yapısının kullanılmayan üyelerini sıfır veya NULL olarak başlatmanız gerekir. Pencere sınıfı öğeleri aşağıdaki tabloda gösterildiği gibidir.

Öğe Amaç
Sınıf Adı Sınıfı diğer kayıtlı sınıflardan ayırır.
Pencere Yordamı Adresi sınıfındaki pencerelere gönderilen tüm iletileri işleyen ve pencerenin davranışını tanımlayan işlev işaretçisi.
Örnek Tanıtıcısı Sınıfı kaydeden uygulamayı veya .dll'ı tanımlar.
Sınıf İmleci Sistemin sınıfın bir penceresi için görüntülediği fare imlecini tanımlar.
Sınıf Simgeleri Büyük simgeyi ve küçük simgeyi tanımlar.
Sınıf Arka Plan Fırçası Pencere açıldığında veya boyandığında istemci alanını dolduran rengi ve deseni tanımlar.
Sınıf Menüsü Açıkça menü tanımlamayan pencereler için varsayılan menüyü belirtir.
Sınıf Stilleri Pencereyi taşıdıktan veya yeniden boyutlandırdıktan sonra nasıl güncelleştireceklerini, farenin çift tıklamalarını işlemeyi, cihaz bağlamı için alan ayırmayı ve pencerenin diğer yönlerini tanımlar.
Ek Sınıf Belleği Sistemin sınıf için ayırması gereken ek bellek miktarını bayt cinsinden belirtir. sınıfındaki tüm pencereler ek belleği paylaşır ve bunu uygulama tanımlı herhangi bir amaç için kullanabilir. Sistem bu belleği sıfıra başlatır.
Ek Pencere Belleği Sistemin sınıfa ait her pencere için ayırması gereken ek bellek miktarını bayt cinsinden belirtir. Ek bellek, uygulama tanımlı herhangi bir amaç için kullanılabilir. Sistem bu belleği sıfıra başlatır.

 

Sınıf Adı

Her pencere sınıfı, bir sınıfı diğerinden ayırt etmek için bir Sınıf Adı'na ihtiyaç duyar. WNDCLASSEX yapısının lpszClassName üyesini adı belirten null ile sonlandırılan dizenin adresine ayarlayarak bir sınıf adı atayın. Pencere sınıfları işleme özgü olduğundan, pencere sınıfı adlarının yalnızca aynı işlem içinde benzersiz olması gerekir. Ayrıca, sınıf adları sistemin özel atom tablosunda yer kapladığı için, sınıf adı dizelerini olabildiğince kısa tutmalısınız.

GetClassName işlevi, belirli bir pencerenin ait olduğu sınıfın adını alır.

Pencere İşlem Adresi

Her sınıfın, sınıftaki pencereler için tüm iletileri işlemek için kullanılan pencere yordamının giriş noktasını tanımlamak için bir pencere yordamı adresi gerekir. Sistem, pencerenin istemci alanını boyama veya kullanıcıdan gelen girişlere yanıt verme gibi görevleri gerçekleştirmesini gerektirdiğinde iletileri yordama geçirir. Bir süreç, adresini WNDCLASSEX yapısının lpfnWndProc üyesine kopyalayarak bir pencere yordamını bir sınıfa atar. Daha fazla bilgi için bkz . Pencere Yordamları.

Örnek İşaretçisi

Her pencere sınıfı, sınıfı kaydeden uygulamayı veya .dll'ı tanımlamak için bir örnek tanıtıcısı gerektirir. Sistem, tüm modülleri izleyebilmek için örnek tanıtıcılarına ihtiyaç duyar. Sistem, çalışan bir yürütülebilir dosyanın veya .dll'nın her kopyasına bir tanıtıcı atar.

Sistem, her yürütülebilir dosyanın giriş noktası işlevine bir örnek tanıtıcısı geçirir (bkz. WinMain) ve .dll (bkz. DllMain). Yürütülebilir dosya veya .dll, bu örnek tanıtıcısını WNDCLASSEX yapısının hInstance üyesine kopyalayarak sınıfa atar.

Sınıf İmleci

Sınıf imleci, sınıfındaki bir pencerenin istemci alanındayken imlecin şeklini tanımlar. İmleç pencerenin istemci alanına girdiğinde sistem imleci otomatik olarak verilen şekle ayarlar ve bu şeklin istemci alanında kaldığından emin olur. Pencere sınıfına imleç şekli atamak için LoadCursor işlevini kullanarak önceden tanımlanmış bir imleç şekli yükleyin ve sonra döndürülen imleç tutamacını WNDCLASSEX yapısının hCursor üyesine atayın. Alternatif olarak, özel bir imleç kaynağı sağlayın ve LoadCursor işlevini kullanarak uygulamanın kaynaklarından yükleyin.

Sistem sınıf imleci gerektirmez. Bir uygulama WNDCLASSEX yapısının hCursor üyesini NULL olarak ayarlarsa, hiçbir sınıf imleci tanımlanmamıştır. Sistem, pencerenin, imleç pencereye her geçtiğinde imleç şeklini ayarlıyor olduğunu varsayar. Pencere, WM_MOUSEMOVE iletisini her aldığında SetCursor işlevini çağırarak imleç şeklini ayarlayabilir. İmleçler hakkında daha fazla bilgi için bkz. İmleçler.

Sınıf Simgeleri

Sınıf simgesi, sistemin belirli bir sınıfın penceresini temsil etmek için kullandığı bir resimdir. Bir uygulamanın biri büyük diğeri küçük olmak üzere iki sınıf simgesi olabilir. Sistem, kullanıcı ALT+TAB tuşlarına bastığında görünen görev değiştirme penceresinde ve görev çubuğu ile gezginin büyük simge görünümlerinde bir pencerenin büyük sınıf simgesini görüntüler. Küçük sınıf simgesi, pencerenin başlık çubuğunda ve görev çubuğu ile gezginin küçük simge görünümlerinde görünür.

Pencere sınıfına büyük ve küçük bir simge atamak için, WNDCLASSEXyapısının hIcon ve hIconSm üyelerindeki simgelerin tutamaçlarını belirtin. Simge boyutları, büyük ve küçük sınıf simgeleri için gerekli boyutlara uygun olmalıdır. Büyük bir sınıf simgesi için, GetSystemMetrics işlevine yapılan bir çağrıda SM_CXICON ve SM_CYICON değerlerini belirterek gerekli boyutları belirleyebilirsiniz. Küçük bir sınıf simgesi için SM_CXSMICON ve SM_CYSMICON değerlerini belirtin. Bilgi için bkz. Simgeler.

Bir uygulama WNDCLASSEXyapısının hIcon ve hIconSm üyelerini NULL olarak ayarlarsa, sistem pencere sınıfı için büyük ve küçük sınıf simgeleri olarak varsayılan uygulama simgesini kullanır. Büyük bir sınıf simgesi belirtirseniz ancak küçük bir simge belirtmezseniz, sistem büyük olanı temel alan küçük bir sınıf simgesi oluşturur. Ancak, küçük bir sınıf simgesi belirtirseniz ancak büyük bir simge belirtmezseniz, sistem büyük sınıf simgesi olarak varsayılan uygulama simgesini ve küçük sınıf simgesi olarak belirtilen simgeyi kullanır.

WM_SETICON iletisini kullanarak belirli bir pencere için büyük veya küçük sınıf simgesini geçersiz kılabilirsiniz. WM_GETICON iletisini kullanarak geçerli büyük veya küçük sınıf simgesini alabilirsiniz.

Sınıf Arka Plan Fırçası

Sınıf arka plan fırçası, bir pencerenin istemci alanını uygulama tarafından sonraki çizim için hazırlar. Sistem, istemci alanını düz bir renk veya desenle doldurmak için fırçayı kullanır, böylece pencereye ait olsun veya olmasın önceki tüm görüntüleri bu konumdan kaldırır. Sistem, WM_ERASEBKGND iletisini pencereye göndererek bir pencereye arka planının boyanması gerektiğini bildirir. Daha fazla bilgi için bkz. Fırçalar.

Bir sınıfa arka plan fırçası atamak için, uygun GDI işlevlerini kullanarak bir fırça oluşturun ve döndürülen fırça tutamacını WNDCLASSEX yapısının hbrBackground üyesine atayın.

Bir uygulama fırça oluşturmak yerine hbrBackground üyesini standart sistem renk değerlerinden birine ayarlayabilir. Standart sistem renk değerlerinin listesi için bkz. SetSysColors.

Standart bir sistem rengi kullanmak için uygulamanın arka plan rengi değerini bir artırması gerekir. Örneğin , COLOR_BACKGROUND + 1, sistem arka plan rengidir. Alternatif olarak, GetSysColorBrush işlevini kullanarak standart sistem rengine karşılık gelen bir fırça tutamacını alabilir ve ardından WNDCLASSEX yapısının hbrBackground üyesinde tutamacı belirtebilirsiniz.

Sistem, bir pencere sınıfının arka plan fırçasına sahip olmasını gerektirmez. Bu parametre NULL olarak ayarlanırsa, WM_ERASEBKGND iletisini her aldığında pencerenin kendi arka planını boyaması gerekir.

Sınıf Menüsü

Sınıf menüsü, pencereler oluşturulduğunda açık bir menü verilmediğinde sınıftaki pencereler tarafından kullanılacak varsayılan menüyü tanımlar. Menü, kullanıcının uygulamanın gerçekleştirebileceği eylemleri seçebileceği komutların listesidir.

WNDCLASSEX yapısının lpszMenuName üyesini menünün kaynak adını belirten null ile sonlandırılan dizenin adresine ayarlayarak bir sınıfa menü atayabilirsiniz. Menü, verilen uygulamada bir kaynak olarak kabul edilir. Sistem gerektiğinde menüyü otomatik olarak yükler. Menü kaynağı bir adla değil tamsayıyla tanımlanırsa, uygulama değeri atamadan önce MAKEINTRESOURCE makrosunu uygulayarak lpszMenuName üyesini bu tamsayıya ayarlayabilir.

Sistem sınıf menüsü gerektirmez. Bir uygulama WNDCLASSEX yapısının lpszMenuName üyesini NULL olarak ayarlarsa, sınıftaki pencerelerin menü çubuğu yoktur. Sınıf menüsü verilmese bile, uygulama pencereyi oluştururken pencere için bir menü çubuğu tanımlamaya devam edebilir.

Bir sınıf için menü verilirse ve bu sınıfın alt penceresi oluşturulursa, menü dikkate alınmaz. Daha fazla bilgi için bkz. Menüler.

Sınıf Stilleri

Sınıf stilleri, pencere sınıfının ek öğelerini tanımlar. bit düzeyinde OR (|) işleci kullanılarak iki veya daha fazla stil birleştirilebilir. Bir pencere sınıfına stil atamak için, stili WNDCLASSEX yapısının stil üyesine atayın. Sınıf stillerinin listesi için bkz. Pencere Sınıfı Stilleri.

Sınıflar ve Cihaz Bağlamları

Cihaz bağlamı, uygulamaların pencerelerinin istemci alanında çizim için kullandığı özel bir değer kümesidir. Sistem, ekrandaki her pencere için bir cihaz bağlamı gerektirir, ancak sistemin bu cihaz bağlamını depolama ve ele etme konusunda biraz esneklik sağlar.

Cihaz bağlamı stili açıkça belirtilmemişse sistem, her pencerenin sistem tarafından tutulan bağlam havuzundan alınan bir cihaz bağlamı kullandığını varsayar. Bu gibi durumlarda, her pencere boyamadan önce aygıt bağlamını alıp başlatmalı ve boyadıktan sonra serbest bırakmalıdır.

Bir uygulama, bir pencereye çizim yapması gerektiğinde her seferinde cihaz bağlamı almaktan kaçınmak için pencere sınıfı için CS_OWNDC stilini belirtebilir. Bu sınıf stili, sistemi özel bir cihaz bağlamı oluşturmaya,yani sınıfındaki her pencere için benzersiz bir cihaz bağlamı ayırmaya yönlendirir. Uygulamanın bağlamı yalnızca bir kez alması ve ardından sonraki tüm boyamalar için kullanması gerekir.

Ekstra Sınıf Hafızası

Sistem, sistemdeki her pencere sınıfı için dahili olarak bir WNDCLASSEX yapısı tutar. Bir uygulama bir pencere sınıfını kaydettirdiğinde, sistemi WNDCLASSEX yapısının sonuna bir dizi ek bayt bellek ayırmaya ve eklemeye yönlendirebilir. Bu bellek , ek sınıf belleği olarak adlandırılır ve sınıfına ait tüm pencereler tarafından paylaşılır. Sınıfıyla ilgili tüm bilgileri depolamak için ek sınıf belleğini kullanın.

Sistemin yerel yığınından ek bellek ayrıldığından, bir uygulama fazladan sınıf belleğini tasarruflu bir şekilde kullanmalıdır. İstenen fazladan sınıf belleği miktarı 40 bayttan büyükse RegisterClassEx işlevi başarısız olur. Bir uygulama 40 bayttan fazla gerektiriyorsa, kendi belleğini ayırmalı ve ek sınıf belleğinde belleğe bir işaretçi depolamalıdır.

SetClassWord ve SetClassLong işlevleri fazladan sınıf belleğine bir değer kopyalar. Ek sınıf belleğinden bir değer almak için GetClassWord ve GetClassLong işlevlerini kullanın. WNDCLASSEX yapısının cbClsExtra üyesi, ayrılacak ek sınıf belleği miktarını belirtir. Fazladan sınıf belleği kullanmayan bir uygulamanın cbClsExtra üyesini sıfıra başlatması gerekir.

Ek Pencere Belleği

Sistem, her pencere için bir iç veri yapısı tutar. Bir pencere sınıfını kaydederken, uygulama fazladan pencere belleği olarak adlandırılan bir dizi ek bellek belirtebilir. Sınıfın bir penceresini oluştururken sistem, belirtilen miktarda ek pencere belleğini ayırır ve pencerenin yapısının sonuna ekler. Bir uygulama, pencereye özgü verileri depolamak için bu belleği kullanabilir.

Sistemin yerel yığınından ek bellek ayrıldığından, bir uygulama fazladan pencere belleğini dikkatli bir şekilde kullanmalıdır. İstenen fazladan pencere belleği miktarı 40 bayttan büyükse RegisterClassEx işlevi başarısız olur. Bir uygulama 40 bayttan fazla gerektiriyorsa, kendi belleğini ayırmalı ve ek pencere belleğinde belleğe bir işaretçi depolamalıdır.

SetWindowLong işlevi ek belleğe bir değer kopyalar. GetWindowLong işlevi ek bellekten bir değer alır. WNDCLASSEX yapısının cbWndExtra üyesi, ayrılacak ek pencere belleği miktarını belirtir. Belleği kullanmayan bir uygulamanın cbWndExtra'ı sıfıra başlatması gerekir.