• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

在CFormView中实现打印

发布: 2007-7-04 20:47 | 作者: admin | 来源:  网友评论 | 查看: 109次 | 进入软件测试论坛讨论

领测软件测试网 程念陵 蔡 璇

  在Microsoft Visual C++中,CFormView是一个非常有用的视类,CFormView类允许在视中放置控制,进一步可以放置ActiveX控件,并且可以利用ResourceWizard直接进行编辑。但是,CFormView不支持打印及打印预览,我们可以利用考屏功能将CFormView的窗口打印出来。


  一、 定义可打印的CFormView类


  首先,利用ClassWizard生成一个新类CPrintView ,继承于CFormView类,在CPrintView中定义如下变量:

  CRect m_rect; //保存得到的打印机打印区域大小

  CBitmap* m_pBmp; //屏幕拷贝为一个CBitmap

  CDC* m_pMemDC; //一个内存设备环境,兼容与打印机的设备环境

  BOOL m_bFlag; //一个BOOL变量,用于决定只创建m_pBmp和m_pMemDC一次

  然后,重载以下函数:

  virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

  virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

  virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

  virtual void OnPrint(CDC* pDC, CPrintInfo*);


  二、 在CPrintView类的构造函数中初始化变量


  CPrintView::CPrintView() : CFormView(CPrintView::IDD)

  {

   m_pMemDC = new CDC;

   m_pBmp = new CBitmap;

   m_bFlag = FALSE;

   //{{AFX_DATA_INIT(CPrintView)

   // NOTE: the ClassWizard will add member initialization here

   //}}AFX_DATA_INIT

  }


  三、 重载CPrintView::OnBeginPrinting()函数


  void CPrintView::OnBeginPrinting(CDC* pDC, CPrintInfo* /*pInfo*/)

  {

  m_pMemDC-〉CreateCompatibleDC(pDC); //创建兼容与打印机设备环境的内存设备环境,将内存设备环境的指针保存在m_pMemDC中

  CClientDC dc(this); //得到窗口用户区的设备环境,保存在dc中

  CRect rect;

  GetClientRect(rect); //得到窗口用户区的矩形区域,保存在rect中

  m_pMemDC-〉SetMapMode(MM_ANISOTROPIC); //设置映射方式为

  MM_ANISOTROPIC

  m_pMemDC-〉SetWindowExt(dc.GetDeviceCaps(LOGPIXELSX),

  dc.GetDeviceCaps(LOGPIXELSY));

  m_pMemDC-〉SetViewportExt(m_pMemDC-〉GetDeviceCaps(LOGPIXELSX),

  m_pMemDC-〉GetDeviceCaps(LOGPIXELSY)); //设置坐标系

  if (m_bFlag == FALSE)

  {

  m_pBmp-〉CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());

  } //创建兼容与dc的CBitmap

  m_pMemDC-〉SelectObject(m_pBmp); //选择GDI对象

  dc.DPtoLP(rect); //将设备坐标转换为逻辑坐标

  m_rect = rect; //保存窗口用户区矩形

  m_pMemDC-〉BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);

  //将dc复制到m_pMemDC

  if (m_bFlag == FALSE)

  m_bFlag = TRUE; //判断是否第一次运行

  }


  四、 重载CPrintView::OnPrint()函数


  void CPrintView::OnPrint(CDC* pDC, CPrintInfo*)

  {

  pDC-〉SetMapMode(MM_ANISOTROPIC); //设置打印机设备环境的坐标系为

   MM_ANISOTROPIC

  pDC-〉SetWindowExt(m_pMemDC-〉GetDeviceCaps(LOGPIXELSX),

  m_pMemDC-〉GetDeviceCaps(LOGPIXELSY));

  pDC-〉SetViewportExt(pDC-〉GetDeviceCaps(LOGPIXELSX), //设置坐标系

  pDC-〉GetDeviceCaps(LOGPIXELSY));

  pDC-〉StretchBlt(0,0,m_rect.Width(),m_rect.Height(),

  m_pMemDC,0,0,m_rect.Width(),m_rect.Height(),SRCCOPY); //在打印机设备环境中绘制内存设备环境中的图形

  }


  五、 需要将析构函数改写


  CPrintView::~CPrintView()

  {

  delete m_pMemDC; //删除内存设备环境

  delete m_pBmp; //删除CBitmap的指针

  }   

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网