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:
Sağlanan
WNDCLASS
bir MFC kullanarak örtük olarak.Windows denetimini (veya başka bir denetimi) alt sınıfa alarak örtük olarak.
MFC AfxRegisterWndClass veya AfxRegisterClass'ı çağırarak açıkça.
Windows yordamı RegisterClass'ı çağırarak açıkça.
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 WNDCLASS
es 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 AfxRegisterWndClass
kadar 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, ...);
...
AfxRegisterWndClass
pencere 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
.