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