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;
}

...全文
115 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
sumos 2013-04-09
  • 打赏
  • 举报
回复
在OnEraseBkgnd中只写一句 return TRUE; 在OnPaint中 CPaintDC dc(m_hWnd); 开始绘制 我之前也写过一个截图(基于WTL),地址:http://blog.csdn.net/zhoujielunzhimi/article/details/8140887
简介 WTL 是 Windows Template Library 的缩写,由微软的ATL(Active Template Library) 小组开发,主要是基于 ATL 对Win32API 的封装。从 2.0 后,功能逐步完善,成为了一个完整的支持窗口的框架(windows framework)。 WTL 功能不如MFC完善,但是比 MFC 更小巧,不依赖 MFC 的DLL。 WTL 不是微软的正式产品,没有微软的官方支持。 WTL有什么? 它给各种类型的应用程序提供了一个基本的框架.注意,虽然没有MFC那样的文档/视结构,但是有视(views). 在WTL有大量的代码来管理视,而且加入自己的代码也很容易. WTL有AppWizard,可以生成SDI,MDI和多线程SDI程序多线程SDI跟IE或Windows Explorer很像.它看起来是打开了多个程序实例,实际上这些窗口都是属于一个进程的). 另外,程序可以是基于对话框的,也可以是基于视的.视可以是基于CWindowImpl的,也可以是基于控件,甚至是IE里的一个HTML页.可以选择程序是否需要一个rebar, command bar (CE-like), toolbar 和/或status bar.另外,程序可以支持ActiveX控件,以及成为一个COM服务器. 这里有几个关于视的选项. WTL提供splitter窗口类(这样在一个视里您可以有两个窗口)和scroll窗口类(这样您的窗口可以比它显示的"视"小). WTL也有个类似MFC的UpDateUI的东西,但是它们不是很一样 - 主要的区别是您需要把需要更新的项用宏映射标注出来,然后您在您的类里加入执行UpdateUI的代码. DDX/DDV在WTL也支持,同样类似MFC,但有不同. 必须加一个宏映射来实现DoDataExchange,然后加入调用它的代码. 现在WTL也有GDI类了.然而,HDC的封装类就像CWindow一样,只进行了很简单的封装 - 它几乎没有加入任何新的功能.不过,在WTL,你可以得到播放meta文件和OpenGL支持. 最有价值的我猜应该是打印机DC的那些继承类 - WTL有打印机支持,甚至打印预览. 当然也有GDI对象的封装. 诸如画笔,画刷,区域等. WTL对所有的Win32 (和W2K) 通用对话框进行了封装.同样尽管简单,但是它的确使请求字体或者文件变的非常的简单. 合成了旧的AtlControls.h,新加了一些封装类. 这些封装类封装了W2K控件,以及一些不属于Win32的"控件",像Command Bar, bitmap button, hyperlink 和 wait cursor. WTL 最终把消息分离带入了ATL! 一些新的MSG映射宏将消息分离,调用您类里的消息处理函数.消息处理函数的参数的值是从消息分离得到的.唯一令人头痛的是,您需要查看头文件以确定函数参数的意义. 最后,WTL还有一些实用类.最重要的是CString. 不错,它是从MFC克隆得到的(copy on write),具有(在我知道的范围内)MFC版本的所有方法.还有查找文件的API的封装类,以及CRect, CSize and CPoint. WTL中没有什么? 没有Document支持 WTL提供了frame和view,但是没有document。WTL所关注的是用户界面,而document是不可见的,所以它不是WTL关心的范围。 没有Active Document支持 没有ISAPI支持 没有WinInet支持 没有对线程和同步进行包装 没有数据库支持 总结 如果打算写一个Win32 界面程序,我建议您在考虑MFC之前,先试试WTL.使用WTL来写您的代码, 程序将变得小巧些,也更有效率些.使用WTL, 还将得到ATL支持COM好处.可以在2000年一月份的平台SDK中找到WTL.在MSI选项页的Source Code section下. 无 。

3,245

社区成员

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

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