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

CPrintRX:輕量級報表列印類,支援畫線、文字、字體與分頁

     編輯:關於VC++

專案需求:取代緩慢的 Word VBA 列印方案,自行封裝一個高效的報表列印類。CPrintRX 提供座標定位、橫豎線繪製、多字體文字輸出、頁邊距設定、分頁控制等核心功能,適合發票、清單、報表等結構化列印場景。

一、類別介面設計

class CPrintRX {
public:
    // 座標與分頁
    void MoveTo(int x, int y);
    int StartPrint();        // 開始列印作業
    int EndPrint();          // 結束列印作業
    int StartPage();         // 開始新頁
    void EndPage();          // 結束當前頁
    void NewPage();          // 強制換頁
    int SetMargins(int top, int bottom, int left, int right);
    void SetDistance(int pts); // 行距
    
    // 字體管理
    int AddFont(LOGFONT* lf);
    int AddFont(CFont& font);
    int SetFontFace(int fontIdx, int faceIdx);
    
    // 繪圖
    int DrawHLine(int x1, int y1, int x2, int y2, CPen* pen = nullptr);
    int DrawVLine(int x1, int y1, int x2, int y2, CPen* pen = nullptr);
    
    // 文字輸出
    int DrawText(LPCTSTR str, CRect& rect, int font=0, int face=0, int format=0);
    int DrawText(LPCTSTR str, int font=0, int face=0, int format=0); // 當前座標
    
    int GetWidth();          // 可列印寬度
    int GetStrSize(LPCTSTR str, CSize& sz);
    CPrintRX(); virtual ~CPrintRX();
private:
    CDC m_DC, m_PrinterDC;
    HDC m_hPrinter;
    CFont* m_font[10][4];    // 10字體 x 4樣式
    // ... 其他狀態變數
};

二、使用流程範例

CPrintRX prt;
prt.InitToPrint(NULL, 1);      // 彈出列印對話框,1份
prt.StartPrint();              // 開始作業
prt.StartPage();               // 第1頁

CPen pen(PS_SOLID, 3, RGB(0,0,0));
prt.DrawVLine(xPos[0], yPos[0], xPos[0], yPos[29], pen); // 直線

prt.SetFontFace(0, 0);         // 選字體
prt.DrawText("標題", rect, 0, 0, DT_CENTER);

prt.EndPage();
prt.EndPrint();                // 送入列印佇列

三、核心實作要點

  • 雙 DC 機制:m_PrinterDC 對應列印機 DC,m_DC 為相容記憶體 DC,支援預覽與列印統一介面。
  • 座標系統:內部以裝置像素(0.01 cm / MM_LOMETRIC)運算,MoveTo/DrawText 自動維護游標位置。
  • 字體快取:m_font[10][4] 預建常用字體,避免重複 CreateFont 開銷。
  • 分頁邏輯:StartPage 呼叫 StartPage,EndPage 呼叫 EndPage,配合 m_iPage 追蹤頁碼。

四、測試結果

列印輸出掃描圖

圖 1:報表列印實際輸出效果(掃描件)

五、已知限制與擴充建議

功能現狀建議擴充
位圖繪製未支援加入 DrawBitmap(CRect&, CBitmap*)
表格自動佈局手動座標實作 CTableLayout 輔助類
Unicode 支援ANSI 版本全面改用 LPCTSTR/CString
預覽整合需自行實作繼承 CPreviewView 並共用 OnDraw

六、總結

CPrintRX 以約 300 行核心代碼實現了報表列印的核心需求:精確座標控制、多字體、分頁、畫線。雖不及商業報表元件功能豐富,但零依賴、編譯即用、易於擴充,適合輕量級專案快速落地。原始碼已開源,歡迎改良。

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