解决方案 »

  1.   

    不太清除什么情况
    如果是按钮要动态改变背景色,就得自绘,留一个SetBkColor的接口供随时调用
    简单一点就随便预留一个矩形区域,用某种颜色填充就OK了
      

  2.   

    凌乱哥说的,我不是很明白,求指点。不知道凌乱哥,是否用过ribbon?
      

  3.   

    没有用过,但是查了一下,跟MFC的控件差不多,应该也可以派生然后自绘吧?那我上面说的“随便预留一个矩形区域,用某种颜色填充”这个方法可行不?
      

  4.   

    很简单的,子类化一个CStatic就可以了
      

  5.   

    typedef struct  tagCOLORBAR
    {
         CRect  r;
         COLORREF co;
    }COLORBAR;COLORBAR  select1;
    COLORBAR  select2;
    COLORBAR  xColor[3][[10];
      

  6.   

    http://download.csdn.net/detail/yangxudong/801172
    看看这个代码
      

  7.   

    Ribbon 是一个窗口,我获取了它的句柄,通过句柄我给某区域填充了颜色,但是它自己刷新重绘就没有了。
      

  8.   

    朋友,你这是基于对话框的,我知道怎么弄,我想问的是Ribbon
      

  9.   

    用Ribbon。高手,自己先试试吧!
      

  10.   

    上面的都好扯啊。楼主要换自绘按钮一样去绘制Ribbon的按钮.继承CMFCRibbonButton类,重写CMFCRibbonButton里的void CMFCRibbonButton::OnDraw(CDC* pDC)函数.void CMFCRibbonButton::OnDraw(CDC* pDC)我查看到的定义是这样的:
    void CMFCRibbonButton::OnDraw(CDC* pDC)
    {
    ASSERT_VALID(this);
    ASSERT_VALID(pDC); if (m_rect.IsRectEmpty())
    {
    return;
    } if (IsDefaultMenuLook() && !IsQATMode() && !m_bIsLargeImage)
    {
    CMFCToolBarMenuButton dummy; dummy.m_strText = m_strText;
    dummy.m_nID = m_nID;
    dummy.m_bMenuMode = TRUE;
    dummy.m_pWndParent = GetParentWnd();
    dummy.m_bIsRadio = m_bIsRadio; if (IsChecked())
    {
    dummy.m_nStyle |= TBBS_CHECKED;
    } if (HasMenu())
    {
    dummy.m_bDrawDownArrow = TRUE;
    } BOOL bIsHighlighted = m_bIsHighlighted; if (IsDisabled())
    {
    dummy.m_nStyle |= TBBS_DISABLED; bIsHighlighted = IsFocused();
    } dummy.OnDraw(pDC, m_rect, NULL, TRUE, FALSE, bIsHighlighted || m_bIsFocused);
    return;
    } BOOL bIsDisabled = m_bIsDisabled;
    BOOL bIsDroppedDown = m_bIsDroppedDown;
    BOOL bIsHighlighted = m_bIsHighlighted;
    BOOL bMenuHighlighted = m_bIsMenuHighlighted;
    BOOL bCommandHighlighted = m_bIsCommandHighlighted; const int cxDropDown = GetDropDownImageWidth(); if (m_bIsDisabled && HasMenu())
    {
    if (m_bIsDefaultCommand || (!m_bIsDefaultCommand && !(m_nID == 0 || m_nID == (UINT)-1)))
    {
    m_bIsHighlighted = FALSE;
    }
    else
    {
    m_bIsDisabled = FALSE;
    }
    } if (m_bToBeClosed)
    {
    m_bIsDroppedDown = FALSE;
    } if (m_bIsFocused)
    {
    m_bIsHighlighted = TRUE;
    m_bIsMenuHighlighted = TRUE;
    m_bIsCommandHighlighted = TRUE;
    } CRect rectMenuArrow;
    rectMenuArrow.SetRectEmpty(); if (HasMenu())
    {
    rectMenuArrow = m_rect; rectMenuArrow.left = rectMenuArrow.right - cxDropDown - m_nMenuArrowMargin;
    if (m_sizeTextRight.cx == 0 && !m_bQuickAccessMode)
    {
    rectMenuArrow.left -= 2;
    } rectMenuArrow.bottom -= m_nMenuArrowMargin; if (m_bIsDefaultCommand)
    {
    m_rectMenu = m_rect; m_rectMenu.left = m_rectMenu.right - cxDropDown - m_nMenuArrowMargin - 1; m_rectCommand = m_rect;
    m_rectCommand.right = m_rectMenu.left; m_bMenuOnBottom = FALSE;
    }
    } CSize sizeImageLarge = GetImageSize(RibbonImageLarge);
    CSize sizeImageSmall = GetImageSize(RibbonImageSmall); CRect rectText = m_rect;
    BOOL bDrawText = !IsApplicationButton() && !m_bQuickAccessMode && !m_bFloatyMode; if (m_bQuickAccessMode || m_bFloatyMode)
    {
    bDrawText = FALSE;
    }
    else if (m_bCompactMode)
    {
    bDrawText = FALSE;
    }
    else if (sizeImageLarge != CSize(0, 0) && !m_bMenuOnBottom && m_bIsLargeImage)
    {
    if (!m_rectMenu.IsRectEmpty())
    {
    m_rectMenu.left -= cxDropDown;
    m_rectCommand.right = m_rectMenu.left;
    } rectMenuArrow.OffsetRect(-cxDropDown / 2, 0);
    } const RibbonImageType imageType = m_bIsLargeImage ? RibbonImageLarge : RibbonImageSmall; CSize sizeImage = GetImageSize(imageType);
    BOOL bDrawDefaultImage = FALSE; if ((m_bQuickAccessMode || m_bFloatyMode) && sizeImage == CSize(0, 0))
    {
    // Use default image:
    sizeImage = CSize(16, 16); if (afxGlobalData.GetRibbonImageScale() != 1.)
    {
    sizeImage.cx = (int)(.5 + afxGlobalData.GetRibbonImageScale() * sizeImage.cx);
    sizeImage.cy = (int)(.5 + afxGlobalData.GetRibbonImageScale() * sizeImage.cy);
    } bDrawDefaultImage = TRUE;
    } CRect rectImage = m_rect;
    rectImage.DeflateRect(m_szMargin); if (IsApplicationButton())
    {
    if (afxGlobalData.GetRibbonImageScale() != 1.)
    {
    sizeImage.cx = (int) (.8 * afxGlobalData.GetRibbonImageScale() * sizeImage.cx);
    sizeImage.cy = (int) (.8 * afxGlobalData.GetRibbonImageScale() * sizeImage.cy);
    } rectImage.left += (rectImage.Width () - sizeImage.cx) / 2;
    rectImage.top  += (rectImage.Height () - sizeImage.cy) / 2; rectImage.OffsetRect(CMFCVisualManager::GetInstance ()->GetRibbonMainImageOffset());
    }
    else if (m_bIsLargeImage && !m_bTextAlwaysOnRight)
    {
    rectImage.left = rectImage.CenterPoint().x - sizeImage.cx / 2;
    rectImage.top += m_szMargin.cy + 1; if (!bDrawText)
    {
    rectImage.top = rectImage.CenterPoint().y - sizeImage.cy / 2;
    }
    }
    else
    {
    rectImage.top = rectImage.CenterPoint().y - sizeImage.cy / 2;
    } rectImage.right = rectImage.left + sizeImage.cx;
    rectImage.bottom = rectImage.top + sizeImage.cy; if (m_bIsLargeImage && !m_bTextAlwaysOnRight && HasMenu() && m_bIsDefaultCommand)
    {
    m_rectMenu = m_rect;
    m_rectMenu.top = rectImage.bottom + 3; m_rectCommand = m_rect;
    m_rectCommand.bottom = m_rectMenu.top; m_bMenuOnBottom = TRUE;
    } COLORREF clrText = (COLORREF)-1; if (!IsApplicationButton())
    {
    clrText = OnFillBackground(pDC);
    } if (IsMenuMode() && IsChecked() && sizeImage != CSize(0, 0))
    {
    CMFCVisualManager::GetInstance()->OnDrawRibbonMenuCheckFrame(pDC, this, rectImage);
    } //------------
    // Draw image:
    //------------
    if (bDrawDefaultImage)
    {
    CMFCVisualManager::GetInstance()->OnDrawDefaultRibbonImage(pDC, rectImage, m_bIsDisabled, m_bIsPressed, m_bIsHighlighted);
    }
    else
    {
    BOOL bIsRibbonImageScale = afxGlobalData.IsRibbonImageScaleEnabled(); if (IsMenuMode() && !m_bIsLargeImage)
    {
    if (m_pParentMenu == NULL || !m_pParentMenu->IsMainPanel())
    {
    afxGlobalData.EnableRibbonImageScale(FALSE);
    }
    } DrawImage(pDC, imageType, rectImage);
    afxGlobalData.EnableRibbonImageScale(bIsRibbonImageScale);
    } //-----------
    // Draw text:
    //-----------
    if (bDrawText)
    {
    CFont* pOldFont = NULL; rectText = m_rect;
    UINT uiDTFlags = 0; COLORREF clrTextOld = (COLORREF)-1; if (bIsDisabled && (m_bIsDefaultCommand || (!m_bIsDefaultCommand && !(m_nID == 0 || m_nID == (UINT)-1))))
    {
    if (m_bQuickAccessMode)
    {
    clrText = CMFCVisualManager::GetInstance()->GetRibbonQuickAccessToolBarTextColor(TRUE);
    }
    else
    {
    clrTextOld = pDC->SetTextColor( clrText == (COLORREF)-1 ? CMFCVisualManager::GetInstance()->GetToolbarDisabledTextColor() : clrText);
    }
    }
    else if (clrText != (COLORREF)-1)
    {
    clrTextOld = pDC->SetTextColor(clrText);
    } if (m_bIsLargeImage && !m_bTextAlwaysOnRight)
    {
    DrawBottomText(pDC, FALSE);
    rectMenuArrow.SetRectEmpty();
    }
    else
    {
    rectText.left = rectImage.right; if (m_nImageOffset > 0)
    {
    rectText.left = m_rect.left + m_nImageOffset + 3 * m_szMargin.cx;
    }
    else if (sizeImage.cx != 0)
    {
    rectText.left += GetTextOffset();
    } uiDTFlags = DT_SINGLELINE | DT_END_ELLIPSIS; if (!m_bAlwaysShowDescription || m_strDescription.IsEmpty())
    {
    uiDTFlags |= DT_VCENTER;
    }
    else
    {
    pOldFont = pDC->SelectObject(&afxGlobalData.fontBold);
    ENSURE(pOldFont != NULL); rectText.top += max(0, (m_rect.Height() - m_sizeTextRight.cy) / 2);
    } int nTextHeight = DrawRibbonText(pDC, m_strText, rectText, uiDTFlags); if (pOldFont != NULL)
    {
    pDC->SelectObject(pOldFont);
    } if (m_bAlwaysShowDescription && !m_strDescription.IsEmpty())
    {
    rectText.top += nTextHeight + m_szMargin.cy;
    rectText.right = m_rect.right - m_szMargin.cx; pDC->DrawText(m_strDescription, rectText, DT_WORDBREAK | DT_END_ELLIPSIS);
    } if (nTextHeight == m_sizeTextRight.cy && m_bIsLargeImage && HasMenu())
    {
    rectMenuArrow = m_rect;
    rectMenuArrow.DeflateRect(m_nMenuArrowMargin, m_nMenuArrowMargin * 2);
    rectMenuArrow.right -= 2; int cyMenu = CMenuImages::Size().cy; rectMenuArrow.top = rectMenuArrow.bottom - cyMenu;
    rectMenuArrow.bottom = rectMenuArrow.top + CMenuImages::Size().cy;
    }
    } if (clrTextOld != (COLORREF)-1)
    {
    pDC->SetTextColor(clrTextOld);
    }
    } if (!IsApplicationButton())
    {
    if (!rectMenuArrow.IsRectEmpty())
    {
    CMenuImages::IMAGES_IDS id = CMenuImages::IdArrowDown; if (IsMenuMode())
    {
    BOOL bIsRTL = FALSE; CMFCRibbonBar* pTopLevelRibbon = GetTopLevelRibbonBar();
    if (pTopLevelRibbon->GetSafeHwnd() != NULL)
    {
    bIsRTL = (pTopLevelRibbon->GetExStyle() & WS_EX_LAYOUTRTL);
    } id = bIsRTL ? CMenuImages::IdArrowLeftLarge : CMenuImages::IdArrowRightLarge;
    } CRect rectWhite = rectMenuArrow;
    rectWhite.OffsetRect(0, 1); CMenuImages::Draw(pDC, id, rectWhite, CMenuImages::ImageWhite);
    CMenuImages::Draw(pDC, id, rectMenuArrow, m_bIsDisabled ? CMenuImages::ImageGray : CMenuImages::ImageBlack);
    } OnDrawBorder(pDC);
    } m_bIsDisabled = bIsDisabled;
    m_bIsDroppedDown = bIsDroppedDown;
    m_bIsHighlighted = bIsHighlighted;
    m_bIsMenuHighlighted = bMenuHighlighted;
    m_bIsCommandHighlighted = bCommandHighlighted;
    }需要楼主去修改这函数,实现自己的功能
      

  11.   

    cvbtvbwu的意思 是 我自己去写一个类A,让它继承CMFCRibbonButton,在A中实现OnDraw(CDC* pDC)函数。
    如果是这样,我也想过;但是,如何把它加载到Ribbon面板上去呢?
      

  12.   

    解决了吗, 按钮如何响应的
    我想 分模块单独开发ribbon界面
    分模块单独开发ribbon界面并可响应其界面按钮事件,如何办到
    A,模块中的m_wndRibbonBar 传入B工程中 ,由B工程中的类天加
    // 添加 第一个分组
    CMFCRibbonCategory* pCategoryHome = MFCRBar->AddCategory(lpCateName,IDB_BITMAP1 ,IDB_BITMAP1 , CSize(16, 16), CSize(32, 32), -1); // Load panel images:
    m_TestBImgs.SetImageSize(CSize(32,32));
    m_TestBImgs.Load(IDB_BITMAP1); CMFCRibbonPanel* pPanelTool = pCategoryHome->AddPanel(_T("常用工具"), m_TestBImgs.ExtractIcon(0)); CMFCRibbonButton* butn = new CMFCRibbonButton(ID_TESTEX_QUERY, _T("搜索1111"),-1,-1,false);//
    butn->EnableWindow(true);
        pPanelTool->Add(butn);
    事件响应也天加过, 可最终的按钮为灰色不可用, 不响应事件.