เมื่อคุณแทรกตัวควบคุมใด ๆ ที่จำเป็นลงในตัวควบคุมประกอบ ขั้นตอนถัดไปเกี่ยวข้องกับการเพิ่มฟังก์ชันการทำงานใหม่ ฟังก์ชันนี้ใหม่มักจะจัดอยู่ในประเภทที่สอง:
สำหรับวัตถุประสงค์และขอบเขตของบทความนี้ ส่วนที่เหลือของส่วนนี้มุ่งเน้นแต่เพียงผู้เดียวในการจัดการเหตุการณ์?
สำหรับแต่ละมีอยู่ควบคุม ที่คุณต้องการจัดการเหตุการณ์จาก คุณต้องใช้อินเทอร์เฟซการสรุปข้อมูลเหตุการณ์ โดยมาจากการ IDispEventImplต้นแบบคลา ที่มานี้เสร็จเรียบร้อยในการประกาศของคอนโทรลของคอมโพสิต และประกอบด้วยสองพารามิเตอร์
ตัวอย่างโค้ดบรรทัดต่อไป พบในการประกาศคลาส base ประกาศอินเทอร์เฟซสำหรับIDispEventImplสำหรับตัวควบคุม ( IDC_CIRCCTRL1 ), เรียนคอมโพสิตควบคุม ( CMyCompositeCtrl )?
สาธารณะ IDispEventImpllt; IDC_CIRCCTL1, CMyCompositeCtrl & gt;
หลังจากประกาศจัดส่งคลาสของเหตุการณ์สำหรับตัวควบคุมที่มีอยู่ คุณจำเป็นต้องเพิ่มการแมปอ่างของเหตุการณ์ให้กับวัตถุประกอบควบคุม แผนที่นี้ช่วยทำในสิ่งที่สอง:
แผนที่อ่างเหตุการณ์ถูกนำมาใช้โดยใช้แมโครการกำหนดไว้ล่วงหน้าหลาย:
BEGIN_SINK_MAP(CtrlName)
ประกาศการเริ่มต้นของแผนผังอ่างเหตุการณ์สำหรับตัวควบคุมCtrlNameคอมโพสิต?
SINK_ENTRY(CtrlID, DispIID, dispID, ต้อง)
ประกาศการจัดการฟังก์ชัน (ต้อง) สำหรับเหตุการณ์ที่ระบุ (dispID), ของอินเทอร์เฟซในการสรุปข้อมูลDispIIDสำหรับตัวควบคุมที่ระบุโดยCtrlID?
ประกาศส่วนท้ายของแผนที่อ่างเหตุการณ์สำหรับตัวควบคุมCtrlNameคอมโพสิต?
ตัวอย่างรหัสต่อไป (อยู่ในนั้นCPP แฟ้มของตัวควบคุมประกอบ) ประกาศการแมปอ่างเหตุการณ์สำหรับการ CMyCompositeCtrl วัตถุ จะประกาศตัวจัดการเหตุการณ์ที่สองสำหรับตัวควบคุมมีอยู่สอง ( IDC_CIRCCTL1 และ IDC_CIRCCTL2 ) คลิกเหตุการณ์สำหรับตัวควบคุมทั้งสองถูกจัดการโดย OnClick_CircCtrl1 และ OnClick_CircCtrl2 ฟังก์ชัน?
BEGIN_SINK_MAP(CMyCompositeCtrl)
nbsp SINK_ENTRY (IDC_CIRCCTL1, DISPID_CLICK, OnClick_CircCtrl1)
SINK_ENTRY (IDC_CIRCCTL2, DISPID_CLICK, OnClick_CircCtrl2)
END_SINK_MAP()(&N)
หลังจากที่คุณได้ประกาศแผนผังอ่างเหตุการณ์ ดำเนินการใช้ตัวจัดการเหตุการณ์ที่ตัวควบคุมคอมโพสิต?
ในการประกาศของขั้นตอนการเหตุการณ์จม Map คุณสามารถเพิ่มแผนที่ใหม่ที่ประกาศตัวจัดการเหตุการณ์สองตัวควบคุม Circ มีอยู่สอง ขณะนี้เวลาที่จะใช้ตัวจัดการเหล่านี้ รูปแบบจะเป็นดังนี้:
retVal __stdcall ต้อง (มีอาร์กิวเมนต์)
{
nbsp เหตุการณ์ //handle firing อย่างเหมาะสม
}(&N)
ที่ retVal เป็นค่าส่งคืนของตัวจัดการเหตุการณ์ EventHandler คือชื่อของตัวจัดการฟังก์ชัน และ args เป็นรายการตัวเลือกของอาร์กิวเมนต์สำหรับเหตุการณ์นี้ ชื่อนี้ต้องตรงกับเหตุการณ์ตัวจัดการประกาศในแผนผังอ่างของคอมโพสิตของตัวควบคุมเหตุการณ์อย่างใดอย่างหนึ่ง?
ตัวอย่างรหัสต่อไปนี้กำหนดตัวจัดการเหตุการณ์ (เหตุการณ์คลิก) สำหรับตัวควบคุมที่มีอยู่ที่ถูกระบุด้วยIDC_CIRCCTRL1:
โมฆะ __stdcall OnClick_CircCtrl1 ()
{
nbsp MessageBox ("คลิกเหตุการณ์ fired, "CircCtl1", MB_OK);
}(&N)
เพิ่มตัวจัดการเหตุการณ์สำหรับรายการต่าง ๆ ที่เหลือจมในแผนที่ของคอนโทรลของคอมโพสิต?
ก่อนที่ตัวควบคุมประกอบกลายเป็นใช้งานอยู่ทั้งหมด ควบคุมที่แต่ละมีอยู่ ซึ่งเหตุการณ์ที่คุณกำลังจัดการ จะถูกสอบถามสำหรับอินเทอร์เฟซขาออก เช่นอินเทอร์เฟซการสรุปข้อมูลเหตุการณ์ หากพบอินเทอร์เฟซใด ๆ สร้างการเชื่อมต่อ และการอ้างอิงอินเทอร์เฟซสำหรับการออกใช้ในการจัดการเหตุการณ์จากตัวควบคุม กระบวนการนี้เรียกว่า "ตัวควบคุม advising" และทำได้โดยอัตโนมัติ ด้วยวัตถุคอมโพสิตควบคุม การใช้แผนที่อ่างเหตุการณ์ เมื่อการเตรียมใช้งานตัวควบคุมประกอบ?
หลังจากที่ผู้ใช้ได้ยกเลิกกล่องโต้ตอบ อ้างทั้งหมดเก็บไว้อิงอินเทอร์เฟซที่ขาออกจากตัวควบคุมที่มีอยู่จะทำความสะอาดขึ้น นี้เรียกว่า "ตัวควบคุม unadvising" และยังเสร็จโดยอัตโนมัติ โดยการควบคุมการประกอบ?