TN001: หน้าต่างลงทะเบียน

หมายเหตุนี้อธิบายถึงงานประจำเกี่ยวกับ 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)

Index