Onpaint 界面刷新的问题。附上代码

hjt15000 2013-09-12 04:22:23
//重画消息
VOID CTableViewFrame::OnPaint()
{
//创建 DC
CPaintDC dc(this);

//获取区域
CRect rcClip;
CRect rcClient;
dc.GetClipBox(&rcClip);
GetClientRect(&rcClient);

//创建缓冲
CBitImage ImageBuffer;
ImageBuffer.Create(rcClient.Width(),rcClient.Height(),32);

//创建设备
CImageDC BufferDC(ImageBuffer);
CDC * pBufferDC=CDC::FromHandle(BufferDC);
//设置环境
pBufferDC->SetBkMode(TRANSPARENT);
pBufferDC->SelectObject(CSkinResourceManager::GetInstance()->GetDefaultFont());


//数量
if(m_TableViewArray.GetCount()>0L)
{
m_TableResource.m_CreatViewBack.DrawImage(pBufferDC,0,0);
m_TableViewArray[k]->DrawCustomTableView(pBufferDC,m_dwServerRule,&m_TableResource);
//绘画界面
dc.BitBlt(x,y,m_TableResource.m_tableback.GetWidth(),m_TableResource.m_tableback.GetHeight(),pBufferDC,0,0,SRCCOPY);

pFont.DeleteObject();
return;
}
}



bool UpdateTableView()
{
RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW|RDW_UPDATENOW);
OutputDebugStr(TEXT("刷新 \n"));
return true;
}

问题,就是 m_TableViewArray.GetCount() > 0 可以正常刷新并且显示,如果m_TableViewArray.GetCount() < 0 了,不会擦除掉之前的图片背景。。。需要最小化或者最大化窗口才能重绘。。

求解啊。。。。
...全文
210 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjt15000 2013-09-12
  • 打赏
  • 举报
回复
引用 10 楼 tiger9991 的回复:
先调用父类的OnPaint(),清空一下然后再继续楼主这段代码
不是很明白,麻烦详细点。谢谢啦
看不见的裂痕 2013-09-12
  • 打赏
  • 举报
回复
先调用父类的OnPaint(),清空一下然后再继续楼主这段代码
看不见的裂痕 2013-09-12
  • 打赏
  • 举报
回复
return CTableViewFrame的父类::OnPaint()
hjt15000 2013-09-12
  • 打赏
  • 举报
回复
引用 7 楼 zyaiwx 的回复:
[quote=引用 6 楼 hjt15000 的回复:] [quote=引用 4 楼 zyaiwx 的回复:] Invalidate() 主动引起窗口重绘?
没有啊,GetCount()>0 没问题的啊,直接就显示图片了。但是我只要GetCount()=0了,不会把之前显示的图片擦除掉。[/quote] 我是说,你在GetCount()==0里面加上 Invalidate()看看[/quote] 我试过了, Invalidate() 跟 updatewindow() 一起加上 都没用
zybjtu 2013-09-12
  • 打赏
  • 举报
回复
引用 6 楼 hjt15000 的回复:
[quote=引用 4 楼 zyaiwx 的回复:] Invalidate() 主动引起窗口重绘?
没有啊,GetCount()>0 没问题的啊,直接就显示图片了。但是我只要GetCount()=0了,不会把之前显示的图片擦除掉。[/quote] 我是说,你在GetCount()==0里面加上 Invalidate()看看
hjt15000 2013-09-12
  • 打赏
  • 举报
回复
引用 4 楼 zyaiwx 的回复:
Invalidate() 主动引起窗口重绘?
没有啊,GetCount()>0 没问题的啊,直接就显示图片了。但是我只要GetCount()=0了,不会把之前显示的图片擦除掉。
hjt15000 2013-09-12
  • 打赏
  • 举报
回复
引用 3 楼 tiger9991 的回复:
你难道动了OnEraseBkg里面Return False了?
没有,里面是重载就直接Return TRUE了,我纠结了2天了。
zybjtu 2013-09-12
  • 打赏
  • 举报
回复
Invalidate() 主动引起窗口重绘?
看不见的裂痕 2013-09-12
  • 打赏
  • 举报
回复
你难道动了OnEraseBkg里面Return False了?
hjt15000 2013-09-12
  • 打赏
  • 举报
回复
)
引用 1 楼 tiger9991 的回复:
求解啥?? 整体输出就一句话 dc.BitBlt(x,y,m_TableResource.m_tableback.GetWidth(),m_TableResource.m_tableback.GetHeight(),pBufferDC,0,0,SRCCOPY) 其他地方都是在内存里面操作的。 楼主到底想问啥?
就是 m_TableViewArray.GetCount()==0L 的时候,前面画出来的图片都还在。我要最小化窗口一下,背景图片才会消失
看不见的裂痕 2013-09-12
  • 打赏
  • 举报
回复
求解啥?? 整体输出就一句话 dc.BitBlt(x,y,m_TableResource.m_tableback.GetWidth(),m_TableResource.m_tableback.GetHeight(),pBufferDC,0,0,SRCCOPY) 其他地方都是在内存里面操作的。 楼主到底想问啥?

16,548

社区成员

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

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

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