ขั้นตอนที่ 5: การเพิ่มเหตุการณ์

ขณะนี้คุณจะต้องเพิ่ม ClickIn และ ClickOut เหตุการณ์เพื่อควบคุมของคุณ ATL คุณจะไฟ ClickIn เหตุการณ์ถ้าผู้ใช้คลิภายในรูปหลายเหลี่ยมและไฟ ClickOut หากผู้ใช้คลิกภายนอก?

เมื่อคุณสร้างตัวควบคุมแบบเต็มในขั้นตอนที่ 2 คุณเลือก box.nbsp ตรวจสอบจุดเชื่อมต่อการสนับสนุน นี้สร้าง IPolyCtlEvents อินเทอร์เฟซในแฟ้มของคุณ.idl  หมายเหตุที่ชื่ออินเทอร์เฟซเริ่มต้น ด้วยการขีดเส้นใต้ นี่คือแบบแผนเพื่อบ่งชี้ว่า อินเทอร์เฟซที่เป็นอินเทอร์เฟซภายใน ปาน โปรแกรมที่อนุญาตให้คุณเรียกดูวัตถุ COM สามารถเลือกไม่แสดงอินเทอร์เฟซสำหรับผู้ใช้ นอกจากนี้ประกาศในไฟล์.idl ที่จุดเชื่อมต่อการสนับสนุนเพิ่มบรรทัดเพื่อบ่งชี้ว่า IPolyCtlEvents มีอินเทอร์เฟซสำหรับแหล่งข้อมูลเริ่มต้น แอตทริบิวต์ของแหล่งข้อมูลบ่งชี้ว่า ตัวควบคุมมีแหล่งที่มาของการแจ้งเตือน ดังนั้นมันจะเรียกอินเทอร์เฟซนี้บนคอนเทนเนอร์(&N)?

ขณะนี้คุณควรเพิ่มวิธีการ ClickIn และ ClickOut ไป IPolyCtlEvents อินเทอร์เฟซ:

  1. คลิกขวาบน IPolyCtlEvents ในClassViewและMethod… เพิ่มที่เลือกจากเมนูแบบผุดขึ้น?

  2. เลือกการส่งกลับชนิดของvoid?

  3. ชนิดของ ClickIn ในกล่องชื่อเมธอด?

  4. ใส่ [in] long x, [in] long y ในกล่องพารามิเตอร์?

  5. คลิกตกลง?

ตรวจสอบแฟ้ม.idl เพื่อดูว่า มีเพิ่มรหัสถูกเป็นวิธีการ IPolyCtlEvents dispinterface.nbsp จากนั้น ใช้กระบวนการเดียวกันเพื่อกำหนดเป็น ClickOut วิธี ด้วยพารามิเตอร์เดียวกันและส่งกลับชนิด  Dispinterface การ IPolyCtlEvents ในแฟ้มของคุณ.idl ควรมีลักษณะดังนี้(&N):

dispinterface _IPolyCtlEvents
{
   คุณสมบัติ:
   วิธีการ:
   [id(1), helpstring ("วิธี ClickIn ")] โมฆะ ClickIn ([ใน] ยาว x, [ใน] ยาว y);
   [id(2), helpstring ("วิธี ClickOut")] โมฆะ ClickOut ([ใน] ยาว x, [ใน] ยาว y);
}

ClickInและ ClickOut วิธีการที่ใช้เวลา x และ y ของจุด clicked คู่เป็นพารามิเตอร์?

ตอนนี้ สร้างไลบรารีชนิด การทำเช่นนี้ คุณสามารถทั้งสร้างโครงการของคุณ หรือคลิกขวาไฟล์.idl ในFileViewและคลิกCompile Polygon.idl นี้จะสร้างแฟ้ม Polygon.tlb ซึ่งเป็นไลบรารีชนิด?

ถัดไป ใช้อินเทอร์เฟซจุดเชื่อมต่อและติดต่อคอนเทนเนอร์จุดเชื่อมต่อสำหรับตัวควบคุมของคุณ (ใน COM เหตุการณ์มีการใช้งานผ่านกลไกของจุดเชื่อมต่อ การรับเหตุการณ์จากวัตถุ COM คอนเทนเนอร์ที่สร้างการเชื่อมต่อที่แนะนำไปยังจุดเชื่อมต่อที่ใช้วัตถุ COM เนื่องจากวัตถุ COM สามารถมีจุดเชื่อมต่อหลาย วัตถุ COM ยังใช้จุดเชื่อมต่ออินเทอร์เฟซคอนเทนเนอร์ ผ่านอินเทอร์เฟซนี้ ในคอนเทนเนอร์สามารถกำหนดจุดเชื่อมต่อที่ได้รับการสนับสนุน) อินเทอร์เฟซที่ใช้จุดเชื่อมต่อเรียกว่าIConnectionPointและอินเทอร์เฟซที่บรรจุจุดเชื่อมต่อที่ใช้เรียกว่าIConnectionPointContainer?

เพื่อช่วยในการใช้IConnectionPointใช้ClassViewในการเข้าถึงตัวช่วยสร้างจุดเชื่อมต่อ ตัวช่วยสร้างนี้สร้างอินเทอร์เฟซสำหรับIConnectionPointโดยไลบรารีชนิดของการอ่าน และการใช้งานฟังก์ชันสำหรับแต่ละเหตุการณ์ที่สามารถ fired?

เมื่อต้องการเรียกใช้ตัวช่วยสร้าง ทำตามขั้นตอนเหล่านี้:

  1. ไปที่ClassView (บนเมนูมุมมองคลิกพื้นที่ทำงานให้ดูที่ClassView)?

  2. คลิกขวาบนของตัวควบคุมของคุณใช้งานคลาส ในกรณีนี้CPolyCtl?

  3. ในเมนูทางลัด เลือกใช้การเชื่อมต่อ Point…?

  4. เลือก _PolyEvents จากอินเทอร์เฟซรายการจากนั้นคลิกตกลงและคลาพร็อกซีสำหรับจุดเชื่อมต่อจะถูกสร้างขึ้น ในกรณีนี้ CProxy_IPolyCtlEvents?

ถ้าคุณดูแฟ้ม PolygonCP.h สร้างขึ้นในFileViewคุณเห็นมีชั้นเรียกว่า CProxy_PolyCtlEvents ที่ได้มาจากIConnectionPointImpl นอกจากนี้ PolygonCP.h ยังกำหนดวิธีการสองวิธี Fire_ClickIn และ Fire_ClickOut ซึ่งใช้พารามิเตอร์พิกัดที่สอง เหล่านี้เป็นวิธีการคุณเรียกใช้เมื่อคุณต้องการใช้ไฟเหตุการณ์จากการควบคุมของคุณ?

ตัวช่วยสร้างยังเพิ่มCProxy_PolyEventsและIConnectionPointContainerImplของตัวควบคุมหลายสืบทอด list.nbsp ตัวช่วยสร้างการเปิดเผยIConnectionPointContainerนอกจากนี้สำหรับคุณ โดยการเพิ่มรายการที่เหมาะสมกับแผนที่ COM(&N)?

คุณใช้รหัสเพื่อสนับสนุนกิจกรรมเสร็จเรียบร้อยแล้ว ขณะนี้ เพิ่มบางรหัสลั่นเหตุการณ์ในขณะที่เหมาะสม จำไว้ คุณจะไฟแบบ ClickIn หรือ ClickOut เหตุการณ์เมื่อผู้ใช้คลิกที่ปุ่มเมาส์ด้านซ้ายในตัวควบคุม เมื่อต้องการค้นหาเมื่อผู้ใช้คลิกที่ปุ่ม แรกเพิ่มตัวจัดการข้อความWM_LBUTTONDOWN ในClassViewคลิกขวาบนคลา CPolyCtl และเลือกเพิ่ม Windows ข้อจัดการ...จาก menu.nbsp ลัด เลือกWM_LBUTTONDOWNจากรายการทางด้านซ้าย แล้วคลิกที่ปุ่ม'ตัวจัดการเพิ่ม คลิกตกลง(&N)?

ถัดไป เพิ่มรหัสใหม่ไปยังฟังก์ชันOnLButtonDownใน PolyCtl.h (ลบรหัสใด ๆ ที่วางไว้ โดยตัวช่วยสร้าง) เพื่อให้OnLButtonDownตอนนี้มีลักษณะดังนี้:

LRESULT CPolyCtl::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOLamp; bHandled)
{
   HRGN hRgn
   WORD xPos = LOWORD(lParam)  / / แนวนอนตำแหน่งของเคอร์เซอร์
   WORD yPos = HIWORD(lParam)  / / แนวตั้งตำแหน่งของเคอร์เซอร์

CalcPoints(m_rcPos)

/ / สร้างขอบเขตจากรายการของเราของจุด
   hRgn = CreatePolygonRgn (& m_arrPoint [0] m_nSides ชอน);

/ / ถ้าจุด clicked อยู่ในรูปหลายเหลี่ยมของเรา แล้วไฟ ClickIn
   / / เหตุการณ์อื่นที่เราไฟเหตุการณ์ ClickOut
   ถ้า (PtInRegion (hRgn, xPos, yPos))
      Fire_ClickIn (xPos, yPos);
   อื่น
      Fire_ClickOut (xPos, yPos);

/ / ลบขอบเขตที่เราสร้างขึ้น
   DeleteObject(hRgn)
   ส่งกลับค่า 0
}

เนื่องจากคุณมีแล้วคำนวณคะแนนได้ของรูปหลายเหลี่ยมในการ OnDraw งาน ใช้ใน OnLButtonDown เพื่อสร้างขอบเขต ใช้ฟังก์ชันPtInRegion API เพื่อตรวจสอบว่า จุด clicked ภายในรูปหลายเหลี่ยม หรือไม่แล้ว?

การ uMsg พารามิเตอร์เป็น ID ของข้อความของ Windows ที่ได้รับการจัดการ นี้ช่วยให้คุณมีฟังก์ชันหนึ่งที่จัดการกับช่วงของข้อความ wParamและ lParam เป็นค่ามาตรฐานสำหรับข้อความได้รับการจัดการ พารามิเตอร์ bHandled อนุญาตให้คุณระบุว่า ฟังก์ชันการจัดการข้อความ หรือไม่ โดยค่าเริ่มต้น ตั้งค่าเป็นTRUEเพื่อบ่งชี้ว่า ฟังก์ชันการจัดการข้อความ แต่คุณสามารถตั้งค่าให้เป็น FALSE. การทำเช่นนี้จะทำให้เกิด ATL สืบค้นหาฟังก์ชันอื่นของตัวจัดการข้อความการส่งข้อความ?

ตอนนี้ ลองใช้เหตุการณ์ของคุณ สร้างตัวควบคุม และเริ่มActiveX Control คอนเทนเนอร์ทดสอบอีกครั้ง เวลานี้ ดูแฟ้มบันทึกเหตุการณ์ window.nbsp กระบวนการผลิตเหตุการณ์ไปยังหน้าต่างแสดงผล เลือกเข้าสู่ระบบจากเมนูตัวเลือกและเลือกการล็อกเอาต์พุหน้าต่าง แทรกตัวควบคุมขณะนี้ และลองคลิกในหน้าต่าง สังเกตว่า ClickIn คือ fired ถ้าคุณคลิกในรูปหลายเหลี่ยมเติม และ ClickOut คือ fired เมื่อคุณคลิกภายนอกของมัน(&N)?

ถัดไป ที่คุณจะเพิ่มหน้าคุณสมบัติ?

|Nbspกลับไปยังขั้นตอนที่ 4 ขั้นตอนที่ 6(&N)

Index