หมายเหตุนี้อธิบายถึงงานประจำเกี่ยวกับ MFC ที่ลงทะเบียน es WNDCLASSพิเศษจำเป็นต้องใช้ Microsoft Windows MFC ใช้แอททริบิวต์เฉพาะของWNDCLASSและมีการกล่าวถึง Windows?
ปัญหา
แอตทริบิวต์ของวัตถุCWndเหมือนการHWNDใน Windows จะถูกเก็บไว้ในสถานที่สอง: หน้าต่างวัตถุและWNDCLASS การWNDCLASSอยู่ที่แตกต่างจากคลาส c ++ ชื่อของWNDCLASSถูกส่งไปฟังก์ชันการสร้างหน้าต่างทั่วไปเช่นCWnd::CreateและCFrameWnd::Createในพารามิเตอร์lpszClassName?
ต้องลงทะเบียนผ่านทางหนึ่งหมายถึงสี่นี้WNDCLASS:
WNDCLASSes และ MFC
โครงสร้างของWNDCLASSประกอบด้วยเขตข้อมูลต่าง ๆ ที่อธิบายในคลาสหน้าต่าง ต่อไปนี้เป็นเขตข้อมูลและวิธีใช้ในโปรแกรมประยุกต์ของ MFC?
| ลักษณะ | ลักษณะของหน้าต่าง: โปรดดูด้านล่าง |
| LpfnWndProc | หน้าต่าง proc ต้องเป็นAfxWndProc |
| CbClsExtra | ไม่ใช้ (ควรเป็นศูนย์) |
| CbWndExtra | ไม่ใช้ (ควรเป็นศูนย์) |
| HInstance | ถูกกรอกข้อมูลโดยอัตโนมัติด้วยAfxGetInstanceHandle |
| HIcon | ดูที่ไอคอนสำหรับกรอบ windows ด้านล่าง |
| HCursor | เคอร์เซอร์สำหรับเมื่อเมาส์อยู่เหนือหน้าต่าง ดูด้านล่าง |
| HbrBackground | สีพื้นหลัง ดูด้านล่าง |
| LpszMenuName | ไม่ใช้ (ควรเป็น NULL) |
| LpszClassName | ชื่อคลาส โปรดดูข้างล่าง |
มา WNDCLASSes
ในรุ่นก่อนหน้าของ MFC (ก่อนการ MFC 4.0), มีตัวเลขของคลาสหน้าต่างกำหนดไว้ล่วงหน้าให้ คลาสหน้าต่างเหล่านี้ไม่มีอีกต่อไปไว้ตามค่าเริ่มต้นเนื่องจากปัญหาทางเทคนิคที่เกี่ยวข้องกับการกำหนดรุ่น (MFC หลายรุ่นโหลดในพื้นที่หนึ่ง) เช่นเดียวกับข้อสงสัยที่เกี่ยวข้องกับข้อเท็จจริงว่า ทั้ง OLE ควบคุมและโปรแกรมประยุกต์ MFC อาจใช้ Dll ที่ MFC ต่าง ๆ?
การอ้างอิงต่อไปนี้มีไว้เพื่อช่วยให้โยกย้ายรหัสที่ใช้สิ่งเหล่านี้ที่เคย ให้ไว้WNDCLASSes นั้น แอปพลิเคชันควรใช้AfxRegisterWndClass (กับพารามิเตอร์เหมาะสม) ในตำแหน่งของชั้นเรียนเหล่านี้?
แสดงต่อไปนี้ชั้นและแอตทริบิวต์ของพวกเขา:
ถ้าแอพลิเคชันให้ทรัพยากร ด้วย ID ทรัพยากรที่ระบุ ID (ตัวอย่างเช่น AFX_IDI_STD_FRAME) MFC จะใช้ทรัพยากรที่ มิฉะนั้น ทรัพยากรเริ่มต้นจะใช้งาน สำหรับไอคอน ไอคอนโปรแกรมประยุกต์มาตรฐานใช้ และสำหรับเคอร์เซอร์ ใช้มาตรฐานศรเคอร์เซอร์?
มีไอคอนที่สองที่สนับสนุนโปรแกรมประยุกต์ MDI กับชนิดเอกสารเดี่ยว (ไอคอนหนึ่งสำหรับโปรแกรมประยุกต์หลัก ไอคอนอื่น ๆ สำหรับ เอกสาร/MDIChild iconic windows) สำหรับหลายชนิดของเอกสารด้วยไอคอนที่แตกต่างกัน คุณต้องลงทะเบียนเพิ่มเติมWNDCLASSes หรือใช้ฟังก์ชันCFrameWnd::LoadFrame?
CFrameWnd::LoadFrameจะลงทะเบียนWNDCLASSใช้แอตทริบิวต์ "AfxFrameOrView" มาตรฐาน แต่โดยใช้ ID ของไอคอนคุณระบุเป็นพารามิเตอร์แรกเป็น LoadFrame โดยอัตโนมัติ?
ค่าสำหรับสีพื้นหลังและเคอร์เซอร์สำหรับMDIFrameWndไม่ได้ใช้เนื่องจากพื้นที่ไคลเอ็นต์ของMDIFrameWndสมบูรณ์ครอบคลุม โดยหน้าต่าง "MDICLIENT" Microsoft ไม่แนะนำให้ subclassing หน้าต่าง "MDICLIENT" ดังนั้นใช้สีมาตรฐานและชนิดเคอร์เซอร์เมื่อเป็นไปได้?
Subclassing ควบคุม
แอตทริบิวต์WNDCLASSในการใช้งาน Windows ของตัวควบคุมนั้นได้รับหากคุณซับคลาสหรือซุปเปอร์คลาส Windows ควบคุม (ตัวอย่างCButton) แล้วคลาสของคุณโดยอัตโนมัติ?
ฟังก์ชัน AfxRegisterWndClass
MFC แสดงรูทีนช่วยเหลือสำหรับการลงทะเบียนคลาสหน้าต่าง กำหนดชุดของแอตทริบิวต์ (หน้าต่างชั้นลักษณะ เคอร์เซอร์ พื้นหลังแปรง และไอคอน), ชื่อสังเคราะห์จะถูกสร้างขึ้น และมีการลงทะเบียนคลาสหน้าต่างเป็นผลลัพธ์ ตัวอย่างเช่น,
const char * AfxRegisterWndClass (UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon)
ฟังก์ชันนี้ส่งกลับสตริชั่วคราวของคลาสชื่อหน้าต่างการลงทะเบียนที่สร้างขึ้น ดูข้อมูลอ้างอิงไลบรารีของคลาสสำหรับรายละเอียดเพิ่มเติม?
สตริงที่ส่งกลับเป็นตัวชี้การชั่วคราวเพื่อการบัฟเฟอร์สตริงสแตติกซึ่งมีผลบังคับใช้จนถึงการเรียกถัดไปเพื่อAfxRegisterWndClass ถ้าคุณต้องการเก็บสายนี้รอบ เก็บไว้ในตัวแปรCString ตัวอย่างเช่น,
CString strWndClass = AfxRegisterWndClass (CS_DBLCLK,...);
...
CWnd * pWnd = CWnd ใหม่
pWnd-gtสร้าง (strWndClass,...);(&G)
AfxRegisterWndClassจะโยนแบบCResourceExceptionถ้าคลาสหน้าต่างล้มเหลวในการลงทะเบียน (เนื่องจาก ของพารามิเตอร์ที่ไม่ถูกต้อง หรือหน่วย ความจำของ Windows)?
RegisterClass และฟังก์ชัน AfxRegisterClass
ถ้าคุณต้องการทำอะไรซับซ้อนกว่าAfxRegisterWndClassแสดง คุณอาจเรียกการ Windows API RegisterClassหรือฟังก์ชัน MFC AfxRegisterClass CWnd, CFrameWndและCMDIChildWnd สร้างฟังก์ชันขึ้นชื่อสตริงlpszClassNameสำหรับคลาสหน้าต่างที่เป็นพารามิเตอร์แรก ชื่อคลาสใด ๆ หน้าต่างสามารถใช้ คำนึงถึงว่ามันถูกลงทะเบียน?
สิ่งสำคัญคือการใช้AfxRegisterClass (หรือAfxRegisterWndClass) ใน DLL บน Win32 ยกเลิกการ Win32 โดยอัตโนมัติลงเรียนที่ลงทะเบียน โดย DLL ดังนี้จำต้องกระทำอย่างชัดเจนเมื่อ DLL จะบอก โดยใช้AfxRegisterClassแทนRegisterClassซึ่งทำโดยอัตโนมัติสำหรับคุณ AfxRegisterClassรักษารายการเรียนเฉพาะที่ลงทะเบียน โดย DLL ของคุณ และถอนการลงจะโดยอัตโนมัติทะเบียนแล้วเมื่อสิ้นสุดลง DLL เมื่อใช้RegisterClassใน DLL คุณต้องทำประกันว่า การเรียนทั้งหมดจะไม่ได้จดทะเบียนเมื่อ DLL จะหยุดการทำงาน (ในฟังก์ชันของคุณDllMain ) ความล้มเหลวในการดำเนินการดังกล่าวอาจทำให้เกิดRegisterClassล้มเหลวโดยไม่คาดคิดเมื่อ DLL ของคุณถูกใช้ โดยโปรแกรมประยุกต์ของไคลเอ็นต์อื่น?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)