Invalidate(TRUE)擦除窗口背景失败

lzr4304061988012 2010-05-18 12:21:56
在CStatic继承类的OnPaint中 BitBlt一幅位图
代码是:if (m_nKind == 1)
{
pDC->BitBlt(0,0,m_rc.Width(),m_rc.Height(),&MemDC,left,top,SRCCOPY);
}
初始m_nKind == 1,现在在另一个函数中让m_nKind不等于1,并Invalidate,但是位图并没有消失,
不过在放大或缩小等让客户区无效的操作发生后,位图消失。
不明白为什么显示调用Invalidate不能擦除背景。(WM_ERASEBKGND并没有重载)。
...全文
418 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaominduqiang 2010-05-25
  • 打赏
  • 举报
回复
你修改那个值后应该立即调用Invalidate这个函数
向立天 2010-05-18
  • 打赏
  • 举报
回复
你应该先绘制底色

if (m_nKind == 1)
在这之前加一句
pDC-〉FillSolidRect(m_rc, RGB(255, 255, 255));
lzr4304061988012 2010-05-18
  • 打赏
  • 举报
回复
m_rc是整个客户区,Invalidate也是一样的效果。
lzr4304061988012 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gudufuyun 的回复:]

引用 2 楼 lzr4304061988012 的回复:
void CShapesPicCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

CDC * pDC = &dc;

if (m_……
[/Quote]
你加的除了m_Bitmap.DeleteObject();我都同意,但是不能解决问题。
lzr4304061988012 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happyparrot 的回复:]

invalidate在何处调用的?
[/Quote]
void CShapesPicCtrl::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_nKind = (m_nKind+1)%4;
InvalidateRect(&m_rc,TRUE);
CStatic::OnTimer(nIDEvent);
}
wltg2001 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happyparrot 的回复:]
invalidate在何处调用的?
[/Quote]
同问
快乐鹦鹉 2010-05-18
  • 打赏
  • 举报
回复
invalidate在何处调用的?
gudufuyun 2010-05-18
  • 打赏
  • 举报
回复
void CShapesPicCtrl::OnPaint()  
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

CDC * pDC = &dc;

if (m_nKind == 1)
{
CDC MemDC;
CBitmap *pOldBitMap;
MemDC.CreateCompatibleDC(pDC);
pOldBitmap=MemDC.SelectObject(m_Bitmap);
pDC->BitBlt(0,0,m_rc.Width(),m_rc.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
m_Bitmap.DeleteObject();
MemDC.DeleteDC();
}


// Do not call CStatic::OnPaint() for painting messages
}
gudufuyun 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lzr4304061988012 的回复:]
void CShapesPicCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

CDC * pDC = &dc;

if (m_nKind == 1)
{
CDC MemDC;
MemDC.……
[/Quote]

恢复原来DC
dinjay 2010-05-18
  • 打赏
  • 举报
回复
用InvalidateRect试试,或者在onERASEBKGND中用白刷子把屏幕刷了,不过不应该啊。你可以试试
qifa 2010-05-18
  • 打赏
  • 举报
回复
同意LS, 问题可能多半出在OnPaint
lzr4304061988012 2010-05-18
  • 打赏
  • 举报
回复
void CShapesPicCtrl::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

CDC * pDC = &dc;

if (m_nKind == 1)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(m_Bitmap);

pDC->BitBlt(0,0,m_rc.Width(),m_rc.Height(),&MemDC,0,0,SRCCOPY);
}


// Do not call CStatic::OnPaint() for painting messages
}
快乐鹦鹉 2010-05-18
  • 打赏
  • 举报
回复
麻烦你把这个继承类的OnPaint代码贴完整看看。
lzr4304061988012 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wltg2001 的回复:]

为什么系统重绘的时候能够擦除背景?而我调用Invalidate时,也会发送WM_ERASEBKGND消息,按理默认的处理是会擦除背景,可是这里就没有。
===========
所以你先要确定一下你的Invalidate是不是被执行了。
[/Quote]
我调试的时候Invalidate,OnPaint,OnEraseBkgnd都执行了。
wltg2001 2010-05-18
  • 打赏
  • 举报
回复
为什么系统重绘的时候能够擦除背景?而我调用Invalidate时,也会发送WM_ERASEBKGND消息,按理默认的处理是会擦除背景,可是这里就没有。
===========
所以你先要确定一下你的Invalidate是不是被执行了。
lzr4304061988012 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xianglitian 的回复:]

引用 13 楼 lzr4304061988012 的回复:
引用 12 楼 xianglitian 的回复:

你应该先绘制底色

if (m_nKind == 1)
在这之前加一句
pDC-〉FillSolidRect(m_rc, RGB(255, 255, 255));

没有差别,但是在if外面调用,相当于用白色显示擦除了背景。这不是我想要的结果,因为我这是放在对话框中的……
[/Quote]
换一个颜色我肯定早用过了,但是这不是我想问的。为什么系统重绘的时候能够擦除背景?而我调用Invalidate时,也会发送WM_ERASEBKGND消息,按理默认的处理是会擦除背景,可是这里就没有。
wltg2001 2010-05-18
  • 打赏
  • 举报
回复
void CShapesPicCtrl::OnTimer(UINT nIDEvent)
=========
定时器?你的SetTimer写得正确吗?
向立天 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lzr4304061988012 的回复:]
引用 12 楼 xianglitian 的回复:

你应该先绘制底色

if (m_nKind == 1)
在这之前加一句
pDC-〉FillSolidRect(m_rc, RGB(255, 255, 255));

没有差别,但是在if外面调用,相当于用白色显示擦除了背景。这不是我想要的结果,因为我这是放在对话框中的一个图形控件,默认背景不是白色的。
[/Quote]
那就换成你想要的颜色呀
我只是告诉你道理
你不用一个颜色覆盖
再过来OnPaint函数什么也不做
当然还是原来DC上残留的内容
Eleven 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lzr4304061988012 的回复:]
引用 12 楼 xianglitian 的回复:

你应该先绘制底色

if (m_nKind == 1)
在这之前加一句
pDC-〉FillSolidRect(m_rc, RGB(255, 255, 255));

没有差别,但是在if外面调用,相当于用白色显示擦除了背景。这不是我想要的结果,因为我这是放在对话框中的一个图形控件,默认背景不是白色的。
[/Quote]

你改了m_nKind的值以后,你调用了Invaldiate()了吗?
lzr4304061988012 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xianglitian 的回复:]

你应该先绘制底色

if (m_nKind == 1)
在这之前加一句
pDC-〉FillSolidRect(m_rc, RGB(255, 255, 255));
[/Quote]
没有差别,但是在if外面调用,相当于用白色显示擦除了背景。这不是我想要的结果,因为我这是放在对话框中的一个图形控件,默认背景不是白色的。

15,980

社区成员

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

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