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