显示作为窗口或对话框背景的位图(2)
6.接着,在 ClassWizard 中,从对象列表中选择对象 CBitmapBkgdDlg,从消息列表中选择消息 WM_CTLCOLOR,点击按钮 Add Function,在 CBitmapBkgdDlg 的方法 OnCtlColor 中添加下列代码:
HBRUSH CBitmapBkgdDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
return m_brush;
}
7.接着,在 ClassWizard 中,从对象列表中选择对象 CBitmapBkgdDlg,从消息列表中选择消息 WM_DESTROY,点击按钮 Add Function,在 CBitmapBkgdDlg 的方法 OnDestroy 中添加下列代码:
void CBitmapBkgdDlg::OnDestroy()
{
CDialog::OnDestroy();
ASSERT(m_hBmpOld);
VERIFY(m_dcMem.SelectObject(CBitmap::FromHandle(m_hBmpOld)));
m_Bitmap.DeleteObject();
}
8.编辑 CBitmapBkgdDlg 的消息映射如下,添加的新行用暗红色字体表示:
BEGIN_MESSAGE_MAP(CBitmapBkgdDlg, CDialog)
//{{AFX_MSG_MAP(CBitmapBkgdDlg)
ON_WM_CTLCOLOR()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
9.在 CBitmapBkgdDlg 的源文件 BitmapBkgdDlg.cpp 中添加下列新方法:
BOOL CBitmapBkgdDlg::OnEraseBkgnd(CDC * pDC)
{
pDC->StretchBlt(m_pt.x,m_pt.y,m_size.cx,m_size.cy,&m_dcMem,
0,0,m_bmInfo.bmWidth-1,m_bmInfo.bmHeight-1,SRCCOPY);
return TRUE;
}
10.在 CBitmapBkgdDlg 的头文件 BitmapBkgdDlg.h 中做下列修改,用暗红色字体表示。
class CBitmapBkgdDlg : public CDialog
{
protected:
CDC m_dcMem;
CBitmap m_Bitmap;
HBITMAP m_hBmpOld;
HBRUSH m_brush;
BITMAP m_bmInfo;
CPoint m_pt;
CSize m_size;
// Construction
public:
CBitmapBkgdDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CBitmapBkgdDlg)
enum { IDD = IDD_DIALOG1 };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA