TN001: Pencere sınıf kaydı
Bu not özel kayıt mfc yordamları açıklar wndclasses Microsoft Windows tarafından gerekli. Özel WNDCLASS mfc ve Windows tarafından kullanılan öznitelikleri açıklanmıştır.
Sorunu
Özniteliklerinin bir CWnd gibi nesne bir HWND Windows'da işlemek, iki ayrı yerde saklanır: window nesnesi ve WNDCLASS. Adı WNDCLASS genel pencere oluşturma işlevleri gibi geçirilen CWnd::Create ve CFrameWnd::Create , lpszClassName parametresi.
Bu WNDCLASS biri dört anlamına gelir kaydedilmesi gerekir:
Dolaylı olarak sağlanan mfc kullanılarak WNDCLASS.
Dolaylı olarak (veya başka bir denetim) Windows denetimi sınıflara göre.
Açıkça mfc çağırarak AfxRegisterWndClass veya AfxRegisterClass.
Açıkça Windows yordamını çağırarak RegisterClass.
wndclass alanları
WNDCLASS Pencere sınıfı açıklayan çeşitli alanlarının yapısı oluşur. Aşağıdaki tablo alanlarını gösterir ve mfc uygulamada nasıl kullanıldıkları belirtir:
Alan |
Description |
---|---|
lpfnWndProc |
Pencere proc olmalıdır birAfxWndProc |
cbClsExtra |
used (sıfır olmalıdır) |
cbWndExtra |
used (sıfır olmalıdır) |
hInstance |
ile otomatik olarak doldurulur.AfxGetInstanceHandle |
hIcon |
Bkz: çerçeve windows simgesi aşağıda |
hCursor |
Fare pencere üzerinde olduğunda için imleci bakın aşağıda |
hbrBackground |
arka plan rengi, aşağıya bakın |
lpszMenuName |
used (null olmalıdır) |
lpszClassName |
Sınıf adı, aşağıya bakın |
WNDCLASSes sağlanan
mfc (mfc 4.0) önce önceki sürümlerinde sağlanan önceden tanımlanmış birkaç pencere sınıfı. Bu pencere sınıflarına artık varsayılan olarak sağlanır. Uygulamaları kullanması gereken AfxRegisterWndClass uygun parametrelerle birlikte.
Uygulama kaynağı belirtilen kaynak kimliği (örneğin, AFX_IDI_STD_FRAME) ile sağlıyorsa, mfc bu kaynağı kullanır. Aksi halde varsayılan kaynak kullanır. Simge için standart uygulama simgesi kullanılır ve standart ok İmleç imleci için kullanılır.
İki simgeler tek belge türleriyle MDI uygulamaları destekler: ana uygulama için bir simge, diğer araçlarına simge şeklinde belge veya MDIChild windows simgesi. Farklı simgeleri içeren birden çok belge türleri için ek kaydetmeniz gerekir WNDCLASSes veya kullanım CFrameWnd::LoadFrame işlevi.
CFrameWnd::LoadFramekayıt bir WNDCLASS ilk parametre ve aşağıdaki standart öznitelikleri belirlediğiniz simgeyi kimliği kullanarak:
sınıf stil: cs_dblclks | CS_HREDRAW | CS_VREDRAW;
simge AFX_IDI_STD_FRAME
Ok imleç
COLOR_WINDOW arka plan rengi
Arka plan rengi ve imleci için değerleri CMDIFrameWnd bu yana istemci alanının kullanılmayan CMDIFrameWnd tarafından tamamen kapsadığı MDICLIENT pencere. Microsoft alt sınıflara ayırma teşvik değil MDICLIENT pencere böylece standart renkleri ve imleç türleri mümkün olduğunda kullanın.
Alt sınıflara ayırma ve Superclassing denetimleri
Denetimi için alt veya üst bir Windows (örneğin, CButton) sınıfınızın otomatik olarak alır, sonra WNDCLASS denetleyen Windows uygulamasında sağlanan öznitelikleri.
AfxRegisterWndClass işlevi
mfc pencere sınıfı kaydetme için yardımcı işlevi sağlar. (Pencere sınıfı stili, imlecin arka fırça ve simge) öznitelikler kümesi verilen, sentetik bir ad oluşturulur ve sonuç pencere sınıfı kaydedilir. Örnek:
const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);
Bu işlev, oluşturulan kayıtlı pencere sınıf adı, geçici bir dize döndürür. Bu işlevi hakkında daha fazla bilgi için bkz: AfxRegisterWndClass.
Döndürülen dize statik dizesi arabelleği geçici bir işaretçidir. Sonraki aramanın kadar geçerli olduğu AfxRegisterWndClass. Bu dize etrafında tutmak istiyorsanız, içinde saklamak bir CString Bu örnekte olduğu gibi değişken:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClassyaratacak bir CResourceException pencere sınıfı (hatalı parametre nedeniyle, ya Windows bellek yetersiz) kaydedemedi.
RegisterClass ve AfxRegisterClass işlevleri
Yapmak isterseniz bir şey daha ne gelişmiştir AfxRegisterWndClass sağlayan Windows API çağrısı RegisterClass veya mfc işlev AfxRegisterClass. CWnd, CFrameWnd ve CMDIChildWndCreate işlevleri ele bir lpszClassName pencere sınıfı ilk parametre olarak dize adı. Kaydetmek için kullanılan yöntem ne olursa olsun, herhangi bir kayıtlı pencere sınıf adı kullanabilirsiniz.
Kullanılması önemlidir AfxRegisterClass (veya AfxRegisterWndClass), bir Win32 dll. Win32 dll sona açıkça sınıfları kaydını gerekir böylece bir dll dosyası kayıtlı sınıflar kaydını otomatik olarak değil. Kullanarak AfxRegisterClass yerine RegisterClass bunu sizin için otomatik olarak gerçekleştirilir. AfxRegisterClassdll tarafından kaydedilen ve dll sonlandırıldığında otomatik olarak bunları kaydını benzersiz sınıfları listesi tutar. Kullandığınızda RegisterClass bir dll dosyası dll kesildiğinde tüm sınıflar kayıtlı olduğundan emin olmalısınız (içinde sizin DllMain işlevi). Aksi takdirde neden olabilecek RegisterClass başka bir istemci uygulaması dll kullanmaya çalıştığında beklenmedik şekilde başarısız.