Posted on 2006-12-07 16:02
壮士日志 阅读(459)
评论(0) 编辑 收藏 所属分类:
编程技术
vc的对话框中,如果直接用picturebox作为对话框的背景,则其他控件会被挡住。经过高手指点,重载了WM_ERASEBKGND消息处理函数,很少的解决了这个问题。而且按照这个思路,可以很方便的为dialog增加动态的skin:
声明消息处理函数:
// Generated message map functions
//{{AFX_MSG(Input)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnButtonOk();
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
声明消息循环:
BEGIN_MESSAGE_MAP(Input, CDialog)
//{{AFX_MSG_MAP(Input)
ON_BN_CLICKED(IDC_BUTTON_OK, OnButtonOk)
ON_WM_LBUTTONDBLCLK()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
实现:
BOOL Input::OnEraseBkgnd(CDC* pDC)
{
if(m_hBmp)
{
BITMAP bm;
GetObject(m_hBmp,sizeof(bm),&bm);
HDC hMemdc=CreateCompatibleDC(pDC->m_hDC);
if(hMemdc)
{
HBITMAP hOldBmp=(HBITMAP)SelectObject(hMemdc,m_hBmp);
if(hOldBmp)
{
BitBlt(pDC->m_hDC,0,0,bm.bmWidth,bm.bmHeight,hMemdc,0,0,SRCCOPY);
SelectObject(hMemdc,hOldBmp);
DeleteDC(hMemdc);
DeleteObject(hOldBmp);
return TRUE;
}
else
DeleteDC(hMemdc);
}
}
return CDialog::OnEraseBkgnd(pDC);
}