代码如下,本意是想用另类的方法实现下程序窗口的透明(常规方法我也会),但现在发现程序只是在启动后能达到效果,我再刷新一下图片就没了,哪里有问题?另附一个问题,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;
}
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;
}
一般在对话框上贴图,不都是在OnEraseBkgnd里贴的嘛
我是在按钮点击事件里调用的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();
}
另外dcMem与bmScreen没有删除!dcMem.BitBlt(0, 0, 100, 100, &dcScreen, rc.left, rc.top, SRCCOPY);
这种方式,貌似不对吧!
这个是把屏幕dc的内容贴到内存dc上,我是这么理解的,但也不知道为什么,反正有效果
你们说的是对的,我知道为什么刚启动时可以了,因为刚启动时窗口还没有出现,调用OnEraseBkgnd截图截到的是背景,但启动后再用这个方法截到的就是自己的窗口了