VC中基于CEditView的打印和打印预览设计
### VC中基于CEditView的打印和打印预览设计 #### 一、CEditView程序框架的功能特点 在Microsoft Visual C++(以下简称VC)中利用MFC(Microsoft Foundation Classes)框架进行开发时,通过选择CEditView作为视图类的基础,能够快速构建具备基本文档编辑与打印功能的应用程序。然而,CEditView本身具有一些限制: 1. **不支持WYSIWYG(What You See Is What You Get)编辑**:用户在编辑过程中不能直观地看到最终的排版效果。 2. **单一字体显示**:无法处理多种字体样式及格式。 3. **文本容量限制**:在32位Windows系统下,单个文档的文本总量不能超过1MB。 4. **打印功能基础**:虽然内置了打印功能,但其定制性较弱。 为了克服上述局限,本文重点探讨如何在CEditView的基础上进一步优化打印和打印预览功能。 #### 二、打印和打印预览的程序设计 针对打印和打印预览的需求,我们需要实现以下功能: 1. **控制页边距和行距** 2. **设计页眉页脚** 3. **控制打印字体** 4. **选择打印模式** 5. **多页打印** 6. **实现预览功能** 其中,多页打印和预览功能已经由CEditView提供,接下来将详细介绍其余部分的设计方法。 ##### 1. 设置页边距 页边距指的是打印文档内容与纸张边缘之间的空白距离,包括左、右、上和下四个方向。在VC中可以通过`CPrintInfo`类的成员变量`m_rectDraw`来访问打印区域,但需要注意的是,`m_rectDraw`表示的是实际可用的打印区域,并非纸张的物理边界。因此,需要额外计算物理边距。 可以通过调用全局函数`GetDeviceCaps`来获取打印机的物理边距和其他相关信息。例如: - `LOGPIXELSX`:水平分辨率 - `LOGPIXELSY`:垂直分辨率 - `PHYSICALWIDTH`:打印纸的实际宽度 - `PHYSICALHEIGHT`:打印纸的实际高度 - `PHYSICALOFFSETX`:实际可打印区域的物理左边距 - `PHYSICALOFFSETY`:实际可打印区域的物理上边距 以下是一个设置页边距的示例函数: ```cpp void CEx_Prn1View::SetPageMargin(CDC *pDC, CPrintInfo *pInfo, int l, int t, int r, int b) { int nOldMode = pDC->GetMapMode(); pDC->SetMapMode(MM_LOMETRIC); double scaleX = 254.0 / (double)GetDeviceCaps(pDC->m_hAttribDC, LOGPIXELSX); double scaleY = 254.0 / (double)GetDeviceCaps(pDC->m_hAttribDC, LOGPIXELSY); int x = GetDeviceCaps(pDC->m_hAttribDC, PHYSICALOFFSETX); int y = GetDeviceCaps(pDC->m_hAttribDC, PHYSICALOFFSETY); int w = GetDeviceCaps(pDC->m_hAttribDC, PHYSICALWIDTH); int h = GetDeviceCaps(pDC->m_hAttribDC, PHYSICALHEIGHT); int nPageWidth = (int)((double)w * scaleX + 0.5); int nPageHeight = (int)((double)h * scaleY + 0.5); // 计算物理边距 int nLeftMargin = (int)((double)x * scaleX + 0.5) + l; int nTopMargin = (int)((double)y * scaleY + 0.5) + t; // 更新打印信息 pInfo->m_rectDraw.left = nLeftMargin; pInfo->m_rectDraw.top = nTopMargin; pInfo->m_rectDraw.right = nPageWidth - r; pInfo->m_rectDraw.bottom = nPageHeight - b; pDC->SetMapMode(nOldMode); } ``` 该函数接收指针`pDC`指向的设备上下文和指针`pInfo`指向的打印信息对象,以及四个整型参数`l`、`t`、`r`、`b`,分别表示左、上、右、下的边距,单位为0.1毫米。 ##### 2. 设计页眉页脚 在VC中,可以通过`CPrintPreviewDialog`类提供的方法来实现自定义的页眉页脚。具体实现时,可以在`OnBeginPrinting`和`OnEndPrinting`成员函数中添加相应的代码来控制页眉页脚的显示。 ##### 3. 控制打印字体 为了控制打印字体,可以使用`CFont`类创建并设置不同的字体属性,然后在`OnDraw`或`OnPrint`函数中应用这些字体设置。 ```cpp void CEx_Prn1View::OnDraw(CDC* pDC) { CFont font; font.CreateFont( 12, // 高度 0, // 宽度 0, // 逃逸角 0, // 倾斜角 FW_NORMAL, // 字体权重 FALSE, // 意大利斜体 FALSE, // 下划线 FALSE, // 删除线 DEFAULT_CHARSET, // 默认字符集 OUT_DEFAULT_PRECIS, // 输出精度 CLIP_DEFAULT_PRECIS, // 剪辑精度 DEFAULT_QUALITY, // 质量 DEFAULT_PITCH | FF_SWISS, // 字符间距和字体族 _T("Arial") // 字体名 ); CFont* pOldFont = pDC->SelectObject(&font); // 绘制文本... pDC->SelectObject(pOldFont); } ``` 以上是在CEditView基础上进行打印和打印预览功能设计的一些基本思路和实现方法。通过这些扩展,可以使基于CEditView的应用程序具备更为完善的打印和预览功能,更好地满足用户的多样化需求。
- 粉丝: 0
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助