工控编程吧
标题:
315上位机VC MFC实现对话框的打印分页预览功能
[打印本页]
作者:
qq263946146
时间:
2016-9-23 18:00
标题:
315上位机VC MFC实现对话框的打印分页预览功能
(, 下载次数: 1)
上传
点击文件名下载附件
对话框实现打印分页预览
功能展示
在基于文档框架的应用程序中我们可以简单调用微软封装的类方便且快速的实现打印或打印预览功能,但如果我们创建的是基于对话的应用程序,我们就得自己编写代码实现这些功能,我们当前例程实现基于对话框的打印预览功能,效果如图,在调用打印预览对话后,可以实现放大缩小,前页后页,打印设置,页面设置,垂直水平滚动等功能;
要点提示
带有滚动条的预览窗口主要应用了绘图缩放,绘图缓存等技术结合鼠标滚轮来实现;
在绘图缩放时最好 的方法是使用SetWindowExt(),SetViewPortExt()来改变物理窗口与逻辑窗口的大小,进而实现窗口缩放的效果。但在调用这两函数前得调用SetMapMode函数设置单位的映射模式,具体的映射模式,可以打开MSDN手册搜索此函数学习;
在窗口绘制时绘制过频繁或绘制区域过大时,就会出现窗口闪烁现象,利用绘图缓存的方法就可以很好的解决这一问题。这一方法的核心就是将全部要绘制的图片或文字等全部绘制到临时或称为缓存的画布中,完全绘制完后再将此缓存的画布复制到要显示的窗口设备上下文中;具体的实现方法可参阅我们例程类CChildPreview中的OnPaint()函数
实现功能
1.新建基于对话框的应用程序
2.添加一对话框资源IDD_PreviewView,关联创建一新类class CPreView : public Cdialog作为打印预览窗口的框架,稍后我们会在此框架窗口中打印用添加工具栏,状态栏。 再添加一对话框资源IDD_ChilePreview,设置属性子窗口,无边框,水平垂直滚动,居中,关联创建一新类CChildPreview作为预览窗口,此窗口后面会嵌入到刚创建的框架窗口中;
3.在CChildPreview类中添加变量public: CStatusBar *m_pStatusBar; CPrintDialog *m_pPrintSetup;//打印设置 CPageSetupDialog *m_pPageSetup;//页配置 int m_nOrientation;//方向 default 1,暂未用 CRect m_MarginRect;//页边距 CPoint m_StartPoint;//绘制起点 CRect m_FrameMarginRect;//页面与边框距离 CSize m_PageSize;//页大小 int m_nPageCount;//页数 int m_nCurrentPage;//当前页
int m_nZoom;//缩放大小 CSize m_HPSize,m_VPSize; 并在OnInitDialog()函数中初始化,初始化代码 参阅例程源码 ;
4.依次添加自定义函数public: void InitPreview(HDC hDC,DEVMODE dev); void UpdateScroll(); virtual void DrawPreview(CDC *DrawDC,CRect *DrawRect); void OnNext(); void OnPrevi(); void OnZoomOut(); void OnZoomIn(); void OnPrintsetup(); void OnPagesetup(); void UpdateStatusBar(); 实现函数的函数体部分过长就不贴出。
5.再依次添加窗口的消息响应函数WM_VSCROLL, WM_HSCROLL, WM_PAINT, WM_SIZE, WM_MOUSEWHEEL, WM_LBUTTONDOWN,函数的具体实现代码也参阅例程源码,这样我们就建立好了打印预览的类CChildPreview;
6.在CPreView类中添加前面预览窗口的头文件#include “ChildPreview.h”及一些变量protected:
CToolBar m_MainBar; CStatusBar m_StatusBar; CChildPreview m_ChildPreviewDlg; 并在OnInitDialog()函数中初始化
BOOL CPreView::OnInitDialog()
{
CDialog::OnInitDialog();
m_MainBar.Create(this);
m_MainBar.LoadToolBar(IDR_TOOLBAR1);
m_MainBar.ModifyStyle(0,TBSTYLE_FLAT | TBSTYLE_LIST,0);
m_MainBar.SetButtonText(0,"打印对话框");
m_MainBar.SetButtonText(1,"页面设置");
m_MainBar.SetButtonText(2,"上一页");
m_MainBar.SetButtonText(3,"下一页");
m_MainBar.SetButtonText(4,"放大");
m_MainBar.SetButtonText(5,"缩小");
m_MainBar.SetButtonText(6,"关闭");
UINT parts[] = {100,101,102,103,104,105};
m_StatusBar.Create(this);
m_StatusBar.SetIndicators(parts,6);
m_StatusBar.SetPaneInfo(0,0,0,60);
m_StatusBar.SetPaneInfo(1,0,0,60);
m_StatusBar.SetPaneInfo(2,0,0,60);
m_StatusBar.SetPaneInfo(3,0,0,60);
m_StatusBar.SetPaneInfo(4,0,0,60);
m_StatusBar.SetPaneInfo(5,0,0,60);
m_StatusBar.SetPaneText(0,"总页数:");
m_StatusBar.SetPaneText(2,"当前页:");
m_StatusBar.SetPaneText(4,"缩放比例:");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,0);
m_ChildPreviewDlg.Create(IDD_ChilePreview,this);
m_ChildPreviewDlg.m_pStatusBar = &m_StatusBar;
m_ChildPreviewDlg.ShowWindow(SW_SHOW);
CalcPreviewRect();
m_ChildPreviewDlg.UpdateStatusBar();
return TRUE;
}
7.工具栏的IDR_TOOLBAR1为我们自己添加的工具栏资源,上面有放大缩小等一些与打印预览操作相关的按钮ID,我们依次关联按钮ID的的响应函数OnPrintsetup, OnPagesetup, OnFirst, OnNext, OnZoomout, OnZoomin, OnClose;再添加一自定义函数 void CalcPreviewRect();及窗口的缩放消息WM_SIZE响应函数,这样我们的打印预览框架窗口也准备好了;
8.在主窗口中包含框架窗口头文件#include “PreView.h”,添加它的实例对象protected: CPreView m_PreviewDlg; 并初始化创建 m_PreviewDlg.Create(IDD_PreviewView);;
最后是在主对话中添加一按钮,响应点击函数,调用m_PreviewDlg.ShowWindow(SW_SHOW); 显示打印预览框架窗口便可;
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/f71de6bce833a0b94902972a50b39bf2/0/0/w_19rstb1lnt.swf-albumId=6359762309-tvId=6359762309-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 1)
上传
点击文件名下载附件 [weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4