มาพูดถึงโพสต์ล่าสุด “เผยแพร่ออบเจ็กต์ที่ได้มาจาก PrintDocument ที่รองรับการพิมพ์ข้อความจำนวนมากและทำให้ซอร์สโค้ดเป็นแบบสาธารณะ”
ในบทความ ฉันได้เผยแพร่ออบเจ็กต์ที่สืบทอดมาจาก System. Drawing.Printing.PrintDocument ออบเจ็กต์นี้รองรับการสร้างเอกสารงานพิมพ์จากสตรีมไฟล์และสตริงข้อความ ฉันไม่ได้ทดสอบอย่างระมัดระวังในขณะนั้น และพบว่ามีเหตุผลที่สำคัญ ข้อผิดพลาดในนั้น
อาการของจุดบกพร่องคือ หากคุณใช้การกำหนดสตริงเพื่อสร้างอินสแตนซ์ออบเจ็กต์ คุณจะแปลกใจที่พบว่าเนื้อหาเอกสารถูกพิมพ์สองครั้งระหว่างการแสดงตัวอย่างก่อนพิมพ์ และฉันก็ค้นพบปัญหานี้ในภายหลังเท่านั้น
หลังจากค้นหาก็พบสาเหตุแต่สาเหตุก็แปลก
หลักการคือเพื่อที่จะอ่านข้อความทีละบรรทัด ฉันใช้คลาส System.IO.StringReader เป็นตัวอ่าน ตัวสร้างของมันคือสตริงที่ถูกส่งผ่านเพื่อบันทึกเนื้อหาข้อความ จากนั้นใช้เมธอด StringReader.ReadLine() เพื่ออ่านข้อความและสร้างเนื้อหาที่พิมพ์
แต่ฉันต้องใช้กลไกในการตรวจสอบว่าผู้อ่านได้อ่านเนื้อหาล่าสุดหรือไม่ และเมธอด StringReader.Peek() คือการตรวจสอบว่ามีเนื้อหาอยู่ข้างหลังหรือไม่ และหากไม่มีเนื้อหาก็จะคืนค่าเป็น -1 . หลังจากการทดสอบของฉัน ไม่ว่าจะตรวจพบด้วยวิธีใดก็ตาม -1 จะไม่ถูกส่งกลับ แต่ -1 จะถูกส่งกลับหลังจากป้อนเนื้อหาสองครั้ง ซึ่งทำให้เนื้อหาเดียวกันแสดงสองครั้ง
ข้อผิดพลาดนี้ได้รับการแก้ไขแล้ว ฉันแก้ไขวิธีการตรวจจับด้วยวิธีอื่น คราวนี้ไม่จำเป็นต้องพิมพ์เนื้อหาซ้ำสองครั้ง ใครโหลดแล้วกรุณาโหลดใหม่นะครับ
ตอนนี้เรามาพูดถึงการควบคุม PrintPreveiwControl
สิ่งแรกที่ควรทราบคือเป็นตัวควบคุมหน้าต่างแบบกำหนดเอง ไม่ใช่หน้าต่างแสดงตัวอย่างก่อนพิมพ์ใหม่ เป็นส่วนหนึ่งของหน้าต่างแสดงตัวอย่างก่อนพิมพ์ที่แสดงตัวอย่างก่อนพิมพ์ หากคุณต้องการใช้ คุณต้องสร้างแบบฟอร์มหน้าต่างแล้วจึงใช้งาน
พูดตามตรง หน้าต่างแสดงตัวอย่างก่อนพิมพ์ของ Microsoft ใน .net นั้นดูไม่ดีและใช้งานไม่ได้ง่าย ดังนั้น Microsoft จึงจัดให้มีการควบคุม System.Windows.Forms.PrintPreviewControl และการควบคุมนี้ก็ไม่ดีเช่นกัน สาเหตุหลักคือไม่รองรับล้อเลื่อนของเมาส์ และสิ่งที่สำคัญที่สุดคือไม่รองรับการนับหน้าในการพิมพ์ จำนวนหน้าที่ใช้ได้ระหว่างการแสดงตัวอย่างก่อนพิมพ์เป็นแอตทริบิวต์ที่จำเป็นสำหรับปุ่มต่างๆ เช่น "หน้าก่อนหน้า" และ "หน้าถัดไป" ในหน้าต่างแสดงตัวอย่างก่อนพิมพ์
ดังนั้นฉันจึงใช้ Reflector เพื่อถอดรหัสตัวควบคุม PrintPreviewControl ของ Microsoft ใช้โค้ดต้นฉบับและเพิ่มตัวจัดการเหตุการณ์ "OnMouseWheel" และ OnMouseWheel ได้รับการออกแบบมาโดยเฉพาะเพื่อจัดการการทำงานของล้อเมาส์เมื่อมีการเลื่อน เผยแพร่ซอร์สโค้ดด้วย
ฉันเพิ่มความคิดเห็นมากมายในวิธี OnMouseWheel เพื่อนๆ ที่ต้องการจัดการกับล้อเมาส์สามารถใช้หลักการของโค้ดนี้ได้
ดาวน์โหลด: คลิกที่นี่เพื่อดาวน์โหลด
http://www.cnblogs.com/submaie/archive/2006/08/11/474568.html