TN014: ตัวควบคุมแบบกำหนดเอง

หมายเหตุนี้อธิบายถึงการสนับสนุน 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" เนื่องจากรหัสเปรียบ (วัด/เทียบ) รูปวาดอยู่ในคลาสของตัวควบคุมหรือเมนู ไม่มีอยู่ในหน้าต่างของเจ้าของ?

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

สำหรับรายละเอียดเกี่ยวกับเจ้าของวาด โครงสร้าง (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)

Index