首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

對話框列印預覽與列印完整實作:無需文檔/視圖架構的 MFC 列印方案

     編輯:關於VC++

前言

MFC 預設列印架構建立在 Document/View 模型上,若專案採用對話框架構 (Dialog-based) 則無法直接使用。本文提供一套獨立的列印預覽/列印方案,僅需兩個 CDialog 衍生類別 (CPreParent、CPreView) 即可在對話框專案中實現完整列印功能,支援多頁、捲動、縮放、跳頁、直接列印。

架構設計

  • CPreParent:最外層模態對話框,包含工具列 (首頁、上頁、跳頁、下頁、末頁、結束、列印) 與預覽區域。
  • CPreView:真正的預覽視窗,負責繪製頁面內容、處理滑鼠捲動、鍵盤翻頁。
  • 回呼函數:呼叫端提供 static void DrawInfo(CDC&, PRNINFO&) 繪製單頁內容,框架負責分頁邏輯與預覽迴圈。

核心資料結構 PRNINFO


typedef struct {
    int nMaxLine;       // ListCtrl 總行數
    int nCountPage;     // 總頁數 (框架計算)
    int nCurPage;       // 目前頁碼
    BOOL IsPrint;       // FALSE=預覽, TRUE=列印
    HWND hWnd;          // 呼叫視窗句柄
    HWND hListView;     // ListCtrl 句柄
    TCHAR szTag[256];   // 附加資料
    int nTag;
    LPVOID lpVoid;      // 自訂指標
} PRNINFO, *PPRNINFO;

呼叫端程式碼範例 (對話框列印按鈕)


void CXJWH::OnPrint() {
    if (m_List.GetItemCount() <= 0) return;

    PRNINFO info = {0};
    info.hListView = m_List.m_hWnd;
    info.hWnd = m_hWnd;
    info.IsPrint = FALSE;          // 預覽模式
    info.nCurPage = 1;
    info.nMaxLine = m_List.GetItemCount();

    CPreParent dlg;
    dlg.SetCallBackFun(DrawInfo, info); // 設定繪製回呼
    dlg.DoModal();                    // 顯示預覽對話框
}

// 靜態繪製回呼:從 ListCtrl 讀取資料繪製單頁
static void DrawInfo(CDC& dc, PRNINFO& info) {
    // 計算每頁行數、欄位寬度、標題列...
    // 迴圈呼叫 dc.TextOut / dc.Rectangle 繪製表格
    // 使用 info.nCurPage 決定繼續資料範圍
}

CPreView 關鍵功能實作

  • OnPaint:建立相容 DC、位圖雙緩衝,呼叫回呼函數繪製,再 BitBlt 輸出螢幕,避免閃爍。
  • 滑鼠滾輪/拖曳:處理 WM_MOUSEWHEEL、OnLButtonDown/Move/Up 實現頁面上下左右拖曳。
  • 鍵盤翻頁:VK_PRIOR/NEXT/HOME/END 對應首/尾頁、上/下頁。
  • 列印按鈕:設定 info.IsPrint = TRUE,建立 CPrintDialog、DOCINFO,呼叫 StartDoc/StartPage/EndPage/EndDoc 逐頁列印。

工具列按鈕對應功能

按鈕功能
首頁nCurPage=1, 重繪
上頁nCurPage--, 重繪
跳頁彈出輸入對話框設定 nCurPage
下頁nCurPage++, 重繪
末頁nCurPage=nCountPage, 重繪
結束EndDialog(IDCANCEL)
列印切換 IsPrint=TRUE 進入列印流程

優點與適用場景

  • 完全獨立於 Doc/View,適合對話框、FormView、甚至 Console 應用呼叫。
  • 回呼函數設計靈活,可列印 ListCtrl、資料庫報表、自訂圖表等任意內容。
  • 預覽視窗支援滑鼠拖曳、鍵盤操作、多頁縮略圖 (可擴充)。

總結

這套方案只需複製 CPreParent、CPreView 兩個類別與資源,即可為任何 MFC 對話框專案加入專業級列印預覽/列印功能,避免了為了列印而強制引入 Doc/View 架構的複雜度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved