这里要说明下屏幕坐标 箭头处为左上角也就是对话框的起点,x为要显示对话框宽度,y对话框的高度,如图所示,这个时候对话框起点不在是(0,0)了而且可能出现负数,因此在后面的操作中如果获取来的屏幕坐标一定先转为对话框的相当坐标,这个很关键,这个后面还会遇到,到时再说
::GetDC(NULL),::GetDC(::GetDesktopWindow()),::GetWindowDC(::GetDesktopWindow());
随便选一个
在OnInitDialog添加如下代码
HDC hDeskDC = ::GetWindowDC(::GetDesktopWindow());
CDCdeskDc;
deskDc.Attach(hDeskDC);
m_pBitmap =new CBitmap;//存放背景图片的CBitmap对象为后面其他功能实现需要
m_pBitmap->CreateCompatibleBitmap(&deskDc,m_cxScreen, m_cyScreen);//创建兼容位图
m_pbmpdesktop = new CBitmap;
m_pbmpdesktop->CreateCompatibleBitmap(&deskDc,m_cxScreen, m_cyScreen);
CDCdcTemp;
dcTemp.CreateCompatibleDC(&deskDc);
dcTemp.SelectObject(m_pBitmap);
dcTemp.BitBlt(0,0,m_cxScreen, m_cyScreen, &deskDc,m_xScreen,m_yScreen,SRCCOPY);
::ReleaseDC(NULL, hDeskDC);
之后还需在OnPaint添加一个画背景的函数DrawBackground( CDC * pMemDC )参数为内存用于双缓冲防止出现闪烁具体如何请查看相关的双缓冲知识这里就不再陈述了
这个函数的实现如下
void CScreenShotDlg::DrawBackground( CDC * pMemDC )
{
CDCdcTemp;
dcTemp.CreateCompatibleDC(pMemDC);
dcTemp.SelectObject(m_pBitmap);
pMemDC->BitBlt(0,0, m_cxScreen, m_cyScreen,&dcTemp, 0,0, SRCCOPY);
if(!m_pMaskBmp)
{
m_pMaskBmp =new CBitmap;
m_pMaskBmp->CreateCompatibleBitmap(pMemDC,m_cxScreen, m_cyScreen);
dcTemp.SelectObject(m_pMaskBmp);
dcTemp.FillSolidRect(0,0, m_cxScreen, m_cyScreen,BKCOLOR);//BKCOLOR混合要达到的颜色RGB(?,?,?)
}
else
{
dcTemp.SelectObject(m_pMaskBmp);
}
BLENDFUNCTION bf;
bf.BlendOp =AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 128; //透明度
bf.AlphaFormat = 0;
AlphaBlend(pMemDC->GetSafeHdc(),0,0,m_cxScreen,m_cyScreen,dcTemp.GetSafeHdc(),0,0,m_cxScreen,m_cyScreen,bf);
dcTemp.DeleteDC();
}
这里用到一个AlphaBlend 这个API 主要是把源DC于目标DC混合达到透明的效果这里的源DC是dcTemp,目标DCpMemDC,主要在混合前一定要保证目标和源都是新的(防止出现颜色越来越深最后完全变成BKCOLOR颜色),这个时候前面保存的m_pBitmap,以及 m_pMaskBmp就派上用处了,在每次混合前重新选择m_pBitmap到源DC。
哈哈这个是在我的截图上再用QQ截图又保存为jpg 难免会有点失真的样子,不过具体效果就好QQ截图差不多。
下面的一些功能实现下次再说,第一次写东西有什么地方错的请指教。 谢谢