代码如下,本意是想用另类的方法实现下程序窗口的透明(常规方法我也会),但现在发现程序只是在启动后能达到效果,我再刷新一下图片就没了,哪里有问题?另附一个问题,CClientDC,调用BitBlt没有效果吗?TextOut可以用,但是BitBlt无法显示出图片来
BOOL CTestScreenSnapDlg::OnEraseBkgnd( CDC* pDC )
{
BOOL bRes = CDialog::OnEraseBkgnd(pDC); //只是这个区域显示程序后面的背景
CRect rc;
rc.SetRect(0, 0, 100, 100);
ClientToScreen(&rc); //抓取程序后面的背景
CDC dcScreen;
dcScreen.CreateDC(_T("DISPLAY"), NULL, NULL, NULL); CDC dcMem;
dcMem.CreateCompatibleDC(&dcScreen); CBitmap bmScreen;
bmScreen.CreateCompatibleBitmap(&dcScreen, 100, 100); CBitmap *pOld = dcMem.SelectObject(&bmScreen);
dcMem.BitBlt(0, 0, 100, 100, &dcScreen, rc.left, rc.top, SRCCOPY); //把背景贴到界面上
pDC->BitBlt(0, 0, 100, 100, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOld);
dcScreen.DeleteDC(); return bRes;
}

解决方案 »

  1.   

    OnPaint里此处直接return true;
      

  2.   

    CClientDC,您在哪里调用Bitblt?您在erase时取得自己的背景,俺有点迷惑了,那是不是取得的就是自己当前的图形?如果是的话,那岂不是透明无效了。
      

  3.   

    在erase里面使用pDC->BitBlt(0, 0, 100, 100, &dcMem, 0, 0, SRCCOPY);是有问题的。应该直接在OnPaint里面使用。顶1楼
      

  4.   


    一般在对话框上贴图,不都是在OnEraseBkgnd里贴的嘛
      

  5.   


    我是在按钮点击事件里调用的void CTestScreenSnapDlg::OnBnClickedOk()
    {
    // TODO: 在此添加控件通知处理程序代码
    //OnOK();
    CRect rc;
    rc.SetRect(0, 0, 100, 100);
    ClientToScreen(&rc); CDC dcScreen;
    dcScreen.CreateDC(_T("DISPLAY"), NULL, NULL, NULL); CDC dcMem;
    dcMem.CreateCompatibleDC(&dcScreen); CBitmap bmScreen;
    bmScreen.CreateCompatibleBitmap(&dcScreen, 100, 100); CBitmap *pOld = dcMem.SelectObject(&bmScreen);
    dcMem.BitBlt(0, 0, 100, 100, &dcScreen, rc.left, rc.top, SRCCOPY); dc.BitBlt(0, 0, 100, 100, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOld);
    dcScreen.DeleteDC(); Invalidate();
    }
      

  6.   

    呵呵,在鼠标事件里面调用显示,一刷新什么都没有了!
    另外dcMem与bmScreen没有删除!dcMem.BitBlt(0, 0, 100, 100, &dcScreen, rc.left, rc.top, SRCCOPY);
    这种方式,貌似不对吧!
      

  7.   


    这个是把屏幕dc的内容贴到内存dc上,我是这么理解的,但也不知道为什么,反正有效果
      

  8.   

    #2 #9
    你们说的是对的,我知道为什么刚启动时可以了,因为刚启动时窗口还没有出现,调用OnEraseBkgnd截图截到的是背景,但启动后再用这个方法截到的就是自己的窗口了