在initDialog中 hBitmap = ::LoadBitmap(_AtlBaseModule.GetModuleInstance(), MAKEINTRESOURCE(IDB_BITMAP1));
这段代码在OnEraseBkgnd中
BOOL CVideoDlg::OnEraseBkgnd( CDCHandle dc )
HDC memHdc;
memHdc = ::CreateCompatibleDC(dc.m_hDC);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(memHdc, hBitmap); BITMAP bm;
m_bitmap.GetBitmap(&bm);// CRgn rgn;
// CRect rect;
// GetDlgItem(IDC_PROGRESS).GetWindowRect(&rect);
// rgn.CreateRectRgnIndirect(rect);
// HDC hdc = GetDCEx(rgn.m_hRgn,DCX_PARENTCLIP); StretchBlt(dc.m_hDC, 0, 0, rc.Width(), bm.bmHeight,
memHdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
ATLBitmap
int BkWidth = m_imgDlgBk.GetWidth();
int BkHeight = m_imgDlgBk.GetHeight();
m_imgDlgBk.StretchBlt(memDc.m_hDC, 0, rc.Height() - BkHeight, rc.Width(), BkWidth, 0, 0, BkWidth, BkHeight, SRCCOPY);
这么写却能够把背景贴上,m_imgDlgBk是一个CImage对象
{
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
// Retrieve the size of our bitmap...
BITMAP bmp;
m_bitmap.GetObject(sizeof(bmp),&bmp);
// and the size of our dlg's client area
CRect rect;
GetClientRect(&rect);
//
CRgn rgnClip;
CRect rc;
GetDlgItem(ctrlId)->GetWindowRect(&rc);
rgnClip.CreateRectRgnIndirect(rc);//DeleteObject needed
CDC* pDCex=GetDCEx(&rgnClip,DCX_PARENTCLIP);//ReleaseDC needed
// Fill the client area of dlg,include the ctrl with our bitmap
pDCex->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
&dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);// we create the background brush of SelEdit
CDC dcMemCtrl;
dcMemCtrl.CreateCompatibleDC(pDCex);//DeleteDC needed
CBitmap CtrlBmp;//DeleteObject needed
CtrlBmp.CreateCompatibleBitmap(pDCex,rc.Width(),rc.Height());
pOldBitmap = dcMemCtrl.SelectObject(&CtrlBmp);
ScreenToClient(&rc);
MapWindowPoints(this,rc);
// afxDump << rc << " xx\n";
dcMemCtrl.BitBlt(0, 0, rc.Width(), rc.Height(), pDCex, rc.left, rc.top, SRCCOPY);
CBitmap *nowBMP=dcMemCtrl.SelectObject(pOldBitmap);
// copy to CB for checking
#ifdef TEST
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP,nowBMP->GetSafeHandle());
CloseClipboard();
#endif
CBrush *pBackBr=new CBrush;
pBackBr->CreatePatternBrush(nowBMP);
//
DeleteObject(rgnClip);
DeleteObject(CtrlBmp);
ReleaseDC(pDCex);
dcMemCtrl.DeleteDC();
//
return pBackBr;
}BOOL CSliderDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
static BOOL bInitEditBr=FALSE;
if(!bInitEditBr)
{// add edit rect
bInitEditBr=TRUE;
// delete in CYourSlider
CBrush *pbrSlider=CreateBackgroundBrush(pDC, IDC_SLIDER2);
m_Slider2.SetCtrlInfo(pbrSlider,IDC_SLIDER2);
//
pbrSlider=CreateBackgroundBrush(pDC, IDC_SLIDER3);
m_Slider3.SetCtrlInfo(pbrSlider,IDC_SLIDER3);
//
pbrSlider=CreateBackgroundBrush(pDC, IDC_SLIDER4);
m_Slider4.SetCtrlInfo(pbrSlider,IDC_SLIDER4);
}
//
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
// Retrieve the size of our bitmap...
BITMAP bmp;
m_bitmap.GetObject(sizeof(bmp),&bmp);
// and the size of our window's client area
CRect rect;
GetClientRect(&rect);
// Fill the window's client area with our bitmap
pDC->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
&dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
dcMem.SelectObject( pOldBitmap );
//
return TRUE;
// return CDialog::OnEraseBkgnd(pDC);
}其实我是想参照这个代码处理进度条背景透明的,可是, 中间就除了问题
这个是不是有问题?unused????
发现原因:
在进行了SelectObject()后
应该SelectObject(hOldBitmap);
否则第二次刷新贴不上背景。 这是为什么呢