在DrawItem()函数中使用双缓冲为什么无效?

qingfeng_happy5 2008-09-10 04:39:30
我自己派生了一个状态栏类,然后在在DrawItem()函数中通过双缓冲绘制文字或设置背景颜色。可什么运行起来显示状态栏上相关的位置是黑呼呼一片,显然出现了一些问题,请问,我的问题究竟出在哪呢?


void CStatusBarXP::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

CDC dc;
dc.Attach(lpDrawItemStruct->hDC);

CRect rect(&lpDrawItemStruct->rcItem);
CBrush brush(RGB(50, 50, 50));


CDC memoDC;
CBitmap m_bitmap,*oldBitmap;

switch(lpDrawItemStruct->itemID)
{

case 0: //状态栏第一栏

dc.FillRect(rect, &brush);
dc.SetTextColor(G_NORMALTEXT);
rect.top += 2;
dc.DrawText(m_strPanelFir, rect, DT_CENTER);

break;

case 1: //状态栏第二栏



if( memoDC.CreateCompatibleDC(&dc) )
{
if( m_bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height()) )
{
oldBitmap=memoDC.SelectObject(&m_bitmap);

memoDC.FillRect(rect, &brush);
memoDC.SetBkMode(TRANSPARENT);
memoDC.SetTextColor(RGB(50, 50, 50));
rect.top += 2;
memoDC.DrawText(m_strPanelSec, rect, DT_CENTER);

dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memoDC,0,0,SRCCOPY);
memoDC.SelectObject(oldBitmap);
}
}
break;
}

memoDC.DeleteDC();
m_bitmap.DeleteObject();

dc.Detach();
}
...全文
239 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhkza99c 2008-09-11
  • 打赏
  • 举报
回复
友情帮顶。
cnzdgs 2008-09-11
  • 打赏
  • 举报
回复
内存DC的位图大小是rect的宽和高,如果左上角不是0,
memoDC.FillRect(rect, &brush);
memoDC.DrawText(m_strPanelSec, rect, DT_CENTER);
这些操作都超出位图范围了。
qingfeng_happy5 2008-09-11
  • 打赏
  • 举报
回复
自己顶一下
cnzdgs 2008-09-11
  • 打赏
  • 举报
回复
给父窗口加上WS_CLIPCHILDREN风格。
qingfeng_happy5 2008-09-11
  • 打赏
  • 举报
回复
内存DC的位图大小是rect的宽和高,如果左上角不是0,
memoDC.FillRect(rect, &brush);
memoDC.DrawText(m_strPanelSec, rect, DT_CENTER);
这些操作都超出位图范围了。
///

非常感谢你的指点。确实是绘图区域出了问题。我改了一下:
CDC memoDC;
CBitmap m_bitmap,*oldBitmap;

CRect rectSecond;
rectSecond=rect;
rectSecond.OffsetRect(-rect.left,-rect.top); //调整区域

if( memoDC.CreateCompatibleDC(&dc) )
{
if( m_bitmap.CreateCompatibleBitmap(&dc,rectSecond.Width(),rectSecond.Height()) )
{
oldBitmap=memoDC.SelectObject(&m_bitmap);

memoDC.FillRect(rectSecond, &brush);

memoDC.SetBkMode(TRANSPARENT);
memoDC.SetTextColor(G_NORMALTEXT);
rectSecond.top += 2;
memoDC.DrawText(m_strPanelSec, rectSecond, DT_CENTER);
rectSecond.top -= 2;

dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memoDC,0,0,SRCCOPY);
memoDC.SelectObject(oldBitmap);
}
}

memoDC.DeleteDC();
m_bitmap.DeleteObject();

oldBitmap=NULL;

通过这种调整,现在在状态栏的第二列已经可以正常显示出图形了。只是频繁刷新时还是会有闪烁现象出现。我在
OnEraseBkgnd(CDC* pDC)函数里已经直接return TRUE了。为什么还是会有闪烁呢?
qingfeng_happy5 2008-09-10
  • 打赏
  • 举报
回复
你创建位图是使用的rect的宽和高,接下来都是对rect操作,如果rect的左上角坐标不是(0,0)就有问题了。
//

这是为什么?我当前的rect坐标左上角不是(0,0),但bitble()函数中的目标矩形中的前四个参数已经能描述第二列的位置了!(rect.left,rect.top,rect.Width(),rect.Height(),&memoDC....)
qingfeng_happy5 2008-09-10
  • 打赏
  • 举报
回复
调试时显示rect的值是(195,3,500,15)。因为我是在状态栏第二列进行操作,这个rect对应的就是第二列的坐标,应该没什么问题吧
cnzdgs 2008-09-10
  • 打赏
  • 举报
回复
如果改了还不行,说明还有其它问题,但这里不改肯定是黑乎乎一片。

你创建位图是使用的rect的宽和高,接下来都是对rect操作,如果rect的左上角坐标不是(0,0)就有问题了。
qingfeng_happy5 2008-09-10
  • 打赏
  • 举报
回复
我要在状态栏上显示一些文本信息,而且状态栏每1秒钟就要刷新一次,原来不用双缓冲时,状态栏闪得厉害,所以想用双缓冲实现,解决闪烁问题。
qingfeng_happy5 2008-09-10
  • 打赏
  • 举报
回复
那不是问题的关键,我换成了(255,0,0)还是一样黑乎乎的
cnzdgs 2008-09-10
  • 打赏
  • 举报
回复
你的文字和背景都用RGB(50, 50, 50)当然是黑乎乎一片了,把文字改成255,255,255试试。
qingfeng_happy5 2008-09-10
  • 打赏
  • 举报
回复
我以前用过双缓冲绘图,不过那都是在OnPaint()函数里,都没有问题的。这次在DrawItem()函数里怎么就不行了呢?运行后状态栏的第二列黑乎乎的一片。请教高手,问题究竟出在哪里?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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