posts - 25, comments - 69, trackbacks - 0, articles - 2

随心所欲的为你的vc对话框增加skin

Posted on 2006-12-07 16:02 壮士日志 阅读(447) 评论(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);
}


只有注册用户登录后才能发表评论。


网站导航: