分享
 
 
 

《开发自定义报表类》之实现篇……

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

上次只是说了一点点思路,也许有人问:你说的那能好使吗? 当然了,我实现了我才说的,嘿嘿~

版面控制类 下面给出个本人的实现,本文旨在说明实现方法,所以省略了私有成员。希望有人能实现的更好,祝大家都能写出自己的报表类来:)

// 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……

由于打印预览界面部分的代码没有发,所以这部分的也可以省略了…… -_-!!

当然,实现上还有地方需要进行改进和完善。比如此法有个缺点:不能实现动态内容打印,如要支持此功能,则需做适当修改。

本人将此拙作发出来就是希望大家能一起来完善、改进。希望各位能多提宝贵意见和建议。:)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有