科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC中基于CEditView的打印和打印预览设计

VC中基于CEditView的打印和打印预览设计

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在CEditView框架基础上进行程序设计,即可起到事半功倍的效果

作者:丁有和 来源:yesky 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
2.页眉和页脚

  打印文档时,往往需要打印文档的标题及页码或其他内容的页眉和页脚。我们知道,在视图类的函数OnPrint中处理页眉和页脚是最合适的,因为每打印一页,就调用该函数一次,且只在打印过程中调用。有时,为了避免与正文重合,还需要调整CPrintInfo中的成员变量m_rectDraw的值。例如下面的代码:

void CEx_Prn1View::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
SetPageMargin(pDC, pInfo, 250, 250, 250, 250);
// 页边距均为25毫米
int nOldMode = pDC->GetMapMode();
pDC->SetMapMode(MM_LOMETRIC);
pDC->DPtoLP(&pInfo->m_rectDraw);
// 先设置页眉字体,然后打印页眉
CFont font;
font.CreateFontIndirect(&m_lfHead);
CFont *oldFont = pDC->SelectObject(&font);
// 计算页眉绘制的区域
int nHeadMargin = 200; // 设置页眉边距为20mm
CRect rc(pInfo->m_rectDraw);
rc.top = -nHeadMargin + m_nPhyTop;
rc.bottom = pInfo->m_rectDraw.top;
// 设页眉内容为打印的文档名
CEx_Prn1Doc* pDoc = GetDocument();
CString str = pDoc->GetPathName(); // 获取文档全名
pDC->DrawText(str, rc, DT_TOP|DT_CENTER);
// 先设置页脚字体,然后打印页脚
font.Detach();
font.CreateFontIndirect(&m_lfFoot);
pDC->SelectObject(&font);
// 计算页脚绘制的区域
int nFootMargin = 200; // 设置页脚边距为20mm
rc.top = pInfo->m_rectDraw.bottom;
rc.bottom = rc.top - (nFootMargin - m_nPhyBottom);
// 设页脚内容为打印的页码
str.Format("- %d -", pInfo->m_nCurPage);
pDC->DrawText(str, rc, DT_BOTTOM |
DT_SINGLELINE | DT_RIGHT);
pDC->SelectObject(oldFont); // 恢复原来的字体
pDC->LPtoDP(&pInfo->m_rectDraw);
pDC->SetMapMode(nOldMode); // 恢复原来映射模式
CEditView::OnPrint(pDC, pInfo);
}

  这样,在用户视图类的构造函数中添加LOGFONT类型的成员变量m_lfHead和m_lfFont的下列初始化代码:

CEx_Prn1View::CEx_Prn1View()
{
memset(&m_lfHead, 0, sizeof(LOGFONT)); // 成员为0
double fontScale = 254.0/72.0;
// 一个点相当于多少0.1mm
// 页眉字体
m_lfHead.lfHeight = -(int)(9 * fontScale + 0.5); // 9号字
m_lfHead.lfWeight = FW_NORMAL;
m_lfHead.lfCharSet = GB2312_CHARSET;
strcpy((LPSTR)&(m_lfHead.lfFaceName),
"楷体_GB2312");
// 页脚字体
m_lfFoot = m_lfHead;
}

  到这里,编译并运行程序后,打开一个文档,选择"文件"|"打印预览"菜单命令就可以看到效果了。但是文档显示的字体还需要进行设置,这比较简单。只需添加个菜单项(设为ID_VIEW_FONT),然后用ClassWizard在CEx_Prn1View类添加该命令的消息映射函数,并添加下列代码:

void CEx_Prn1View::OnViewFont()
{
CFontDialog dlg;
if (dlg.DoModal() == IDOK) {
LOGFONT lf;
dlg.GetCurrentFont(&lf);
HFONT hFont;
hFont = ::CreateFontIndirect(&lf);
if (hFont != NULL)
SendMessage(WM_SETFONT, (WPARAM)hFont);
}
}

  3.重置TAB值

  在CEditView中,默认的Tab值等于8个字符。但实际情况的Tab值往往是4个字符,所以需要重设这个Tab值。

  CEditView::SetTabStops就是这样的函数,但MSDN对其解释令人费解,什么"设置的Tab值是以对话框点为单位的"等等。实际上,只要打开MFC的源代码文件ViewEdit.cpp就可以看到默认的Tab值为8*4,显然,若设置为4个字符,则SetTabStops的参数值应为4*4,即16。设置Tab值的代码可直接添加在 CEx_Prn1View::OnInitialUpdate函数中:

void CEx_Prn1View::OnInitialUpdate()
{
CEditView::OnInitialUpdate();
SetTabStops(4 * 4); // 设置一个停止位等于4个字符
}

  再次运行程序,最后的结果如下图所示。

  本文图片

  三、 结束语

  通过在CEditView中添加设置页边距、页眉页脚以及改变字体和Tab值等功能,不能代码量小,而且更主要的是满足了一般ASCII文档的内容显示和打印的要求。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章