数
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_CHA
RACTER_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH|FF—DONTCARE,HFONTNAME)
return FALSE;
return TRUE;
}
void CDlgDataPrint::DoClearPrintDC()//清除打印场景
{
m_fontPrint,Delete0bject();
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* p0ldFont=m_DC.Select0bject(&m_fontPrint);
//输出报表,建议用CDC::DrawText()函数便于控制打印范围……
//终止打印作业
m_DC,EndPage();
m_DC.EndDoc();
m_DC.Select0bject(p0ldFont);
//清除打印场景
DoClearPrintDC();
}
二、 表格问题
人们常用的报表格式几乎都是封闭式的,要实现这种报表不外乎两种方法:一是在进行打印输出时直接绘制横线和竖线,这种方法适用于报表格式不固定或格式较简单的情况,对那种格式固定或表头和表体比较复杂的情况,特别是有嵌套表格的情况下,我们认为先将打印结果以文本形式写入一个临时文件,然后再对文件进行打印输出的方法要使事情简单一些,因为这样的程序就可以只关心数据(表体)的输出,而表头则可以固定格式存入数据库。但是,我们在对文本形式的报表进行打印输出时却发现一个有趣的现象,有时输出结果的相邻两行表格竖线不能对齐,而有时又可以。原来是Windows图形输出的结果,只要我们在建立打印字体时,字体的高度是偶数就可保证竖线对齐,如果是奇数则不能对齐。知道了原因,在建立打印字体时只需:
……
#define FONTSIZE 14
//建立打印字体,m_fontPrint是定义为CFont m_fontPrint的类成员变量
int nFontHeight=MulDiv(FONTSIZE,-cyInch,72);
if (nFontHeight % 2)nFontHeight++;
if (!m_fontPrint.CreateFont(nFontHeight,0,0,0, FW_NORM
AL,0,0,0,
GB2312_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHA
RACTER_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,HFONTNAME)
return FALSE;
……
还有一点小技巧,输出文本形式的报表时,对报表的横线只需要输出其正常高度的二分之一或三分之一,这样报表看起来更紧凑美观。这也是我们在前面建议用CDC::DrawText()进行绘制输出的原因。