在CFormView中实现打印

发表于:2007-07-04来源:作者:点击数: 标签:
程念陵 蔡 璇 在Microsoft Visual C++中,CFormView是一个非常有用的视类,CFormView类允许在视中放置控制,进一步可以放置ActiveX控件,并且可以利用ResourceWizard直接进行编辑。但是,CFormView不支持打印及打印预览,我们可以利用考屏功能将CFormView的窗
程念陵 蔡 璇

  在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的指针

  }   

原文转自:http://www.ltesting.net