在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的指针
}
-
近期文章
近期评论
- coolker 发表在《打造最快的Hash表》
- struggle 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- diys 发表在《C语言编程宝典(王大刚) 1.1 C 语言的产生与发展》
文章归档
- 2022 年十月
- 2014 年一月
- 2013 年十二月
- 2012 年十一月
- 2012 年七月
- 2012 年六月
- 2012 年五月
- 2012 年四月
- 2012 年三月
- 2012 年二月
- 2011 年十二月
- 2011 年十月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年四月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年十月
- 2007 年九月
- 2007 年八月
- 2007 年七月
- 2007 年六月
- 2007 年三月
- 2007 年二月
- 2007 年一月
- 2006 年十二月
- 2006 年十一月
- 2006 年十月
- 2006 年九月
- 2006 年八月
- 2006 年七月
- 2006 年六月
- 2006 年五月
- 2006 年四月
- 2006 年三月
- 2006 年二月
- 2006 年一月
- 2005 年十二月
- 2005 年十一月
分类目录
功能