在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

解决方案 »

  1.   


    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对象
      

  2.   

    CBrush* CSliderDlg::CreateBackgroundBrush(CDC* pDC,int ctrlId)
    {
    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);
    }其实我是想参照这个代码处理进度条背景透明的,可是, 中间就除了问题
      

  3.   

    看看StretchBlt调用的时候,各个参数的值是否有效,比如dc.m_hDC的值是否有效?
      

  4.   


    这个是不是有问题?unused????
      

  5.   


    发现原因:
    在进行了SelectObject()后
    应该SelectObject(hOldBitmap);
    否则第二次刷新贴不上背景。 这是为什么呢