WTL界面重画问题

sghcpt 2013-04-09 10:24:50
大家好,我的问题如下的。我需要实现一个截图的程序,当我点击鼠标开始截图时,可以成功画出截图的边框来,但当我需要拖拉右边框时,需要实现向右拖拉来增大截图的范围,就像qq截图可以拖拉右边框一样的功能。但是我面的代码,在拖拉右边框时,背景好像没有重新画出来,但我调试的时候,代码是有进入OnEraseBkgnd函数的,坐标也正确,请问那可能是什么问题引起的了?在此先谢谢帮忙的人。代码如下:
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;
}

...全文
134 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
sumos 2013-04-09
  • 打赏
  • 举报
回复
在OnEraseBkgnd中只写一句 return TRUE; 在OnPaint中 CPaintDC dc(m_hWnd); 开始绘制 我之前也写过一个截图(基于WTL),地址:http://blog.csdn.net/zhoujielunzhimi/article/details/8140887

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧