3,245
社区成员
发帖
与我相关
我的任务
分享
LRESULT CCatchScreenDlg::OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CPaintDC dc(m_hWnd);
CGuiRect rect;
::GetClientRect(m_hWnd, &rect);
HDC dcCompatible = ::CreateCompatibleDC(dc);
HBITMAP hBmp = ::CreateCompatibleBitmap(dc, rect.GetWidth(), rect.GetHeight());
HGDIOBJ tmp = ::SelectObject(dcCompatible, hBmp);
if (m_pImgScreen) //CxImage类的指针对象,保存了整个界面的图片
m_pImgScreen->Draw(dcCompatible, rect.left, rect.top, rect.GetWidth(), rect.GetHeight(), NULL, TRUE);
CMemoryDC memDC(dc, rect); //WTL提供的双缓存,析构时自动绘制
BLENDFUNCTION bf;
bf.AlphaFormat = 0;
bf.BlendFlags = 0;
bf.BlendOp = AC_SRC_OVER;
bf.SourceConstantAlpha = 100;
memDC.AlphaBlend(0, 0, rect.GetWidth(), rect.GetHeight(), dcCompatible, 0, 0, rect.GetWidth(), rect.GetHeight(), bf);
if (m_catchPicStatus == CATCHPICING) //开始截图,就是刚开始点击鼠标拖拉时截图
{
RECT rc_catch;
rc_catch.left = m_ptStart.x;
rc_catch.top = m_ptStart.y;
rc_catch.right = m_ptEnd.x;
rc_catch.bottom = m_ptEnd.y;
memDC.BitBlt(rc_catch.left, rc_catch.top,rc_catch.right-rc_catch.left,rc_catch.bottom-rc_catch.top,dcCompatible,rc_catch.left,rc_catch.top,SRCCOPY);
}
if (CATCHPICFINISH == m_catchPicStatus && m_bTrackPic) //结束截图,而且点击截图右边框时实现拖拉。
{
RECT rc_catch;
rc_catch.left = m_ptStart.x;
rc_catch.top = m_ptStart.y;
rc_catch.right = m_ptEnd.x;
rc_catch.bottom = m_ptEnd.y;
TCHAR tszPos[100] = {0};
wsprintf(tszPos, _T("left=%d,top=%d,right=%d,bottom=%d\n"), rc_catch.left, rc_catch.top, rc_catch.right, rc_catch.bottom);
OutputDebugString(tszPos);
memDC.BitBlt(rc_catch.left, rc_catch.top,rc_catch.right-rc_catch.left,rc_catch.bottom-rc_catch.top,dcCompatible,rc_catch.left,rc_catch.top,SRCCOPY);
}
::SelectObject(dcCompatible, tmp);
::DeleteObject(hBmp);
::DeleteDC(dcCompatible);
return S_FALSE;
}
LRESULT CCatchScreenDlg::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(m_hWnd, &ps);
if (m_catchPicStatus == CATCHPICING || CATCHPICFINISH == m_catchPicStatus)
{
m_rectTracker.Draw(hdc); //这个是画边框线
}
::EndPaint(m_hWnd, &ps);
return 0;
}