打开金山毒霸2008然后杀毒,在下面有个设置复选框(Checkbox):杀毒完成后关机(当杀毒设置为自动清除时有效).
当鼠标放在上面时,光标变为手的形状,在复选框上单击鼠标左键,复选框被选中,但是在复选框标题(文字)周围没有虚线框(请朋友们仔细观察,普通的复选框在点击鼠标左键时有虚线框)。
请问这是如何实现的?

解决方案 »

  1.   

    http://topic.csdn.net/u/20080304/15/70a58912-fbaa-45bf-b3ed-d459714e1fd4.html?1275559030
      

  2.   

    有虚线是因为它得到了焦点,你把焦点移到别的地方就行了。
    像帖子里面Button1.SetFocus(); 把焦点移到了button1上面了
      

  3.   

    GetDlgItem(IDC_CHK)->GetParent()->SetFocus();
      

  4.   

    自绘,标准控件估计调用了DrawFocusRect来绘制虚线框
      

  5.   

    在onDrawItem()里调用DrawFocusRect()画虚框,可以试试。
    不同的操作系统对于不同控件焦点的消息处理也不太一样。
    有问题再讨论。
      

  6.   

    关键问题是:checkbox不是在任何情况下都有虚线框,如果是这样的话,直接用DrawFocusRect()去掉虚线框即可。
    而是checkbox在鼠标左键单击之后会出现虚线框,怎样在鼠标单击之后不出现虚线框呢?在onDrawItem()操作就可以了吗?不用捕获鼠标左键单击的消息吗?
      

  7.   

    拦截 WM_ENTER消息,然后GetDlgItem(IDC_CHK)->GetParent()->SetFocus();
      

  8.   

    请参考如下Q&AQ. 當點選到這個TrackBar時就會出現如圖的虛線,要如何消除這虛線?
     
    A .那麼有關於不顯示虛線框的方式,可以試著在 OnEnter 事件中以轉移物件 Focus 給其它不顯示虛線框也不影響操作的物件,例如
      void __fastcall TForm1::TrackBar1Enter(TObject *Sender)
    {
        Panel1->SetFocus();
    }
      

  9.   

    这样可以实现没有虚线框的复选框:
    你把该复选框的标题文字设定为空(SetWindowText(_T("")))
    然后复选框后边的文字你用贴图或者画(TextOut())字的方法显示。
      

  10.   

    hyg2002的方法倒很有道理和可行性。////////////////////////////////////
    OnEnter函数,WM_ENTER消息,那是在DELPHI中吧,在VC中什么时候有这个消息啊?什么时候能触发这个消息哦?
      

  11.   

    拦截WM_GETFOCUS消息
    子类划参见 
    http://www.codeproject.com/KB/miscctrl/subclassdemo.aspx
      

  12.   

    自己搞定了,方法很简单,不用拦截这样那样的消息,方法是:
    1,在对话框上放置一个checkbox,ID为IDC_CHECK1,在Style里将Bitmap勾选上,设置为位图按钮;
    2,从CButton派生一个新的类CMybutton,然后在对话框的头函数中定义:CMybutton m_bybtn,然后在对话框的OnInitDialog()里加上:m_mybtn.SubclassDlgItem( IDC_CHECK1, this );
    3,在CMybutton加入afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
    ***注意不是:afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);这个函数根本不会进入,原因我还没弄清楚***
    然后加入代码:
    HBRUSH CMyButton::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
    pDC->SetBkMode( TRANSPARENT );
    pDC->SetTextColor( RGB(255,255,0) );
    pDC->TextOut( 20, 2, "杀毒完成后关机(当杀毒设置为自动清除时有效)" ); return (HBRUSH)GetStockObject(NULL_BRUSH);
    }
    OK,搞定!谢谢大家的帮助,在此把解决方法和大家分享!