自绘控件在切换使能时会闪烁?

pig357 2012-12-24 03:55:48
环境:VS2008 MFC Formview单文档
问题:自己继承了CButton控件,直接调用OnPaint绘制。平时都是好好的,但在切换使能控件或禁用控件时,控件始终都会闪烁。肉眼可以看见该控件会先画成MFC自己的样式,然后再画成我的onpaint中的样式。请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
我试过以下几种方式都不行:
1.使用OWNERDRAW,在DrawItem中绘制而不在Onpaint中画,这样会使我的界面很乱,按钮的点不中。因为该自绘控件不仅仅是做按钮,还有状态栏、标题栏、groupbox等功能;
2.OnEraseBkgnd修改过,不行;
3.OnEnable中再怎么修改也不行;


请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
...全文
251 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pig357 2012-12-26
  • 打赏
  • 举报
回复
是啊,所以只有直接ENABLE消息自己处理,不调用OnEnable了
引用 17 楼 tiger9991 的回复:
CButton::OnEnable(bEnable); //父类方法画了一次 Invalidate(); //自己又画了一次 2次,就是你要的效果,无法双缓存
傻X 2012-12-26
  • 打赏
  • 举报
回复
CButton::OnEnable(bEnable); //父类方法画了一次 Invalidate(); //自己又画了一次 2次,就是你要的效果,无法双缓存
pig357 2012-12-26
  • 打赏
  • 举报
回复
解决了,感谢各位的帮助。 方法是在WindowProc中屏蔽掉WM_ENABLE,如下: LRESULT CMyColorItem::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_ENABLE) { if (m_isEnabled == (BOOL)wParam) { return CButton::WindowProc(message, wParam, lParam); } m_isEnabled = (BOOL)wParam; Invalidate(); return 0; } return CButton::WindowProc(message, wParam, lParam); }
schlafenhamster 2012-12-26
  • 打赏
  • 举报
回复
试试: ModifyStyle(0,WS_DISABLED,0);
schlafenhamster 2012-12-26
  • 打赏
  • 举报
回复
对 Button 可能 OnEnable中 它 自己 画了 并没有 调OnPaint。 你 汇编 跟踪 看看。
pig357 2012-12-26
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
不是所有的 windows 控件把 绘制 放在 Paint 中,有时 根据消息 直接 绘制 控件 了,就出现 它也画,你也画。
请问MFC切换使能时,他调用的不是onpaint重绘么? 如果不是,他调用的是什么函数绘制默认的样式的? 它为什么会先重绘成默认的样式呢?
schlafenhamster 2012-12-26
  • 打赏
  • 举报
回复
不是所有的 windows 控件把 绘制 放在 Paint 中,有时 根据消息 直接 绘制 控件 了,就出现 它也画,你也画。
pig357 2012-12-26
  • 打赏
  • 举报
回复
引用 10 楼 tiger9991 的回复:
上你OnPaint代码,全一点哦
没有啊,我新建了一个简单的项目测试,也是这样的。 1.新建自定义控件MyCtrl继承CButton,在OnPaint中双缓冲绘图,为简单所以只调用FillRect填充为红色; 2.在ONEnable中调用Indvicate()刷新; 3.在主界面中添加了10个按钮,设置变量,类型改为MyCtrl;添加一个按钮【切换】; 4.点击【切换】按钮切换这10个按钮的使能,发现在切换时会切换到MFC默认的样式,然后再调用OnPaint,造成短暂的闪烁。 这应该是MFC自己的问题吧,在OnEnable中会不会它自己就默认刷新到原来的样式???去掉其中的CButton::OnEnable(bEnable);按钮的使能就无效了。。。 请问这应该怎么修改?
傻X 2012-12-26
  • 打赏
  • 举报
回复
上你OnPaint代码,全一点哦
傻X 2012-12-26
  • 打赏
  • 举报
回复
你自绘的代码里面不会写了调用父类的OnPaint函数吧?
pig357 2012-12-26
  • 打赏
  • 举报
回复
怎么修改能够让mfc不绘制他自带的样式,直接画我自定义的样式。 求帮助啊
pig357 2012-12-25
  • 打赏
  • 举报
回复
本来控件该直接切换成下面这样的:


但实际上,他会先切换成下面这样,然后在切换到上面那样,结果就会有闪烁,请问怎样直接显示上面的图?
pig357 2012-12-25
  • 打赏
  • 举报
回复
引用 2 楼 flydreamGG 的回复:
在派生类的OnEraseBkgnd中RETURN TRUE
试过了,没有用。 现在的问题是:在切换自绘控件使能时,是能够重绘成功的;但中间会先绘制MFC自己的样式,然后再绘制我自绘的样式。造成肉眼可见的闪烁。 我的意思是怎么修改能够让mfc不绘制他自带的样式,直接画我自定义的样式。 我知道OWNERDRAW可以实现,但我现在用的是在onpaint中画,所以求帮助

void CMyColorItem::OnEnable(BOOL bEnable)
{
	if (m_isEnabled == bEnable)
	{
		return;		
	}
	m_isEnabled = bEnable;
	CButton::OnEnable(bEnable);
	Invalidate();
	SubControlsOperation(1, bEnable);
}
dog357 2012-12-25
  • 打赏
  • 举报
回复
版主别误会,我只是lz的马甲,顶下而已,只是想解决问题
pig357 2012-12-25
  • 打赏
  • 举报
回复
qiu help a
夫人的泡泡鱼 2012-12-24
  • 打赏
  • 举报
回复
在派生类的OnEraseBkgnd中RETURN TRUE 正解!
昨夜无风 2012-12-24
  • 打赏
  • 举报
回复
在派生类的OnEraseBkgnd中RETURN TRUE
秦剑 2012-12-24
  • 打赏
  • 举报
回复
在任何时候都不要调用基类的东西,或是把消息传到上一层..

15,979

社区成员

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

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