Aracılığıyla paylaş


TN001: Pencere Sınıfı Kaydı

Bu not, Microsoft Windows için gereken özel WNDCLASSes'leri kaydeden MFC yordamlarını açıklar. MFC ve Windows tarafından kullanılan belirli WNDCLASS öznitelikler ele alınıyor.

Sorun

Windows'daki bir HWND tanıtıcı gibi bir CWnd nesnesinin öznitelikleri iki yerde depolanır: pencere nesnesi ve WNDCLASS. adıWNDCLASS, lpszClassName parametresinde CWnd::Create ve CFrameWnd::Create gibi genel pencere oluşturma işlevlerine geçirilir.

Bunun WNDCLASS dört şekilde kaydedilmesi gerekir:

WNDCLASS Alanları

Yapı, WNDCLASS bir pencere sınıfını açıklayan çeşitli alanlardan oluşur. Aşağıdaki tablo alanları gösterir ve MFC uygulamasında nasıl kullanıldıklarını belirtir:

Alan Tanım
lpfnWndProc pencere proc, bir AfxWndProc
cbClsExtra kullanılmaz (sıfır olmalıdır)
cbWndExtra kullanılmaz (sıfır olmalıdır)
Hınstance otomatik olarak AfxGetInstanceHandle ile doldurulur
Hıcon simgesine tıklayın, aşağıya bakın
hCursor fare pencerenin üzerindeyken için imleç, aşağıya bakın
hbrBackground arka plan rengi, aşağıya bakın
lpszMenuName kullanılmaz (NULL olmalıdır)
lpszClassName sınıf adı, aşağıya bakın

Sağlanan WNDCLASSes

MFC'nin önceki sürümleri (MFC 4.0'ın öncesinde), önceden tanımlanmış birkaç Pencere sınıfı sağlamıştı. Bu Pencere sınıfları artık varsayılan olarak sağlanmadı. Uygulamalar uygun parametrelerle kullanmalıdır AfxRegisterWndClass .

Uygulama belirtilen kaynak kimliğine sahip bir kaynak sağlıyorsa (örneğin, AFX_IDI_STD_FRAME), MFC bu kaynağı kullanır. Aksi takdirde varsayılan kaynağı kullanır. Simge için standart uygulama simgesi kullanılır ve imleç için standart ok imleci kullanılır.

İki simge, tek belge türlerine sahip MDI uygulamalarını destekler: biri ana uygulama için simge, diğeri simgesel belge/MDIChild pencereleri simgesi. Farklı simgelere sahip birden çok belge türü için ek WNDCLASSes kaydetmeniz veya CFrameWnd::LoadFrame işlevini kullanmanız gerekir.

CFrameWnd::LoadFrame , ilk parametre olarak belirttiğiniz simge kimliğini ve aşağıdaki standart öznitelikleri kullanarak bir WNDCLASS kaydeder:

  • sınıf stili: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • simge AFX_IDI_STD_FRAME

  • ok imleci

  • arka plan rengini COLOR_WINDOW

CMDIFrameWnd için arka plan rengi ve imleç değerleri kullanılmaz çünkü istemci alanı CMDIFrameWnd MDICLIENT penceresi tarafından tamamen kapsanmıştır. Microsoft, MDICLIENT penceresinin alt sınıfını teşvik etmez, bu nedenle mümkün olduğunda standart renkleri ve imleç türlerini kullanın.

Alt Sınıflama ve Üst Sınıflama Denetimleri

Bir Windows denetimini (örneğin, CButton) alt sınıfa alıyor veya üst sınıfa alıyorsanız, sınıfınız bu denetimin WNDCLASS Windows uygulamasında sağlanan öznitelikleri otomatik olarak alır.

AfxRegisterWndClass İşlevi

MFC, bir pencere sınıfını kaydetmek için bir yardımcı işlev sağlar. Öznitelik kümesi (pencere sınıfı stili, imleç, arka plan fırçası ve simge) verildiğinde yapay bir ad oluşturulur ve sonuçta elde edilen pencere sınıfı kaydedilir. Örneğin,

const char* AfxRegisterWndClass(UINT nClassStyle,
    HCURSOR hCursor,
    HBRUSH hbrBackground,
    HICON hIcon);

Bu işlev, oluşturulan kayıtlı pencere sınıfı adının geçici dizesini döndürür. Bu işlev hakkında daha fazla bilgi için bkz . AfxRegisterWndClass.

Döndürülen dize, statik dize arabelleğine geçici bir işaretçidir. Bir sonraki çağrısına AfxRegisterWndClasskadar geçerlidir. Bu dizeyi buralarda tutmak istiyorsanız, bu örnekte olduğu gibi bir CString değişkeninde depolayın:

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);

...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);

...

AfxRegisterWndClasspencere sınıfı kaydedilemediyse (hatalı parametreler veya Windows belleği yetersiz olduğundan) CResourceException oluşturur.

RegisterClass ve AfxRegisterClass İşlevleri

Sağladığından AfxRegisterWndClass daha karmaşık bir şey yapmak istiyorsanız, Windows API'sini RegisterClass veya MFC işlevini AfxRegisterClassçağırabilirsiniz. CWnd, CFrameWnd ve CMDIChildWndCreate işlevleri, pencere sınıfı için ilk parametre olarak lpszClassName dize adını alır. Kaydetmek için kullandığınız yöntemden bağımsız olarak herhangi bir kayıtlı pencere sınıfı adı kullanabilirsiniz.

Win32'de DLL'de (veya AfxRegisterWndClass) kullanmak AfxRegisterClass önemlidir. Win32, DLL tarafından kaydedilen sınıfların kaydını otomatik olarak kaldırmaz, bu nedenle DLL sonlandırıldığında sınıfların kaydını açıkça kaldırmanız gerekir. Bunun yerine RegisterClass kullanılarak AfxRegisterClass sizin için otomatik olarak işlenir. AfxRegisterClass DLL'niz tarafından kaydedilen benzersiz sınıfların listesini tutar ve DLL sonlandırıldığında bunların kaydını otomatik olarak kaldırır. DLL'de kullandığınızda RegisterClass , DLL sonlandırıldığında (DllMain işlevinizde ) tüm sınıfların kaydının kaldırıldığından emin olmanız gerekir. Bunun yapılmaması, başka bir istemci uygulaması DLL'nizi kullanmaya çalıştığında beklenmedik bir şekilde başarısız olabilir RegisterClass .

Ayrıca bkz.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar