TN030: กำหนดการพิมพ์และแสดงตัวอย่างก่อนพิมพ์

หมายเหตุนี้อธิบายขั้นตอนการพิมพ์ที่กำหนดเอง และตัวอย่างก่อนพิมพ์ และอธิบายถึงวัตถุประสงค์ของงานประจำการเรียกกลับที่ใช้ในCViewและติดต่อกลับตามปกติ และฟังก์ชันที่สมาชิกของCPreviewView?

ปัญหา

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

พิมพ์ที่มีประสิทธิภาพ

เมื่อโปรแกรมประยุกต์ MFC พิมพ์โดยใช้วิธีมาตรฐาน Windows นำสายออกแบบกราฟิก Device Interface (GDI) ทั้งหมดการ metafile ตัวในหน่วยความจำ เมื่อเรียกว่าEndPage , Windows เล่น metafile ที่หนึ่งครั้งสำหรับแต่ละแบนด์ทางกายภาพที่เครื่องพิมพ์ที่ต้องการพิมพ์หน้าเดียว แบบสอบถามในระหว่างนี้เรนเดอร์ GDI บ่อยแบบกระบวนการยกเลิกเพื่อพิจารณาว่า ควรไป โดยทั่วไปกระบวนการยกเลิกการอนุญาตข้อความจะถูกประมวลผลเพื่อให้ผู้ใช้อาจยกเลิกงานพิมพ์โดยใช้กล่องโต้ตอบพิมพ์?

ขออภัย นี้สามารถลดขั้นตอนการพิมพ์ ถ้าการพิมพ์ในโปรแกรมประยุกต์ของคุณต้องเร็วกว่าสามารถลุ้นรับได้ใช้เทคนิคมาตรฐาน คุณต้องใช้แถบด้วยตนเอง?

พิมพ์แถบ

เพื่อให้แถบสีด้วยตนเอง คุณต้องเกี่ยวกับปฏิบัติการวนรอบที่พิมพ์ซึ่งเมื่อสั่งพิมพ์จะเรียกว่าหลายครั้งต่อหน้า (ครั้งเดียวต่อวงดนตรี) การวนรอบที่พิมพ์ถูกนำมาใช้ในฟังก์ชันOnFilePrintใน viewprnt.cpp ในCViewของคุณ-มาคลาส คุณโอเวอร์โหลดฟังก์ชันนี้เพื่อให้ข้อความแผนผังรายการสำหรับการจัดการคำสั่งพิมพ์เรียกฟังก์ชันการพิมพ์ของคุณ คัดลอกชุดคำสั่งOnFilePrintและเปลี่ยนการวนรอบที่พิมพ์เพื่อใช้แถบ คุณอาจยัง ต้องการผ่านสี่เหลี่ยมแถบกับฟังก์ชันการพิมพ์ของคุณเพื่อให้คุณสามารถปรับรูปวาดตามส่วนของหน้าการพิมพ์?

ที่สอง คุณต้องบ่อยโทรQueryAbortในขณะวงการวาด มิฉะนั้น ขั้นตอนยกเลิกจะไม่ได้รับการเรียก และผู้ใช้จะไม่สามารถยกเลิกงานพิมพ์?

แสดงตัวอย่างก่อนพิมพ์: nbsp กระดาษอิเล็กทรอนิกส์ ด้วยส่วนติดต่อผู้ใช้(&N)

พิมพ์ตัวอย่าง in essence พยายามที่จะเปิดการแสดงในแบบจำลองของเครื่องพิมพ์ โดยค่าเริ่มต้น พื้นที่ไคลเอ็นต์ของหน้าต่างหลักจะใช้เพื่อแสดงหน้าหนึ่ง หรือสองอย่างเต็มที่ภายในหน้าต่าง ผู้ใช้จะสามารถขยายพื้นที่ของหน้าเพื่อดูรายละเอียดเพิ่มเติม ด้วยการสนับสนุนเพิ่มเติม ผู้ใช้อาจแม้แต่ได้รับอนุญาตให้แก้ไขเอกสารในโหมดแสดงตัวอย่าง?

ตัวอย่างก่อนพิมพ์ที่กำหนดเอง

หมายเหตุนี้เท่านั้นเกี่ยวข้องกับด้านของการปรับเปลี่ยนตัวอย่างก่อนพิมพ์: เพิ่ม UI โหมดแสดงตัวอย่าง ปรับเปลี่ยนอื่น ๆ จะเป็นไปได้ แต่เปลี่ยนแปลงเช่นมีขอบเขตของการสนทนานี้?

สั้น ๆ กระบวนการเพิ่ม UI โหมดแสดงตัวอย่างคือ:

  1. การได้ดูคลาสที่สืบทอดมาจากCPreviewView?

  2. ตัวจัดการคำสั่งสำหรับด้าน UI ที่คุณต้องเพิ่ม?

  3. ถ้าคุณกำลังเพิ่มภาพในลักษณะการแสดง แทนที่OnDrawและทำรูปวาดของคุณหลังจากโทรศัพท์CPreviewView::OnDraw.

OnFilePrintPreview

นี้เป็นตัวจัดการคำสั่งสำหรับการแสดงตัวอย่างก่อนพิมพ์ เริ่มต้นใช้งานคือ:

โมฆะ CView::OnFilePrintPreview()
{
 nbsp  / / ในคลาสที่ได้รับ ใช้หน้าต่างพิเศษจัดการที่นี่
    / / ให้แน่ใจว่า Unhook กรอบหน้าต่างปิดถ้าขึ้นไดรฟ์

/ / ต้องไม่สร้างนี้บนเฟรม ต้อง outlive ฟังก์ชันนี้
    CPrintPreviewState * pState = CPrintPreviewState ใหม่

if (!DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR นี้
                RUNTIME_CLASS(CPreviewView), pState))
    {
        / / ในคลาสที่ได้รับ ย้อนกลับการจัดการหน้าต่างพิเศษ
        / / here สำหรับกรณีความล้มเหลวของการแสดงตัวอย่าง

TRACE0 ("ข้อผิดพลาด: ไม่สามารถ DoPrintPreview ");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE)
        ลบ pState      / / ตัวอย่างไม่สามารถเตรียมใช้งาน, / / ลบสถานะในขณะนี้
    }
}(&N)

DoPrintPreviewจะซ่อนบานหน้าต่างหลักของโปรแกรมประยุกต์ ตัวควบคุมแถบ เช่นแถบสถานะ สามารถรักษา โดยการระบุไว้ในการ pState-gtสมาชิกของdwStates (เป็นรูปแบบการทำงานแบบบิตและบิตแถบควบคุมแต่ละตัวจะกำหนดโดยAFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)) หน้าต่าง pState - >nIDMainPaneเป็นหน้าต่างที่จะถูกซ่อนอยู่ และโดยอัตโนมัติโดย reshown DoPrintPreviewแล้วจะสร้างแถบที่มีปุ่มสำหรับการแสดงตัวอย่างมาตรฐาน UI ถ้าจำเป็นต้องจัดการหน้าต่างพิเศษ เช่นการซ่อน หรือแสดงหน้าต่างอื่น ๆ ที่ควรจะทำก่อนDoPrintPreviewถูกเรียก?

โดยค่าเริ่มต้น เมื่อเสร็จสิ้นการแสดงตัวอย่างก่อนพิมพ์ จะส่งกลับค่าแถบควบคุมที่อเมริกาของต้นฉบับและบานหน้าต่างหลักการมองเห็น ถ้าจำเป็นสำหรับการจัดการพิเศษ มันควรจะทำในการแทนที่ของEndPrintPreview. ถ้าDoPrintPreviewล้มเหลว ยังมีการจัดการพิเศษ?

เรียกว่า DoPrintPreview ด้วย:

EndPrintPreview

นี้เรียกว่าการยกเลิกโหมดตัวอย่างก่อนพิมพ์ มักเป็นการย้ายไปยังหน้าในเอกสารที่ใช้ล่าสุดแสดงตัวอย่างก่อนพิมพ์ EndPrintPreviewเป็นโอกาสของโปรแกรมประยุกต์ที่ทำเช่นนั้น PInfo-gtm_nCurPageสมาชิกแสดงหน้าที่ล่า (สุดถ้าสองหน้าได้แสดง), และตัวชี้เป็นการแนะนำเป็นที่หน้า ผู้ใช้ถูกสนใจ เนื่องจากโครงสร้างของมุมมองของโปรแกรมประยุกต์ที่ไม่รู้จักกับกรอบ คุณต้องใส่รหัสเพื่อย้ายไปยังจุดที่เลือก(&G)?

คุณควรดำเนินการส่วนใหญ่กระทำก่อนการเรียกCView::EndPrintPreview เรียกนี้กลับค่าลักษณะพิเศษของDoPrintPreviewและลบ pView, pDC และ pInfo?

/ / ควรจะทำการล้างข้อมูลเพิ่มเติมใด ๆ ที่นี่
CView::EndPrintPreview (pDC, pInfo จุด pView)

CWinApp::OnFilePrintSetup

นี้ต้องถูกแมปสำหรับรายการเมนูการตั้งค่าการพิมพ์ ในกรณีส่วนใหญ่ มันไม่จำเป็นต้องแทนที่การใช้งาน?

หน้า Nomenclature

ปัญหาอื่นที่อยู่ของหมายเลขหน้าและการลำดับได้ สำหรับโปรแกรมประยุกต์ที่ประมวลผลคำวิชนิด นี้เป็นเรื่องตรงไปตรงมา ระบบตัวอย่างก่อนพิมพ์ส่วนใหญ่สมมติว่า หน้าที่พิมพ์สอดคล้องกับหนึ่งหน้าในเอกสาร?

ในการพยายามที่จะให้โซลูชัน generalized มีหลายสิ่งที่ควรพิจารณา จินตนาการระบบ CAD ผู้ใช้มีรูปวาดที่ครอบคลุมหลาย E-ขนาดแผ่นงาน E-ขนาด (หรือการปรับขนาดตัวเล็กกว่า ) พล็อตเตอร์ หมายเลขหน้าจะเป็นเช่นในกรณีอย่างง่าย แต่บนเครื่องพิมพ์แบบเลเซอร์ 16 A-ขนาดหน้าต่อแผ่น พิมพ์อะไรไม่แสดงตัวอย่างก่อนพิมพ์พิจารณา "หน้า"?

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

สตริงที่อธิบายหน้าในโครงสร้างแบบCPrintInfoมีวิธีการแสดงหมายเลขหน้าไปยังผู้ใช้หากสามารถแสดงเป็นหมายเลขหนึ่งต่อหน้า (เช่นใน "หน้า 1" หรือ "หน้า 1-2") ข้อความนี้ถูกใช้ โดยการเริ่มต้นใช้งานCPreviewView::OnDisplayPageNumber หากต้องการแสดงผลที่แตกต่างกัน หนึ่งอาจแทนที่ฟังก์ชันนี้เสมือนการให้ เช่น "Sheet1 ส่วน A, B"?

หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)

Index