为什么这一段双缓冲不显示?

北京的雾霾天 2010-04-26 10:29:17
如下的代码是一个ATL项目里的代码,本意是想通过Bitmap实现双缓冲,可是没有显示出任何东西,直接使用原来的di.hdcDraw就可以显示出来。经调试确信代码是执行了的,为什么?

HRESULT OnDrawAdvanced(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
HDC memDc;
HBITMAP bitmap;
memDc=CreateCompatibleDC(di.hdcDraw);
if (memDc!=NULL)
{
bitmap=CreateCompatibleBitmap(di.hdcDraw,rc.right-rc.left,rc.bottom-rc.top);
SelectObject(memDc, &bitmap);
Ellipse(memDc, rc.left, rc.top, rc.right, rc.bottom);
SetTextAlign(memDc, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("测试");
#ifndef _WIN32_WCE
TextOut(memDc,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
#else
ExtTextOut(memDc,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
ETO_OPAQUE,
NULL,
pszText,
ATL::lstrlen(pszText),
NULL);
#endif
//__debugbreak();
//SelectStockFont(&memDc);
BOOL b=BitBlt(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom,memDc,0,0,SRCCOPY);
DeleteObject(bitmap);
DeleteDC(memDc);
}
return S_OK;
}
...全文
375 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
Katch 2011-11-09
  • 打赏
  • 举报
回复
跟楼主犯了相同的错误,幸好有这个帖子~~~
北京的雾霾天 2010-04-26
  • 打赏
  • 举报
回复
说我坐标有问题的,
我希望你们通过Atl项目测试通过后再给我说我哪里错了。
对于坐标我试了几种写法了,都是不对的,我倒真希望是我的坐标不合适造成的,但结果都是不对的。不要再只靠自己想像回复了。。。。
Eleven 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hbxtlhx 的回复:]
这样应该合适了吧,一样不行:

C/C++ code

HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
HDC memDc=CreateCompatibleDC(di.hdcDraw);
if (memDc!=NULL)
{
H……
[/Quote]

你的坐标很成问题,Maybe就是坐标的问题
北京的雾霾天 2010-04-26
  • 打赏
  • 举报
回复
这样应该合适了吧,一样不行:

HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
HDC memDc=CreateCompatibleDC(di.hdcDraw);
if (memDc!=NULL)
{
HBITMAP bitmap=CreateCompatibleBitmap(memDc,rc.right-rc.left,rc.bottom-rc.top);
SelectObject(memDc, &bitmap);
Ellipse(memDc, 0, 0, rc.right-rc.left,rc.bottom-rc.top);
SetTextAlign(memDc, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("测试");
TextOut(memDc,
(rc.right-rc.left) / 2,
(rc.bottom-rc.top) / 2,
pszText,
lstrlen(pszText));
BOOL b=BitBlt(di.hdcDraw, rc.left, rc.top, rc.right-rc.left,rc.bottom-rc.top,memDc,0,0,SRCCOPY);
DeleteObject(bitmap);
DeleteDC(memDc);
}
return S_OK;
}



我觉得不是坐标的问题。
快乐鹦鹉 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hbxtlhx 的回复:]
TO:happyparrot

我现在的代码是这样的,还是不行,郁闷。。。


C/C++ code

HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
HDC memDc=CreateCompatibleDC(di.hdcDraw);
if (me……
[/Quote]
1楼的提示你没有注意啊?BitBlt中你的宽和高的参数不正确。
北京的雾霾天 2010-04-26
  • 打赏
  • 举报
回复
TO:happyparrot

我现在的代码是这样的,还是不行,郁闷。。。


HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
HDC memDc=CreateCompatibleDC(di.hdcDraw);
if (memDc!=NULL)
{
HBITMAP bitmap=CreateCompatibleBitmap(memDc,rc.right-rc.left,rc.bottom-rc.top);
SelectObject(memDc, &bitmap);
Ellipse(memDc, 0, 0, rc.right-rc.left,rc.bottom-rc.top);
SetTextAlign(memDc, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("测试");
TextOut(memDc,
(rc.right-rc.left) / 2,
(rc.bottom-rc.top) / 2,
pszText,
lstrlen(pszText));
BOOL b=BitBlt(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom,memDc,0,0,SRCCOPY);
DeleteObject(bitmap);
DeleteDC(memDc);
}
return S_OK;
}


补充:我用的是Window7,不会是这个问题吧。
m_tornado 2010-04-26
  • 打赏
  • 举报
回复
感觉这些函数有些乱,有的Rect是绝对坐标,好比(left, top, right, bottom),有的时候贴图是(left, top, width, height);绕着绕着就......
快乐鹦鹉 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hbxtlhx 的回复:]
我确信不是坐标的问题,因为我无论把坐标怎样改,结果还是一样的,没有显示出来。。。

我建立的项目是ATL的Activex,里面的有绘图的代码,所以我想用双缓冲,以前的项目是用MFC写的,可以正常运行,现在换成ATL,怎么也出不来。好奇怪。
[/Quote]
麻烦你按照上面的意见,把你的代码修改后,确认还是有同样的错误时,再把新代码贴一遍。
北京的雾霾天 2010-04-26
  • 打赏
  • 举报
回复
我本来是用VS2010来测试的,以为可能VS2010有问题。结果我在Vs2005上同样也建立了一个Atl项目,结果一样的不显示,你们可以测试一下:

HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
HDC memDc=CreateCompatibleDC(di.hdcDraw);
if (memDc!=NULL)
{
HBITMAP bitmap=CreateCompatibleBitmap(memDc,rc.right-rc.left,rc.bottom-rc.top);
SelectObject(memDc, &bitmap);
Ellipse(memDc, 0, 0, rc.right-rc.left,rc.bottom-rc.top);
SetTextAlign(memDc, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("测试");
ExtTextOut(memDc,
(rc.right-rc.left) / 2,
(rc.bottom-rc.top) / 2,
ETO_OPAQUE,
NULL,
pszText,
lstrlen(pszText),
NULL);
BOOL b=BitBlt(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom,memDc,0,0,SRCCOPY);
DeleteObject(bitmap);
DeleteDC(memDc);
}
return S_OK;
}
Eleven 2010-04-26
  • 打赏
  • 举报
回复
这样试一下,你的Ellipse显示的出来吗???
Eleven 2010-04-26
  • 打赏
  • 举报
回复
HRESULT OnDrawAdvanced(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
HDC memDc;
HBITMAP bitmap;
memDc=CreateCompatibleDC(di.hdcDraw);
if (memDc!=NULL)
{
int nWidth = rc.right - rc.left();
int nHeight = rc.bottom - rc.top;
bitmap=CreateCompatibleBitmap(di.hdcDraw, nWidth, nHeight);
HBITMAP hOldbmp = (HBITMAP)SelectObject(memDc, &bitmap);
Ellipse(memDc, 0, 0, rc.right, rc.bottom);

LPCTSTR pszText = _T("²âÊÔ");

DrawText(memDc, pszText, _tcslen(pszText), &rc, DT_CENTER|DT_VCENTER);

BitBlt(di.hdcDraw, 0, 0, nWidth, nHeight, memDc, 0, 0, SRCCOPY);
SelectObject(memDc, &hOldbmp);
DeleteObject(bitmap);
DeleteDC(memDc);
}
return S_OK;
}
北京的雾霾天 2010-04-26
  • 打赏
  • 举报
回复
TO:lfs09
是个好主意,不过好像Bitmap不太好保存成文件。。。
你妹的特盗不 2010-04-26
  • 打赏
  • 举报
回复
把你内存DC的图,保存成文件,然后看这个文件
这样容易找到是哪出错了
wasa113 2010-04-26
  • 打赏
  • 举报
回复
有待研究
北京的雾霾天 2010-04-26
  • 打赏
  • 举报
回复
我确信不是坐标的问题,因为我无论把坐标怎样改,结果还是一样的,没有显示出来。。。

我建立的项目是ATL的Activex,里面的有绘图的代码,所以我想用双缓冲,以前的项目是用MFC写的,可以正常运行,现在换成ATL,怎么也出不来。好奇怪。
你妹的特盗不 2010-04-26
  • 打赏
  • 举报
回复
刚才不是这贴回复说已经删除了吗?
怎么又出来了???
jyh_baoding 2010-04-26
  • 打赏
  • 举报
回复
看不出错误,帮顶
m_tornado 2010-04-26
  • 打赏
  • 举报
回复
bitmap=CreateCompatibleBitmap(di.hdcDraw,rc.right-rc.left,rc.bottom-rc.top);
SelectObject(memDc, &bitmap);
Ellipse(memDc, rc.left, rc.top, rc.right, rc.bottom);改成
Ellipse(memDc, 0, 0, rc.Width(), rc.Height());看看

极端的例子,假设rc.left = 100, rc.top = 100,然而rc的宽度为50,高度为50,
那么Ellipse(memDc, rc.left, rc.top, rc.right, rc.bottom);将画在了图片外面
而Ellipse(memDc, 0, 0, rc.Width(), rc.Height());从0,0开始算起,应该就能画上去了
快乐鹦鹉 2010-04-26
  • 打赏
  • 举报
回复
TextOut(memDc,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
应该是
TextOut(memDc,
(rc.right-rc.left) / 2,
(rc.bottom-rc.top) / 2,
pszText,
lstrlen(pszText));
快乐鹦鹉 2010-04-26
  • 打赏
  • 举报
回复
你在memDC的绘图都有问题,比如:Ellipse(memDc, rc.left, rc.top, rc.right, rc.bottom);
这里应该用Ellipse(memDc, 0, 0, rc.right-rc.left, rc.bottom-rc.top);
同样,TextOut(memDc,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
等都有问题。
你要注意一个问题,rc.left和rc.top是相对di.hdcDraw而言的位置;与之对应,在memDc中,它的坐标应该是(0,0)
加载更多回复(26)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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