//背景直接使用位图画刷填充
BOOL CBitmapTextDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rcClient;
GetClientRect(rcClient);
pDC->FillRect(rcClient, &m_brBk);
return TRUE;
}HBRUSH CBitmapTextDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); CRect rcCtrl;
pWnd->GetWindowRect( &rcCtrl ); //获取控件位置
ScreenToClient( &rcCtrl ); //转换到对话框 //获取ClientDC
CDC *pBkDC = GetDC(); //拷贝背景
pDC->BitBlt(0, 0, rcCtrl.Width(), rcCtrl.Height(), pBkDC, rcCtrl.left, rcCtrl.top, SRCCOPY); //清理工作
ReleaseDC( pBkDC ); //释放ClientDC pDC->SetBkMode(TRANSPARENT); //背景透明模式
hbr = (HBRUSH)GetStockObject(NULL_BRUSH); // return hbr;
} 创建了一个背景画刷,将对话框背景替换为位图。然后覆盖OnCtlColor()函数,代码如上。这么做,RADIO,CHECK,STATIC控件的背景均能变为透明,即与对话框背景融为一体。而EDIT控件,则有异常,当鼠标在EDIT控件上来回移动时,EDIT控件会无限重画。这问题要怎么处理呢?
BOOL CBitmapTextDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rcClient;
GetClientRect(rcClient);
pDC->FillRect(rcClient, &m_brBk);
return TRUE;
}HBRUSH CBitmapTextDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); CRect rcCtrl;
pWnd->GetWindowRect( &rcCtrl ); //获取控件位置
ScreenToClient( &rcCtrl ); //转换到对话框 //获取ClientDC
CDC *pBkDC = GetDC(); //拷贝背景
pDC->BitBlt(0, 0, rcCtrl.Width(), rcCtrl.Height(), pBkDC, rcCtrl.left, rcCtrl.top, SRCCOPY); //清理工作
ReleaseDC( pBkDC ); //释放ClientDC pDC->SetBkMode(TRANSPARENT); //背景透明模式
hbr = (HBRUSH)GetStockObject(NULL_BRUSH); // return hbr;
} 创建了一个背景画刷,将对话框背景替换为位图。然后覆盖OnCtlColor()函数,代码如上。这么做,RADIO,CHECK,STATIC控件的背景均能变为透明,即与对话框背景融为一体。而EDIT控件,则有异常,当鼠标在EDIT控件上来回移动时,EDIT控件会无限重画。这问题要怎么处理呢?
如果不在这BitBlt,就算判断了控件的ID,然后pDC->SetBkMode(TRANSPARENT);再返回空画刷,所有控件的背景均变成默认的灰色,而且当鼠标经过EDIT控件时,该控件还会变黑。