การใช้หน้าต่างที่ มี CWindowImpl

การใช้หน้าต่าง ชั้นที่สืบทอดมาจาก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?

Index