WTL界面重画问题
大家好,我的问题如下的。我需要实现一个截图的程序,当我点击鼠标开始截图时,可以成功画出截图的边框来,但当我需要拖拉右边框时,需要实现向右拖拉来增大截图的范围,就像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;
}
...全文
相关推荐
WTL做的FlashGet界面
WTL做的FlashGet界面 更多信息请查看 www.iubang.com
Atl调用WTL生成界面
Atl 利用 WTL 生成界面 com接口 供外部调用
VC下的 WTL 图形界面入门
WTL入门必备,详细介绍了WTL的使用,解注意事项。
wtl 很不错的用于做界面的
wtl 很不错的用于做界面的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
WTL起步-玩转图形界面
目录 序言 3 第一部分 基础篇 5 第一章 WTL的基础--ATL 5 第二章 WTL之路 11 第三章 命令条 14 第四章 带视图的框架窗口 15 第五章 使用MRU 17 第六章 创建多线程SDI应用程序 19 第七章 创建MDI应用程序 23 第八章 分隔窗口 26 第九章 GDI的封装 31 第十章 CString及其它 34 第十一章 动态数据交换(DDX)的WTL支持 35 第十二章 WTL向导 37 第十三章 WTL例程 39 第二部分 提高篇 40 第一章 位图视图的例程 40 第二章 上下文菜单 41 第三章 滚动视图 43 第四章 通用对话框 45 第五章 控件封装 47 第六章 打印与打印预览 52 第七章 属性页 56 第八章 消息过滤 59 第九章 空闲处理 62 第十章 UI更新 63 第十一章 消息分解 65 第十二章 WTL的未来 67


