none
如何设置按钮外观 RRS feed

  • 问题

  • vc++2010中不继承CButton类,将放置到对话框上的按钮属性Owner Draw设置为true,如下编写代码,却只见到一块蓝色的区域,按钮上的文本设置无效,请帮忙改进。

    HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
     HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

     // TODO:  在此更改 DC 的任何特性
     CFont font;
     font.CreatePointFont(130,"华文行楷");
     switch(pWnd->GetDlgCtrlID())
     {
     case IDC_LINESTYLE:
      pDC->SetTextColor(RGB(255,0,0));
      pDC->SetBkMode(TRANSPARENT);
      break;
     case IDC_EDIT1:
      pDC->SetBkMode(TRANSPARENT);
      pDC->SetTextColor(RGB(255,255,255));
      pDC->SelectObject(&font);
      return m_brush;
      break;
     case IDC_TESTBUTTON:
      pDC->SetTextColor(RGB(255,0,0));     //该设置无效,连按钮上的文字也不见(m_brush为本类的蓝色画刷成员变量)
      return m_brush;
      break;
     default:
      break;
     }
     // TODO:  如果默认的不是所需画笔,则返回另一个画笔
     return hbr;
    }

    2012年10月16日 15:21

答案

  • 按钮的话,您需要从CButton类派生一个子类,在子类中添加处理虚函数DrawItem,MSDN上有段例子代码可以参考一下:
    // NOTE: CMyButton is a class derived from CButton. The CMyButton
    // object was created as follows:
    //
    // CMyButton myButton;
    // myButton.Create(_T("My button"), 
    //      WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW, 
    //      CRect(10,10,100,30), pParentWnd, 1);
    //
    // This example implements the DrawItem method for a CButton-derived 
    // class that draws the button's text using the color red.
    void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
       UINT uStyle = DFCS_BUTTONPUSH;
       // This code only works with buttons.
       ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
       // If drawing selected, add the pushed style to DrawFrameControl.
       if (lpDrawItemStruct->itemState & ODS_SELECTED)
          uStyle |= DFCS_PUSHED;
       // Draw the button frame.
       ::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, 
          DFC_BUTTON, uStyle);
       // Get the button's text.
       CString strText;
       GetWindowText(strText);
       // Draw the button text using the text color red.
       COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));
       ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(), 
          &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
       ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年10月17日 1:46
    版主
  • 你好,

    你所给的这段代码只是设置了文字的颜色,为了更好地找到问题所在,请给出DrawText部分的代码。

    另外,不建议直接修改CButton类的成员函数,建议保留原始的CButton,自己建立一个CButton的派生类,按如下步骤进行重绘:

    1. 继承CButton类之后,修改按钮的样式为Owner Draw,可以在资源编辑器里修改,也可以重载PreSubclassWindow方法,加入以下语句:

    ModifyStyle(0, BS_OWNERDRAW);

    2. 重载DrawItem方法,之后可再根据需要,重载OnMouseMove等方法获得想要的按钮效果。


    Damon Zheng [MSFT]
    MSDN Community Support | Feedback to us

    2012年10月18日 5:42
    版主

全部回复

  • 按钮的话,您需要从CButton类派生一个子类,在子类中添加处理虚函数DrawItem,MSDN上有段例子代码可以参考一下:
    // NOTE: CMyButton is a class derived from CButton. The CMyButton
    // object was created as follows:
    //
    // CMyButton myButton;
    // myButton.Create(_T("My button"), 
    //      WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW, 
    //      CRect(10,10,100,30), pParentWnd, 1);
    //
    // This example implements the DrawItem method for a CButton-derived 
    // class that draws the button's text using the color red.
    void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
       UINT uStyle = DFCS_BUTTONPUSH;
       // This code only works with buttons.
       ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
       // If drawing selected, add the pushed style to DrawFrameControl.
       if (lpDrawItemStruct->itemState & ODS_SELECTED)
          uStyle |= DFCS_PUSHED;
       // Draw the button frame.
       ::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, 
          DFC_BUTTON, uStyle);
       // Get the button's text.
       CString strText;
       GetWindowText(strText);
       // Draw the button text using the text color red.
       COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));
       ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(), 
          &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
       ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年10月17日 1:46
    版主
  • 选择OwnerDraw然后自己实现DrawItem


    麻烦把正确答案设为解答。

    2012年10月17日 2:06
    版主
  • 你好,

    你所给的这段代码只是设置了文字的颜色,为了更好地找到问题所在,请给出DrawText部分的代码。

    另外,不建议直接修改CButton类的成员函数,建议保留原始的CButton,自己建立一个CButton的派生类,按如下步骤进行重绘:

    1. 继承CButton类之后,修改按钮的样式为Owner Draw,可以在资源编辑器里修改,也可以重载PreSubclassWindow方法,加入以下语句:

    ModifyStyle(0, BS_OWNERDRAW);

    2. 重载DrawItem方法,之后可再根据需要,重载OnMouseMove等方法获得想要的按钮效果。


    Damon Zheng [MSFT]
    MSDN Community Support | Feedback to us

    2012年10月18日 5:42
    版主