หมายเหตุนี้อธิบายถึงการสนับสนุน MFC สำหรับตัวควบคุมแบบกำหนดเอง และ self-drawing นอกจากนี้อธิบายไว้ subclassing แบบไดนามิก แสดงคำแนะนำทั่วไปในความเป็นเจ้าของของวัตถุCWnd vs. HWNDs?
โปรแกรมประยุกต์ตัวอย่าง MFC CTRLTEST แสดงหลายคุณลักษณะเหล่านี้ กรุณาอ้างอิงถึงรหัสแหล่งมาสำหรับตัวอย่างทั่วไปของ MFC CTRLTESTและวิธีใช้แบบออนไลน์?
เจ้าของวาดตัวควบคุม/เมนู
Windows ให้การสนับสนุนสำหรับ "การวาดรูปของเจ้าของ" การควบคุมและเมนู เหล่านี้คือข้อความ Windows ส่งไปที่หน้าต่างหลักของตัวควบคุมหรือเมนูที่ให้คุณสามารถกำหนดลักษณะที่ปรากฏและลักษณะการทำงานของตัวควบคุมเมนู?
MFC สนับสนุนเจ้าของรูปวาด ด้วยแผนผังรายการข้อความโดยตรง:
คุณสามารถแทนที่เหล่านี้ในCWndของคุณ-คลาส (โดยปกติแล้วกล่องโต้ตอบหรือหน้าต่างเฟรมหลัก) เพื่อใช้ลักษณะการทำงานของเจ้าของวาดมา?
วิธีการนี้ไม่ได้นำรหัสที่สามารถ ถ้าคุณมีตัวควบคุมสองที่คล้ายคลึงกันในกล่องโต้ตอบที่แตกต่างกันสอง คุณต้องใช้ลักษณะการทำงานของตัวควบคุมแบบกำหนดเองในสองตำแหน่ง ได้รับการสนับสนุน MFC self-drawing ควบคุมสถาปัตยกรรมช่วยแก้ปัญหานี้?
ตัวควบคุม self-Drawing และเมนู
MFC แสดงการใช้งานเริ่มต้น (ในCWndและCMenu) สำหรับข้อความมาตรฐานเจ้าของวาดรูป ใช้งานเป็นค่าเริ่มต้นนี้จะถอดรหัสพารามิเตอร์เจ้าของวาด และมอบความต้องการของเจ้าของวาดรูปลงในตัวควบคุมหรือเมนู นี้เรียกว่า "self-draw" เนื่องจากรหัสเปรียบ (วัด/เทียบ) รูปวาดอยู่ในคลาสของตัวควบคุมหรือเมนู ไม่มีอยู่ในหน้าต่างของเจ้าของ?
นี้ช่วยให้คุณสามารถสร้างคลาสที่สามารถควบคุมที่แสดงตัวควบคุมที่ใช้ "เจ้าของวาด" ความหมาย รหัสสำหรับตัวควบคุม ไม่เป็นเจ้าของตัวควบคุม การวาดในระดับชั้นควบคุมได้ นี่คือวิธีเชิงวัตถุการเขียนโปรแกรมควบคุมแบบกำหนดเอง?
CButton:DrawItem(LPDRAWITEMSTRUCT)
nbsp / / วาดปุ่มนี้(&N)
CMenu:MeasureItem(LPMEASUREITEMSTRUCT)
nbsp / / วัดขนาดของรายการในเมนูนี้
CMenu:DrawItem(LPDRAWITEMSTRUCT)
/ / วาดรายการในเมนูนี้(&N)
CListBox:MeasureItem(LPMEASUREITEMSTRUCT)
nbsp / / วัดขนาดของรายการในกล่องรายการนี้
CListBox:DrawItem(LPDRAWITEMSTRUCT)
/ / วาดรายการในกล่องรายการนี้
CListBox:CompareItem(LPCOMPAREITEMSTRUCT)
/ / เปรียบเทียบสองรายการในกล่องรายการนี้ถ้า LBS_SORT
CListBox:DeleteItem(LPDELETEITEMSTRUCT)
/ / ลบรายการจากกล่องรายการนี้(&N)
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT)
nbsp / / วัดขนาดของรายการในกล่องคำสั่งผสมนี้
CComboBox:DrawItem(LPDRAWITEMSTRUCT)
/ / วาดรายการในกล่องคำสั่งผสม
CComboBox:CompareItem(LPCOMPAREITEMSTRUCT)
/ / เปรียบเทียบสองรายการในกล่องคำสั่งผสมนี้ถ้า CBS_SORT
CComboBox:DeleteItem(LPDELETEITEMSTRUCT)
/ / ลบรายการจากกล่องคำสั่งผสมนี้(&N)
สำหรับรายละเอียดเกี่ยวกับเจ้าของวาด โครงสร้าง (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTและDELETEITEMSTRUCT) อ้างถึงเอกสาร MFC CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItemและCWnd::OnDeleteItemตามลำดับ?
ใช้ควบคุมและเมนู self-drawing
สำหรับเมนู self-drawing คุณต้องแทนที่ฟังก์ชันสมาชิกทั้งMeasureItemและDrawItem?
สำหรับกล่องรายการและกล่องคำสั่งผสม self-drawing คุณต้องแทนที่MeasureItemและDrawItem คุณต้องระบุลักษณะ OWNERDRAWVARIABLE ในต้นแบบการโต้ตอบ (LBS_OWNERDRAWVARIABLEและCBS_OWNERDRAWVARIABLEตามลำดับ) ลักษณะOWNERDRAWFIXEDจะไม่ทำงานกับ self-drawing สินค้าเนื่องจากความสูงสินค้าคงจะกำหนดก่อนที่แนบกับกล่องรายการตัวควบคุม self-drawing (สมาชิกชนะ 3.1 ฟังก์ชันCListBox::SetItemHeightและCComboBox::SetItemHeightสามารถใช้เลี่ยงข้อจำกัดนี้)
หมายเหตุนอกจากนี้ ให้ สลับไปยังรูปแบบOWNERDRAWVARIABLEจะมีผลต่อลักษณะNOINTEGRALHEIGHT เนื่องจากตัวควบคุมไม่สามารถคำนวณ ความสูงการ integral กับตัวแปรขนาดสินค้า ลักษณะเริ่มต้นของINTEGRALHEIGHTจะถูกละเว้น และตัวควบคุมอยู่เสมอNOINTEGRALHEIGHT ถ้ารายการของคุณได้รับการแก้ไขความสูง คุณสามารถป้องกันไม่ให้รายการบางส่วนถูกวาดโดยระบุการควบคุมมีขนาด ตัวคูณ integral ของขนาดของสินค้า?
สำหรับ self-drawing กล่องรายการและกล่องคำสั่งผสมที่ มีลักษณะการเรียงลำดับ (LBS_SORTและCBS_SORTตามลำดับ), คุณต้องแทนที่ฟังก์ชันสมาชิกCompareItem?
สำหรับกล่องรายการและกล่องคำสั่งผสม self-drawing, DeleteItemคือไม่ปกติแทน DeleteItemสามารถถูกเขียนทับถ้าหน่วยความจำเพิ่มเติมทรัพยากรอื่น ๆ จะถูกเก็บไว้กับแต่ละรายการกล่องคำสั่งผสมกล่องรายการ?
ตัวอย่างของตัวควบคุม Self-Drawing/เมนู
ตัวอย่างทั่วไปของ MFC CTRLTESTแสดงตัวอย่างเมนู self-draw (แสดงสี) และกล่องรายการ self-draw (ยังแสดงสี)?
ตัวอย่างทั่วไปมากที่สุดของปุ่ม self-drawing มีปุ่มบิตแมป (ปุ่มที่แสดงหนึ่ง ตั้งแต่สองสามรูปบิตแมปสำหรับอเมริกาต่างกัน) นี้มีให้ในชั้นเรียน MFC CBitmapButton?
Subclassing แบบไดนามิก
Subclassing คือ คำว่า Windows สำหรับแทนWndProcของหน้าต่างกับWndProcแตกต่างกัน และเรียกตัวเก่าWndProcสำหรับฟังก์ชันการทำงานเริ่มต้น (ซุปเปอร์คลาส)?
นี้ควรแยกแยะกับที่มาของคลาส c ++ (c ++คำศัพท์ใช้คำว่า "พื้นฐาน" และ "มา" ในขณะที่แบบวัตถุ Windows ใช้ "ซูเปอร์" และ "sub") C ++ที่มากับ subclassing MFC และ Windows จะ functionally เหมือน ยกเว้น c ++ไม่สนับสนุนคุณลักษณะคล้ายคลึงกับแบบไดนามิก subclassing?
คลาCWndแสดงการเชื่อมต่อระหว่างวัตถุ c ++ (มาจากCWnd) และวัตถุหน้าต่าง Windows (เรียกอีกอย่างว่าการHWND)?
มีสามวิธีทั่วไปเหล่านี้เกี่ยวข้อง:
กรณีนี้ครั้งล่าสุดเสร็จสมบูรณ์แล้ว ด้วยฟังก์ชันสมาชิก:
ตามปกติทั้งสองแนบวัตถุCWndกับการที่มีอยู่ Windows HWND SubclassWindowรับการHWNDโดยตรง และSubclassDlgItemเป็นผู้ช่วยเหลือที่ใช้เวลาเป็นตัวควบคุม ID และหน้าต่างหลัก (มักจะโต้ตอบ) SubclassDlgItemถูกออกแบบมาสำหรับการแนบวัตถุ c ++กับตัวควบคุมการโต้ตอบที่สร้างจากแม่แบบโต้ตอบ?
โปรดดู CTRLTESTตัวอย่างหลายตัวอย่างของการใช้SubclassWindowและSubclassDlgItem?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)