ขั้นตอนที่ 6: เพิ่มหน้าคุณสมบัติ

หน้าคุณสมบัติจะถูกนำมาใช้เป็นแยกวัตถุ COM ซึ่งอนุญาตให้หน้าคุณสมบัติร่วมถ้าจำเป็น เมื่อต้องการเพิ่มหน้าคุณสมบัติของตัวควบคุม คุณสามารถใช้ตัวช่วยสร้างวัตถุ ATL?

เริ่มตัวช่วยสร้างวัตถุ ATL และเลือกตัวควบคุมที่เป็นประเภทที่ด้านซ้าย เลือกหน้าคุณสมบัติด้านขวา แล้วคลิกถัดไป?

คุณได้รับกล่องโต้ตอบที่อนุญาตให้คุณป้อนชื่อของวัตถุใหม่อีกครั้ง เรียกใช้วัตถุ PolyProp ได้ และใส่ชื่อในกล่องแก้ไขชื่อย่อ?

สังเกตเห็นว่า เป็นสีเทากล่องแก้ไขInterface เนื่องจากหน้าคุณสมบัติที่ไม่ต้องการติดต่อแบบกำหนดเอง?

คลิกบนแท็บสายอักขระที่มีการกำหนดชื่อเรื่องของหน้าคุณสมบัติ ชื่อเรื่องของหน้าคุณสมบัติเป็นสายอักขระที่ปรากฏบนแท็บสำหรับเพจนั้น พิมพ์แอมป์รูปหลายเหลี่ยมเป็นชื่อเรื่อง Doc Stringเป็นคำอธิบายที่ใช้ใส่ในเคล็ดลับเครื่องมือหรือเส้นสถานะคุณสมบัติเฟรม หมายเหตุว่า กรอบคุณสมบัติมาตรฐานในปัจจุบันไม่ได้ใช้สายอักขระนี้ แต่คุณสามารถตั้งค่าต่อไป คุณกำลังจะไม่ไปสร้างHelpfileขณะนี้ เพื่อ ลบรายการในกล่องข้อความนั้น คลิกตกลงและคุณสมบัติหน้าวัตถุจะถูกสร้างขึ้น(&A)?

มีสร้างแฟ้มสามต่อไป:

แฟ้ม คำอธิบาย
PolyProp.h ประกอบด้วยชั้นเรียน c ++ CPolyProp ซึ่งใช้หน้าคุณสมบัติ?
PolyProp.cpp ประกอบด้วยแฟ้ม PolyProp.h?
PolyProp.rgs สคริปต์ของรีจิสทรีที่ลงทะเบียนวัตถุหน้าคุณสมบัติ?

ยังสามารถทำการเปลี่ยนแปลงรหัสต่อไปนี้:

ขณะนี้ ให้เพิ่มเขตข้อมูลที่คุณต้องการให้ปรากฏบนหน้าคุณสมบัติ ขอให้สังเกตว่า ใน Polygon.rc กล่องโต้ตอบจะว่างยกเว้นสำหรับป้ายชื่อที่บอกให้คุณแทรกตัวควบคุมของคุณที่นี่ ลบป้ายชื่อ และเพิ่มที่ประกอบด้วยข้อความ "ด้านข้าง: " ถัดจากป้ายชื่อเพิ่มกล่องแก้ไข และให้ ID ของIDC_SIDES?

รวม Polygon.h ที่ด้านบนของแฟ้ม PolyProp.h:

#รวม "Polygon.h"nbsp / / คำจำกัดความของ IPolyCtl(&N)

ตอนนี้ เปิดใช้งานการ CPolyProp คลาเพื่อตั้งค่าจำนวนของข้างในวัตถุของคุณเมื่อมีกดปุ่มApply เปลี่ยนแปลงการ Apply งานใน PolyProp.h เป็นดังนี้?

STDMETHOD(Apply)(void)
{
   USES_CONVERSION
   ATLTRACE(_T("CPolyProp::Apply\n"))
   สำหรับ (UINT ฉัน = 0 ฉัน lt; m_nObjects; i ++)
   {
      CComQIPtr < IPolyCtl และ IID_IPolyCtl > pPoly(m_ppUnk[i])
      สั้น nSides = (short)GetDlgItemInt(IDC_SIDES)
      ถ้าล้มเหลว (pPoly - > put_Sides(nSides))
      {
         CComPtr <IErrorInfo> pError
         CComBSTR strError
         GetErrorInfo (0, & pError);
         pError - > GetDescription(&strError)
         MessageBox(OLE2T(strError), _T("Error"), MB_ICONEXCLAMATION);
         กลับ E_FAIL
      }
   }
   m_bDirty = FALSE
   กลับ S_OK
}

หน้าคุณสมบัติอาจมีไคลเอนต์มากกว่าหนึ่งที่แนบอยู่กับแต่ละครั้ง ดังนั้นการ Apply ฟังก์ชันพาท่าน และเรียกใช้ put_Sides บนไคลเอนต์แต่ละค่าที่ดึงจากกล่องแก้ไขได้ คุณใช้คลาสCComQIPtrซึ่งทำการQueryInterfaceบนวัตถุแต่ละวัตถุเพื่อขอรับ การ IPolyCtl อินเทอร์เฟซจากIUnknown (จัดเก็บอยู่ใน m_ppUnk อาร์เรย์)?

รหัสเดี๋ยวนี้ตรวจสอบที่กำหนดคุณสมบัติด้านการทำงานจริง ถ้ามันล้มเหลว รหัสแสดงกล่องข้อความแสดงข้อผิดพลาดในรายละเอียดจากอินเทอร์เฟซสำหรับIErrorInfo โดยปกติ คอนเทนเนอร์ที่ถามวัตถุสำหรับอินเทอร์เฟซสำหรับISupportErrorInfoและเรียกInterfaceSupportsErrorInfoครั้งแรก การตรวจสอบว่า วัตถุสนับสนุนข้อมูลข้อผิดพลาดการตั้งค่า แต่เนื่องจากตัวควบคุมของคุณ คุณสามารถสละการตรวจสอบ?

CComPtrช่วยคุณ ด้วยการจัดการการนับ การอ้างอิงโดยอัตโนมัติดังนั้นคุณไม่จำเป็นต้องโทรออกบนอินเทอร์เฟซการ CComBSTRช่วยคุณ ด้วยการประมวลผลBSTRดังนั้นคุณไม่จำเป็นต้องทำการโทรSysFreeStringสุดท้าย คุณยังใช้หนึ่งชั้นแปลงสายอักขระต่าง ๆ ดังนั้นคุณสามารถแปลงการBSTRได้ถ้าจำเป็น (เป็นเหตุให้เราเพิ่มแมโคUSES_CONVERSIONที่เริ่มต้นของฟังก์ชัน)?

คุณยังต้องกำหนดค่าสถานะสกปรกของหน้าคุณสมบัติเพื่อบ่งชี้ว่า ปุ่มที่ใช้ควรจะเปิดใช้งาน ปัญหานี้เกิดขึ้นเมื่อผู้ใช้เปลี่ยนแปลงค่าในกล่องแก้ไขด้านข้าง คลิกขวาที่คุณสมบัติหน้าชั้น (CPolyProp) ในClassViewและจากนั้น เลือกเพิ่ม Windows ข้อจัดการ...จาก menu.nbsp ลัด เลือก IDC_SIDES จากกล่องวัตถุแล้ว เพิ่มข้อความ EN_CHANGE(&N)?

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

 LRESULT OnChangeSides(WORD wNotify, WORD wID, HWND hWnd, BOOLamp; bHandled)
{
   SetDirty(TRUE)
   ส่งกลับค่า 0
}(&A)

OnChangeSidesจะถูกเรียกเมื่อส่งข้อความWM_COMMANDกับEN_CHANGEสำหรับ IDC_SIDES ตัวควบคุม OnChangeSides แล้ว เรียก SetDirty และส่งจริงเพื่อบ่งชี้ถึงตอนหน้าคุณสมบัตินี้สกปรก และควรเปิดใช้งานปุ่มApply?

ขณะนี้ เพิ่มหน้าคุณสมบัติการควบคุมของคุณ ตัวช่วยสร้างวัตถุ ATL ไม่ทำให้คุณโดยอัตโนมัติ เนื่องจากไม่สามารถมีตัวควบคุมหลายตัวในโครงการของคุณ เปิด PolyCtl.h และเพิ่มบรรทัดนี้ลงการแมปคุณสมบัติ:

   PROP_ENTRY ("ด้าน" 1, CLSID_PolyProp)

การแมปคุณสมบัติของตัวควบคุมที่ขณะนี้มีลักษณะดังนี้:

BEGIN_PROP_MAP(CPolyCtl)
   PROP_DATA_ENTRY ("_cx", m_sizeExtent.cx, VT_UI4)
   PROP_DATA_ENTRY ("_cy", m_sizeExtent.cy, VT_UI4)
   PROP_ENTRY ("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage)
   PROP_ENTRY ("ด้าน" 1, CLSID_PolyProp)
   / / ตัวอย่างรายการ
   / / PROP_ENTRY ("คุณสมบัติอธิบาย" dispid, clsid)
   / / PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

คุณไม่สามารถเพิ่มการ PROP_PAGE แมโครด้วย CLSID ของหน้าคุณสมบัติ แต่ถ้าคุณใช้ PROP_ENTRY แมโครที่แสดง ด้านค่าคุณสมบัติยังได้บันทึกไว้เมื่อมีบันทึกตัวควบคุมได้ พารามิเตอร์สามในแมโครคือ คำอธิบายคุณสมบัติ DISPID ของคุณสมบัติ และ CLSID ของหน้าคุณสมบัติที่มีคุณสมบัติในการ นี้มีประโยชน์ถ้า เช่น คุณโหลดตัวควบคุมลงใน Visual Basic และตั้งค่าหมายเลขของด้านเวลาการออกแบบ เนื่องจากมีบันทึกจำนวนข้าง เมื่อคุณโหลดโครงการ Visual Basic ของคุณหมายเลขของด้านข้างจะคืนค่า?

ตอนนี้สร้างตัวควบคุมนั้น และใส่ลงในคอนเทนเนอร์การทดสอบตัวควบคุม ActiveX ในคอนเทนเนอร์ทดสอบบนเมนูแก้ไขคลิวัตถุคลา PolyCtl หน้าคุณสมบัติปรากฏ เลือกแท็บรูปหลายเหลี่ยม?

ปุ่มใช้ตอนแรกได้ถูกปิดใช้งาน กล่องแก้ไขเริ่มพิมพ์ค่าในด้าน และจะกลายเป็นการเปิดใช้ปุ่ม Apply หลังจากที่คุณเสร็จสิ้นการป้อนค่า คลิกปุ่มApply การเปลี่ยนแปลงการแสดงของตัวควบคุมและปุ่มApplyถูกปิดใช้อีกครั้ง ลองป้อนค่าไม่ถูกต้อง และคุณจะเห็นกล่องข้อความประกอบด้วยคำอธิบายข้อผิดพลาดที่คุณได้ตั้งค่าจากการ put_Sides ฟังก์ชัน?

ถัดไป คุณจะใส่ตัวควบคุมของคุณบนเว็บเพจ?

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

Index