none
关于Checkbox的重绘问题 RRS feed

  • 问题

  • 项目需要制作一个具有透明颜色的Checkbox控件,同时在Checkbox禁用的情况下,要求禁用状态下的Checkbox字体颜色可定制。于是我写了一个继承自CButton的类,在类中对整个Checkbox进行重绘。已经可以让Checkbox在禁用状态下显示我需要的字体颜色,现在的问题是不论在何种状态下,Checkbox的复选框的绘制效果都是在Enable状态下的复选框,并且不能加载当前的Windows主题。如下图:

    而我需要的效果是

    我实现重绘的方式是重载OnPaint消息,OnPaint的代码如下:

    void CTelcCheckBox::OnPaint()
    {
     CPaintDC dc(this); // device context for painting

     CRect rect;
     GetClientRect(&rect);
     CRect BoxRect;
     BoxRect=rect;
     BoxRect.right =BoxRect.left +15;
     dc.SetBkMode(TRANSPARENT); 

     CString StrWndText;
     GetWindowText(StrWndText);

     if(disabled)
     {
      //enable状态
      dc.SetTextColor(disableTextColor);
      //画复选框
      dc.DrawFrameControl(BoxRect,DFC_BUTTON,DFCS_BUTTONCHECK|GetCheck()?DFCS_CHECKED :0);
     }
     else
     {
      //disable状态
      dc.SetTextColor(textColor);
      dc.DrawFrameControl(BoxRect,DFC_BUTTON,DFCS_BUTTONCHECK|GetCheck()?DFCS_CHECKED :0);
     }

     rect.OffsetRect (20,0);
     dc.DrawText(StrWndText, rect, DT_LEFT|DT_VCENTER|DT_SINGLELINE); 
    }

    关键的地方就是

    dc.DrawFrameControl(BoxRect,DFC_BUTTON,DFCS_BUTTONCHECK|GetCheck()?DFCS_CHECKED :0);
    这个方法的参数应该如何设置才能画出需要的效果呢?

    2011年11月3日 8:35

答案

  • 谢谢各位的帮助,这个问题我已经解决了。不过我是把它绕过去了……

    既然不能够按我的意愿显示图标,干脆就自己画算了。所以我截了四种状态下Checkbox复选框的XP主题位图,在OnPaint方法里动态加载了。效果已经达到预期了。

    这里面CheckBox的背景是透明的,并且disable状态下字体的颜色已经被我更换了。

     

    • 已标记为答案 guan345 2011年11月4日 5:37
    2011年11月4日 5:33

全部回复

  • 你需要的效果不就是XP风格的控件么?

    工程中加一句
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

    试试效果


    新浪微博http://weibo.com/xianglitian,欢迎围观
    2011年11月4日 1:01
  • GetDlgItem(IDC_CHECK2)->EnableWindow(FALSE);直接EnableWindow()来DisableCheckBox好像就是您下面那个图的样子
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年11月4日 1:13
    版主
  • 用EnableWindow()来disable控件,确实图标是我需要的结果,那是因为CheckBox被处理成了CStatic,但是这时候我设置的字体颜色和背景颜色都无效了,变成默认的样式了,所以也是不行的。所以我的代码也处理了OnEnable消息。让外面调用EnableWindow()不会真正把控件disable掉。

    2011年11月4日 5:26
  • 谢谢各位的帮助,这个问题我已经解决了。不过我是把它绕过去了……

    既然不能够按我的意愿显示图标,干脆就自己画算了。所以我截了四种状态下Checkbox复选框的XP主题位图,在OnPaint方法里动态加载了。效果已经达到预期了。

    这里面CheckBox的背景是透明的,并且disable状态下字体的颜色已经被我更换了。

     

    • 已标记为答案 guan345 2011年11月4日 5:37
    2011年11月4日 5:33
  • 你需要的效果不就是XP风格的控件么?

    工程中加一句
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

    试试效果


    新浪微博http://weibo.com/xianglitian,欢迎围观

    谢谢,不过没看懂怎么加……
    2011年11月4日 5:37
  • 加到stdafx.h中


    新浪微博http://weibo.com/xianglitian,欢迎围观
    2011年11月5日 0:28