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

解决方案 »

  1.   

    在派生类的OnEraseBkgnd中RETURN TRUE
      

  2.   

    在派生类的OnEraseBkgnd中RETURN TRUE
    正解!
      

  3.   


    试过了,没有用。现在的问题是:在切换自绘控件使能时,是能够重绘成功的;但中间会先绘制MFC自己的样式,然后再绘制我自绘的样式。造成肉眼可见的闪烁。
    我的意思是怎么修改能够让mfc不绘制他自带的样式,直接画我自定义的样式。
    我知道OWNERDRAW可以实现,但我现在用的是在onpaint中画,所以求帮助
    void CMyColorItem::OnEnable(BOOL bEnable)
    {
    if (m_isEnabled == bEnable)
    {
    return;
    }
    m_isEnabled = bEnable;
    CButton::OnEnable(bEnable);
    Invalidate();
    SubControlsOperation(1, bEnable);
    }
      

  4.   

    怎么修改能够让mfc不绘制他自带的样式,直接画我自定义的样式。
    求帮助啊
      

  5.   

    你自绘的代码里面不会写了调用父类的OnPaint函数吧?
      

  6.   


    没有啊,我新建了一个简单的项目测试,也是这样的。
    1.新建自定义控件MyCtrl继承CButton,在OnPaint中双缓冲绘图,为简单所以只调用FillRect填充为红色;
    2.在ONEnable中调用Indvicate()刷新;
    3.在主界面中添加了10个按钮,设置变量,类型改为MyCtrl;添加一个按钮【切换】;
    4.点击【切换】按钮切换这10个按钮的使能,发现在切换时会切换到MFC默认的样式,然后再调用OnPaint,造成短暂的闪烁。这应该是MFC自己的问题吧,在OnEnable中会不会它自己就默认刷新到原来的样式???去掉其中的CButton::OnEnable(bEnable);按钮的使能就无效了
    请问这应该怎么修改?
      

  7.   

    不是所有的 windows 控件把 绘制 放在 Paint 中,有时 根据消息 直接 绘制 控件 了,就出现 它也画,你也画。
      

  8.   


    请问MFC切换使能时,他调用的不是onpaint重绘么?
    如果不是,他调用的是什么函数绘制默认的样式的?
    它为什么会先重绘成默认的样式呢?
      

  9.   

    对 Button 可能 OnEnable中 它 自己 画了 并没有 调OnPaint。
    你 汇编 跟踪 看看。
      

  10.   

    试试:
    ModifyStyle(0,WS_DISABLED,0);
      

  11.   

    解决了,感谢各位的帮助。方法是在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);
    }
      

  12.   

    CButton::OnEnable(bEnable);  //父类方法画了一次
    Invalidate();  //自己又画了一次2次,就是你要的效果,无法双缓存
      

  13.   

    是啊,所以只有直接ENABLE消息自己处理,不调用OnEnable了