分享
 
 
 

VC数据库编程中的打印控制

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

VC数据库编程中的打印控制比较复杂,但它也给程序员最大的灵活性,而这种灵活性正是我们需要的。因为各行业、部门的报表一般都不太规整,特别是表头部分,二、三重嵌套的情况很常见。下面我们就开发中碰到的一些问题与同行们探讨。

Document/View框架之外的打印

熟悉VC的程序员都知道Microsoft 的AppWizard生成的应用程序框架中,可以选择免费的打印及打印预览功能,但前提是必须选择Document/View结构。然而我们的数据库应用中一般都不需要一个文档类来保存文档,因为数据库(源)就是我们的文档,数据一般是在一个对话框或视中与用户交互,编辑或修改结果直接通过数据库引擎写回数据库中。我们的程序主框架要么是基于对话框的、要么是基于无文档类的单视(或多视)结构,在这种情况下,AppWizard 在打印控制部分并不能给我们任何帮助,只能自己负责完成打印控制。

总结起来,一次打印操作要遵循以下步骤:

1.得到或生成打印设备场景,可通过显示打印对话框让用户选择打印机与纸张等设置,也可在程序中直接取系统缺省打印机设置,然后根据报表格式设置纸张大小和打印方向;

2.开始在该设备场景中的一次打印作业,实际打印报表内容,终止打印作业;

3.清除打印设备场景,完成本次打印操作。

在下面的例子中,我们在一个对话框中让用户选择打印某个报表,没有显示打印设置对话框,而是直接取系统缺省打印机设置,然后根据报表格式设置纸张大小和打印方向。之所以这样做是因为各行业、部门的报表格式一般都是至上而下的统一格式。函数DoPreparePrintDC()、DoPrint()和DoClearPrintDC()分别对应上述的三个步骤:

BOOL CMyDialog::DoPreparePrintDC()

// 准备打印场景

{

#defineFONTSIZE 14

// 获取打印机的设备属性

CPrintDialog dlgPrint( FALSE );

// 得到当前系统缺省打印机设置

if(!dlgPrint.GetDefaults()) return FALSE;

LPDEVMODE pDM=dlgPrint.GetDevMode();

if(pDM==NULL) return FALSE;

::GlobalUnlock(pDM);

// 联结打印DC,m—hDC是定义为HDC m—hDC的类成员变量

m—hDC=dlgPrint.CreatePrinterDC();

// m—DC是定义为CDC m—DC的类成员变量

if(!m—DC.Attach(m—hDC) return FALSE;

// 设置打印标志

m—DC.m—bPrinting=TRUE;

short cxInch=m—DC.GetDeviceCaps(LOGPIXELSX);

short cyInch=m—DC.GetDeviceCaps(LOGPIXELSY);

// 建立打印字体,m—fontPrint 是定义为CFont m_fontPrint的类成员变量

if(!m—fontPrint.CreateFont(MulDiv(FONTSIZE, -cyInch, 72),0,0,0, FW—NORMAL,0,0,0, GB2312—CHARSET, OUT—CHARACTER—PRECIS, CLIP—CHARACTER—PRECIS,DEFAULT—QUALITY, DEFAULT—PITCH|FF—DONTCARE, HFONTNAME)

return FALSE;

return TRUE;}

void CDlgDataPrint::DoClearPrintDC()

// 清除打印场景

{ m—fontPrint.DeleteObject();

m—DC.Detach();

::DeleteDC( m—hDC );}

void CDlgDataPrint::DoPrint()

// 实际打印输出

{ if(DoPreparePrintDC()==FALSE) return;

// 开始一次打印作业

CString str;

str.LoadString(AFX—IDS—APP—TITLE);

DOCINFO di;

::ZeroMemory (&di, sizeof (DOCINFO));

di.cbSize=sizeof (DOCINFO);

di.lpszDocName=str;

m—DC.StartDoc(&di);

m—DC.StartPage();

// 将打印字体选进设备场景

CFont* pOldFont=m—DC.SelectObject(&m—fontPrint);

// 输出报表,建议用CDC::DrawText()函数便于控制打印范围

...

// 终止打印作业

m—DC.EndPage();

m—DC.EndDoc();

m—DC.SelectObject(pOldFont);

// 清除打印场景

DoClearPrintDC();}

表格问题

对格式固定或表头、表体比较复杂的情况,特别是有嵌套表格的情况下,我们认为先将打印结果以文本形式写入一临时文件,然后再对文件进行打印输出的方法会使事情简单一些。因为这样在程序中就可以只关心数据(表体)的输出,而表头则可以固定格式存入数据库。

但是,我们在对文本形式的报表进行打印输出时却发现一个有趣的现象,有时输出结果的相邻两行表格竖线不能对齐,而有时又可以。原来是 Windows 图形输出的问题,只要我们在建立打印字体时,字体的高度是偶数就可保证竖线对齐,如果是奇数则不能对齐。知道了原因,在建立打印字体时只需加入如下代码即可:

...

#defineFONTSIZE 14

#defineHFONTNAME ″宋体″

// 建立打印字体,m—fontPrint是定义为CFont m—fontPrint的类成员变量

int nFontHeight=MulDiv(FONTSIZE,-cyInch, 72);

if(nFontHeight % 2) nFontHeight++;

if(!m—fontPrint.CreateFont(nFontHeight, 0, 0, 0, FW—NORMAL, 0, 0,0,GB2312—CHARSET, OUT—CHARACTER—PRECIS, CLIP—CHARACTER—PRECIS,DEFAULT—QUALITY, DEFAULT—PITCH | FF—DONTCARE, HFONTNAME))

return FALSE;

...

还有一点小技巧,输出文本形式的报表时,对报表的横线只需要输出其正常高度的二分之一或三分之一,这样报表看起来更紧凑美观。这也是我们在前面建议用CDC::DrawText()进行绘制输出的原因。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有