專案需求:取代緩慢的 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(); // 送入列印佇列
m_PrinterDC 對應列印機 DC,m_DC 為相容記憶體 DC,支援預覽與列印統一介面。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 行核心代碼實現了報表列印的核心需求:精確座標控制、多字體、分頁、畫線。雖不及商業報表元件功能豐富,但零依賴、編譯即用、易於擴充,適合輕量級專案快速落地。原始碼已開源,歡迎改良。