上次只是说了一点点思路,也许有人问:你说的那能好使吗? 当然了,我实现了我才说的,嘿嘿~
版面控制类 下面给出个本人的实现,本文旨在说明实现方法,所以省略了私有成员。希望有人能实现的更好,祝大家都能写出自己的报表类来:)
// PolarisReport.h: interface for the CPolarisReport class.
//
//////////////////////////////////////////////////////////////////////
/********************************************************************
Name: PolarisReport 表格打印控件 Mini 版
Version: 1.21
created: 2003/12/01
filename: PolarisReport.h
author: 21bird
*********************************************************************/
#if !defined(AFX_POLARISREPORT_H__A5DE9E8D_C223_4A83_AC72_F33F2AF4194C__INCLUDED_)
#define AFX_POLARISREPORT_H__A5DE9E8D_C223_4A83_AC72_F33F2AF4194C__INCLUDED_
#include "Cell_Info.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
enum E_ALIGN {E_ALIGN_LEFT = 0, E_ALIGN_CENTER, E_ALIGN_RIGHT, E_ALIGN_UNKNOWN};
enum E_FOOTNOTE {E_HEADER = 0, E_FOOT};
enum E_LINEPOS {E_TOP = 0, E_BOTTOM};
// PS_DASH 1 /* ------- */
// PS_DOT 2 /* ....... */
// PS_DASHDOT 3 /* _._._._ */
// PS_DASHDOTDOT 4 /* _.._.._ */
enum E_LINESTYLES{E_SOLID = 0, E_DASH = 1, E_DOT, E_DASHDOT, E_DASHDOTDOT};
class AFX_EXT_CLASS CColumnInfo
{
public:
CColumnInfo()
{
m_iWidth = 0;
m_Align = E_ALIGN_CENTER;
}
~CColumnInfo(){}
int m_iWidth;
E_ALIGN m_Align;
protected:
private:
};
class AFX_EXT_CLASS CPolarisReport
{
public:
//methods
// 检测打印机,取打印机信息
BOOL DetectPrinters();
//////////////////////////////////////////////////////////////////////////
// 版面设置方法
void SetMapMode(CDC* pDC); // 设置打印样式
// 打印直线、点划线……
void DashedHoriz(int iLine, E_LINEPOS ePos, E_LINESTYLES eLineStyle);
BOOL SetOrientation(BOOL bLandscape = TRUE); // 设置纸张打印方向
void ResetCell(); // 初始化单元格(坐标、内容)
void SetReportTitle(LPCSTR szContent); // 设置报表大标题
// 设置上标注下标注
void Set_Header_Footer(LPCSTR szContent, int iAlign, int iWhich);
// 设置单元格内容
void SetCellContent(LPCSTR szContent, int iRow, int iCol);
void SetCellContent(LPCSTR szContent, int iRow, int iCol, E_FONT eFont, E_ALIGN eAlign);
// 设置字体
void PrepareGDIObject(); // 初始化字体
void SetFont(LOGFONT* pLogFont, int iWhich); // 设置字体
void GetFontInfo(LONG *pWidth, LONG *pHeight); // 取字体信息
// 处理合并单元格
void MergeColumn(int iRow, int iBeginCol, int iEndCol,
E_ALIGN eAlign = E_ALIGN_UNKNOWN);
void MergeRow(int iBeginRow, int iEndRow, int iCol);
// 打印数据内容……
void PrintTitle();
void PrintReportBorder();
void PrintHeader();
void PrintFooter();
void PrintCellContent(int iRow, int iCol);//, E_FONT eFont = E_CONTENT_FONT);
void PrintCellLine(int iRow, int iCol);
void AddColumn(int index, int nWidth, E_ALIGN eAlign = E_ALIGN_CENTER);
// 设置是否每页都显示大标题
void EnableTitlePerPage(){ m_bHasTitlePerPage = TRUE; };
void EnableTitle(BOOL bEnable) { m_bHasTitle = bEnable; };
void DisableColumnHeader(){ m_bHasColumnHeader = FALSE; };
void SetFixedRows(int iRowNum){ m_iFixedRows = iRowNum; };
int GetFixedRows(){ return m_iFixedRows; };
void SetCellNum(int nRows, int nColumns); // 设置行数,列数
// 设置待显示的最小行数和最大行数
void SetRowsToDisplay(int nMinRowNum, int nMaxRowNum);
void SetRowHeight(int index, int nHeight); // 设置行高
void SetColWidth(int index, int nWidth); // 设置列宽
inline void SetLineHeight(int iHeight)
{
m_LineHeight = iHeight;
}
int GetLastRow(); // 取得当前页最后一行行数
// 设置页面大小
void SetPageSize(CSize& pageSize, int iLeft, int iTop, int iRight, int iBottom);
BOOL SetPaperSize(short lSizeType); // 设置纸张大小
//////////////////////////////////////////////////////////////////////////
// 设置设备参数
void GetDeviceInfo(CDC* pDC, CPrintInfo* pPrintInfo);
// 根据设置完毕的信息初始化打印控件
void InitialAll();
int m_iTableTop;
CPolarisReport();
virtual ~CPolarisReport();
// void DrawCell(int iRow, int iCol, LPCSTR szContent);//画单元格
//attributes
CSize m_TotalPageSize; //纸张尺寸
// 设备
CDC* m_pDC;
CPrintInfo* m_pInfo;
UINT m_iCurrentPage;
long m_MinRowNum, m_MaxRowNum, m_MaxColNum; // 每页行数,列数
long m_CountRow, m_CountCol; // 当前页最大行数,列数
long m_iRowNum; // 实际数据行数
long m_iRecordNum; // 记录数
double m_xLogPixPerInch;
double m_yLogPixPerInch;
};
==========================
打印、预览功能界面类 如果要控制版面,这几个足够了,可要想扩大应用范围、增加预览功能的话,还需要几个类。也就是上文所说的打印功能界面的类。打印功能控制的几个类,是本人将网上流行的一段著名的开源代码做了点修改之后跟上面那段结合使用的,嘿嘿,因为不是自己写的,就不在这发了。
附加功能类由于上面打印界面使用的那部分有在对话框实现打印预览的功能,而使用报表类的场合多数又是数据库应用,所以本人又实现了一个有打印预览功能的对话框类,任何MFC对话框只需从这个基类派生下来,就自动拥有了上面实现的所有打印预览功能。而且是带有数据库功能的,更改具体实现,可以适用于各种数据库连接方式,如:ADO、ODBC、DAO……
由于打印预览界面部分的代码没有发,所以这部分的也可以省略了…… -_-!!
当然,实现上还有地方需要进行改进和完善。比如此法有个缺点:不能实现动态内容打印,如要支持此功能,则需做适当修改。
本人将此拙作发出来就是希望大家能一起来完善、改进。希望各位能多提宝贵意见和建议。:)