หมายเหตุนี้อธิบาย MFC งานประจำที่สนับสนุน Windows การแมปวัตถุที่จับกับ c ++วัตถุ?
ปัญหา
โดยปกติ Windows วัตถุจะแสดง โดยจัดการs คลาสที่ MFC ตัดจับวัตถุ Windows กับ c ++วัตถุ ฟังก์ชั่นตัดหมายเลขอ้างอิงของไลบรารีคลาส MFC มีวิธีการค้นหาวัตถุ c ++ที่มีการตัดวัตถุ Windows ที่ มีการจัดการเฉพาะ มีบางครั้งเมื่อวัตถุ Windows ไม่มีวัตถุที่แรปเปอร์สำหรับ c ++ อย่างไรก็ตาม และเวลาเหล่านี้วัตถุชั่วคราวถูกสร้างขึ้นเพื่อทำหน้าที่เป็นตัวแรปเปอร์สำหรับ c ++?
มีวัตถุ Windows ที่ใช้หมายเลขอ้างอิงแผนที่:
กำหนดหมายเลขการอ้างอิงใด ๆ ของวัตถุเหล่านี้ คุณสามารถค้นหาวัตถุ MFC ที่ตัดคำหมายเลขอ้างอิง โดยการเรียกฟังก์ชันสมาชิกคงFromHandle ตัวอย่างเช่น การกำหนดให้การHWNDเรียกว่าhWnd:
CWnd::FromHandle(hWnd)
จะกลับมาเป็นตัวชี้การCWndที่ตัดคำhWnd ถ้าhWndที่ไม่มีวัตถุแรปเปอร์สำหรับเฉพาะCWndแบบชั่วคราวถูกสร้างเพื่อตัดการhWnd ทำให้ได้รับวัตถุ c ++ถูกต้องจากหมายเลขอ้างอิงใด ๆ?
เมื่อคุณมีวัตถุ wrapper คุณสามารถรับของหมายเลขอ้างอิงผ่านตัวแปรสาธารณะสมาชิก ในกรณีของCWndมี, m_hWndมีHWNDสำหรับวัตถุ?
แนบหมายเลขอ้างอิงไปยังวัตถุ MFC
กำหนดให้วัตถุจับแรปเปอร์สำหรับสร้างขึ้นใหม่และตัวจัดการวัตถุ Windows คุณสามารถเชื่อมโยงทั้งสอง โดยเรียกแนบ ตัวอย่างเช่น:
CWnd myWnd
myWnd.Attach(hWnd)
นี้ทำให้รายการในแผนที่ถาวรประกอบmyWndและhWnd โทรCWnd::FromHandle(hWnd) จะเดี๋ยวนี้กลับเป็นตัวชี้ไปยังmyWnd เมื่อมีลบmyWnd , destructor ที่จะโดยอัตโนมัติทำลาย hWnd ที่ โดยการเรียกฟังก์ชัน Windows DestroyWindow ถ้านี่คือไม่ต้องhWndต้องถูกถอนจากmyWndก่อนคือทำลายวัตถุmyWnd (โดยปกติแล้วเมื่อออกจากขอบเขตที่myWndที่ถูกกำหนดไว้) ฟังก์ชันสมาชิกแยกออกทำงาน?
myWnd.Detach()
ข้อมูลเพิ่มเติมเกี่ยวกับวัตถุชั่วคราว
วัตถุชั่วคราวถูกสร้างขึ้นเมื่อใดก็ ตามที่FromHandleถูกกำหนดเป็นหมายเลขอ้างอิงที่ไม่มีวัตถุแรปเปอร์สำหรับ วัตถุชั่วคราวเหล่านี้จะถูกเอาออกจากหมายเลขอ้างอิงของตน และลบ โดยฟังก์ชันDeleteTempMap เริ่มต้นการประมวลผลOnIdleในCWinThreadเรียกDeleteTempMapสำหรับแต่ละชั้นที่สนับสนุนชั่วคราวหมายเลขอ้างอิงแผนที่โดยอัตโนมัติ ซึ่งหมายความ ว่า คุณไม่สามารถสมมติตัวชี้ไปยังวัตถุชั่วคราวจะถูกต้องผ่านจุดส่งออกจากฟังก์ชันที่ชี้มา เป็นวัตถุชั่วคราวจะถูกลบในระหว่างเวลาว่างของข้อความวนรอบของ Windows?
แรปเปอร์สำหรับวัตถุและหลาย ๆ กระทู้
วัตถุทั้งชั่วคราว และถาวรจะเก็บรักษาไว้บนพื้นฐานสำหรับแต่ละหัวข้อ กล่าวคือ หัวข้อหนึ่งไม่สามารถเข้าถึงหัวข้ออื่น c ++แรปเปอร์สำหรับวัตถุ คำนึงถึงไม่ว่าจะเป็นการชั่วคราว หรือถาวร ตามที่ระบุข้างต้น วัตถุชั่วคราวจะถูกลบเมื่อเธรดซึ่งเป็นส่วนหนึ่งของวัตถุชั่วคราวเข้าสู่OnIdle?
ผ่านวัตถุเหล่านี้จากหัวข้อที่หนึ่งไปยังอีก เสมอส่ง เหล่านั้นเป็นของตนเองท้องถิ่นจัดการพิมพ์ ผลผ่านวัตถุแรปเปอร์สำหรับ c ++จากหัวข้อที่หนึ่งไปยังอีกจะมักจะมาในผลลัพธ์ที่ไม่คาดคิด?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)