环境:VS2008 MFC Formview单文档
问题:自己继承了CButton控件,直接调用OnPaint绘制。平时都是好好的,但在切换使能控件或禁用控件时,控件始终都会闪烁。肉眼可以看见该控件会先画成MFC自己的样式,然后再画成我的onpaint中的样式。请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
我试过以下几种方式都不行:
1.使用OWNERDRAW,在DrawItem中绘制而不在Onpaint中画,这样会使我的界面很乱,按钮的点不中。因为该自绘控件不仅仅是做按钮,还有状态栏、标题栏、groupbox等功能;
2.OnEraseBkgnd修改过,不行;
3.OnEnable中再怎么修改也不行;
请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
问题:自己继承了CButton控件,直接调用OnPaint绘制。平时都是好好的,但在切换使能控件或禁用控件时,控件始终都会闪烁。肉眼可以看见该控件会先画成MFC自己的样式,然后再画成我的onpaint中的样式。请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
我试过以下几种方式都不行:
1.使用OWNERDRAW,在DrawItem中绘制而不在Onpaint中画,这样会使我的界面很乱,按钮的点不中。因为该自绘控件不仅仅是做按钮,还有状态栏、标题栏、groupbox等功能;
2.OnEraseBkgnd修改过,不行;
3.OnEnable中再怎么修改也不行;
请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
请问这个该怎么处理,使其在改变使能时,控件不画成MFC的样式?
正解!
试过了,没有用。现在的问题是:在切换自绘控件使能时,是能够重绘成功的;但中间会先绘制MFC自己的样式,然后再绘制我自绘的样式。造成肉眼可见的闪烁。
我的意思是怎么修改能够让mfc不绘制他自带的样式,直接画我自定义的样式。
我知道OWNERDRAW可以实现,但我现在用的是在onpaint中画,所以求帮助
void CMyColorItem::OnEnable(BOOL bEnable)
{
if (m_isEnabled == bEnable)
{
return;
}
m_isEnabled = bEnable;
CButton::OnEnable(bEnable);
Invalidate();
SubControlsOperation(1, bEnable);
}
求帮助啊
没有啊,我新建了一个简单的项目测试,也是这样的。
1.新建自定义控件MyCtrl继承CButton,在OnPaint中双缓冲绘图,为简单所以只调用FillRect填充为红色;
2.在ONEnable中调用Indvicate()刷新;
3.在主界面中添加了10个按钮,设置变量,类型改为MyCtrl;添加一个按钮【切换】;
4.点击【切换】按钮切换这10个按钮的使能,发现在切换时会切换到MFC默认的样式,然后再调用OnPaint,造成短暂的闪烁。这应该是MFC自己的问题吧,在OnEnable中会不会它自己就默认刷新到原来的样式???去掉其中的CButton::OnEnable(bEnable);按钮的使能就无效了
请问这应该怎么修改?
请问MFC切换使能时,他调用的不是onpaint重绘么?
如果不是,他调用的是什么函数绘制默认的样式的?
它为什么会先重绘成默认的样式呢?
你 汇编 跟踪 看看。
ModifyStyle(0,WS_DISABLED,0);
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);
}
Invalidate(); //自己又画了一次2次,就是你要的效果,无法双缓存