一、前兩天為公司改程序,其中有一部分是要打印出報表。原來的程序是調用VB寫的一個程序。那個程序用VBA方式實現的,在一個空的WORD表格模板裡填入數據,讓WORD去打印,效果還可以,就是速度很慢。但是這次,上次寫代碼的人已經不在這裡了,我並不想去學VBA,無奈之下找到了一個Rob.A Fraydl寫的打印類示例,但是裡面沒有我要的功能,只是示范了怎麼去打印。於是自己重新的封裝了一下,基本算是合格了。
程序實現了在指定位置畫橫線和豎線的功能,可以在畫線之前選畫筆,以及在指定的區域寫文字的功能,並可以設定選擇字體。
二、關於類,簡單說明如下:
class CPrintRX
{
public:
void MoveTo(int xCur, int yCur);
int GetStrSize(char *str, CSize& size);
int GetWidth();
void NewPage(); //開始新的一頁
void EndPage(); //結束一頁
int StartPage(); //開始一頁
void SetDistance (int punkte);
int SetMargins(int Top, int Bottom, int Left, int Right);
int EndPrint(); //結束作業
int StartPrint(); //開始打印作業
int InitToPrint(char *PrinterName, int Copies);
//初始化
int SetFontFace(int iFont, int iFace);
int AddFont(LOGFONT *lf); //添加字體
int AddFont(CFont &newfont);
int DrawVLine(int x_up, int y_up, int x_bottom, int y_bottom, CPen &newpen);
int DrawVLine(int x_up, int y_up, int x_bottom, int y_bottom);
int DrawHLine(int x_left, int y_left, int x_right, int y_right, CPen & newpen);
int DrawHLine(int x_left, int y_left, int x_right, int y_right);
int DrawText(char *str, CRect& m_rt, int iFont = 0, int iFace = 0, int format = FORMAT_NORMAL);
int DrawText(char *str, int iFont = 0, int iFace = 0, int format = FORMAT_NORMAL);
CPrintRX();
virtual ~CPrintRX();
private:
CDC m_DC; // 打印的設備內容
HDC m_hPrinter; // 當給定了一個打印機的時候使用
CDC m_PrinterDC; // 沒有指定打印機的時候使用
CFont* m_font[10][4]; // 存放字體的的變量
int m_nFonts; // 現有的字體數
int m_iFont; // 使用的字體索引
int m_iFace[10]; // 使用的風格索引
int m_nCopies; // 打印的份數
CSize m_WorkSize; // 紙張的物理的寬度,以打印機的像素數為准
CRect m_Margins; // 使用范圍,以屏幕的像素數為准
int m_yCur; // 當前的鼠標的位置Y
int m_xCur; // 當前的鼠標的位置X
int m_Abstand; // 行間距
int m_iPage; // 當前的頁數
int m_LastErrNo; // 最後一個錯誤值
CPrintDialog *m_pPrintDlg;
// 使用打印機設置對話框
};
在使用時候流程是這樣的:
CPrintRX m_Print;
m_Print.InitToPrint(NULL, 1); // 調用打印對話框,初始化得到設備內容
m_Print.StartPrint(); // 開始一個新的打印作業
m_Print.StartPage(); // 開始新的一頁
CPen newPen; // 新建一個畫筆
newPen.CreatePen (PS_SOLID, 3, RGB(0,0,0));
m_Print.DrawVLine(x_pos[0], y_pos[0], x_pos[0], y_pos[29], newPen);
// 畫橫線
m_Print.EndPage();
m_Print.EndPrint(); // 結束打印
三、在測試程序中的打印效果如下
圖一 打印效果掃描圖
四、當然,這個類實現的比較簡單,還沒有畫位圖的功能,但是可以給做相關的工作的朋友一些幫助。也希望朋友們把它做的更加完善。
本文配套源碼