การใช้หน้าต่าง ชั้นที่สืบทอดมาจากCWindowImpl ในชั้นเรียนของคุณได้รับ ประกาศแผนที่แบบข้อความและฟังก์ชันตัวจัดการข้อความ ขณะนี้คุณสามารถใช้ของคลาสในสามวิธี:
สร้างหน้าต่างโดยใช้คลาส Windows ใหม่
CWindowImplมีแมโคDECLARE_WND_CLASSประกาศคลาสข้อมูลของ Windows แมโครนี้ใช้ฟังก์ชันGetWndClassInfoซึ่งใช้CWndClassInfoเพื่อกำหนดข้อมูลของคลา Windows ใหม่ เมื่อเรียกว่าCWindowImpl::Createลงทะเบียนคลาสนี้ Windows และหน้าต่างใหม่ถูกสร้างขึ้น?
หมายเหตุnbspCWindowImplผ่านค่า NULLในแมโคDECLARE_WND_CLASSร ซึ่งหมายความว่า ATL จะสร้างชื่อคลาส Windows เมื่อต้องการระบุชื่อของคุณเอง ส่งสตริการDECLARE_WND_CLASSในCWindowImplของคุณ-มาคลาส(&N)?
ต่อไปนี้เป็นตัวอย่างของคลาสที่ใช้หน้าต่างโดยใช้คลาส Windows ใหม่:
คลา CMyWindow: สาธารณะ CWindowImplltCMyWindow >, ...
{
สาธารณะ:
/ / ระบุชื่อของคลา Windows ใหม่อีก
DECLARE_WND_CLASS("MyName") / / ถ้าแมโครนี้ไม่ถูกระบุไว้ในของคุณ
/ / คลาส ATL จะสร้างชื่อคลาส
...
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER (WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
/ / ทำรหัสบางจิตรกรรม
ส่งกลับค่า 0
}
}
สร้างหน้าต่าง สร้างอินสแตนซ์ของ CMyWindow แล้ว เรียกเมธอดสร้าง?
หมายเหตุnbsp เมื่อต้องการแทนที่ข้อมูลเริ่มต้น Windows คลาส ใช้เมธอดGetWndClassInfoในชั้นเรียนของคุณได้รับ โดยการตั้งค่าสมาชิกCWndClassInfoเป็นค่าเหมาะสม(&N)?
Superclassing มีคลาส Windows ที่มีอยู่
แมโคDECLARE_WND_SUPERCLASSช่วยให้คุณสามารถสร้างหน้าต่าง Windows ที่มีอยู่ที่ superclasses คลา ระบุแมโครนี้ในCWindowImplของคุณ-มาคลา เหมือนหน้าต่าง ATL อื่น ข้อความที่ได้รับการจัดการ โดยการแมปข้อความ?
เมื่อคุณใช้DECLARE_WND_SUPERCLASSคลาส Windows ใหม่จะสามารถลงทะเบียน คลาสใหม่นี้จะเหมือนกับคลาสที่มีอยู่คุณระบุได้ แต่จะแทนหน้าต่างขั้นตอนกับCWindowImpl::WindowProc (หรือของฟังก์ชันที่แทนที่วิธีนี้)?
ต่อไปนี้เป็นตัวอย่างของคลา superclasses ที่แก้ไขมาตรฐานคลาส:
คลา CMyEdit: สาธารณะ CWindowImplltCMyEdit >, ...
{
สาธารณะ:
/ / "แก้ไข" เป็นชื่อของคลา Windows มาตรฐาน
/ / "MyEdit" เป็นชื่อของคลา Windows ใหม่
/ / ที่จะอิงตามระดับชั้นแก้ไข
DECLARE_WND_SUPERCLASS (การ "แก้ไข" "MyEdit")
...
BEGIN_MSG_MAP(CMyEdit)
MESSAGE_HANDLER (WM_CHAR, OnChar)
END_MSG_MAP()
LRESULT OnChar(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
/ / ทำอักขระบางรหัสจัดการ
}
}
เมื่อต้องการสร้างหน้าต่างแก้ไข superclassed สร้างอินสแตนซ์ของ CMyEdit แล้ว เรียกเมธอดสร้าง?
ดูข้อมูลเพิ่มเติมเกี่ยวกับ superclassing, Superclassing ขั้นตอนของหน้าต่างในWin32 SDK?
Subclassing มีหน้าต่างที่มีอยู่
ระดับชั้นย่อยที่มีหน้าต่างที่มีอยู่ การได้คลาสที่สืบทอดมาจากCWindowImplและประกาศข้อความแผน ในกรณีก่อนหน้านี้สอง หมายเหตุ อย่างไรก็ตาม ว่า คุณไม่ได้ระบุข้อมูลทุกคลาส Windows เนื่องจากคุณจะซับคลาสหน้าต่างมีอยู่แล้ว?
แทนที่จะสร้างการโทร โทรSubclassWindowและผ่านไปยังหน้าต่างที่มีอยู่ที่คุณต้องการระดับชั้นย่อยหมายเลขอ้างอิง เมื่อหน้าต่างคือ subclassed มันจะใช้CWindowImpl::WindowProc (หรือของฟังก์ชันที่แทนที่วิธีการนี้) ไปกับข้อความโดยตรงในการแมปข้อความ เพื่อแยกหน้าต่าง subclassed จากวัตถุของคุณ โทรUnsubclassWindow กระบวนงานหน้าต่างต้นฉบับของหน้าต่างแล้วจะถูกกู้คืน?
ดูข้อมูลเพิ่มเติมเกี่ยวกับ subclassing, Subclassing กระบวนงานของหน้าต่างในWin32 SDK?