当面板折叠时,按钮的矩形不再起作用

时间:2014-09-09 18:18:26

标签: mfc ribbon

我已经在几个方面尝试过这个。从CBCGPRibbonButton派生一个对象(与CMFCRibbonButton相同)并在类中使用GetRect(),并且单击事件找到功能区中的按钮并获取矩形。

矩形是相对于它所在的窗口。但如果面板折叠,那么它所在的窗口不是色带条,因此它的位置错误。

我需要一种获取相对于功能区栏的位置的方法。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

好的,所以我试图弄清楚按钮的矩形是什么:

enter image description here

当面板崩溃时:

enter image description here

这是我的解决方案:

class CMyButton : public CBCGPRibbonButton
{
    DECLARE_DYNCREATE(CHeaderFooter)

public:
    CMyButton()
    {
    };

    CMyButton(
        UINT    nID,
        LPCTSTR lpszText,
        int     nSmallImageIndex = -1,
        int     nLargeImageIndex = -1,
        BOOL    bAlwaysShowDescription = FALSE)
        : CBCGPRibbonButton(nID, lpszText, nSmallImageIndex, nLargeImageIndex, bAlwaysShowDescription)
    {
    }

    BOOL HasMenu() const override
    {
        return true;
    }

    CWnd* GetButtonWnd() const
    {
        CBCGPBaseRibbonElement* pDroppedDown = m_pParent->GetDroppedDown();
        CWnd* pWnd;
        if (pDroppedDown)  // Was popup opened from a collapsed panel from the ribbon?
        {
            pWnd = pDroppedDown->GetPopupMenu()->GetMenuBar();
        }
        else
        {
            pWnd = m_pParent->GetParentRibbonBar();
        }
        return pWnd;
    }

    void OnShowPopupMenu() override
    {
        CRect rect = GetRect();
        // pt is the bottom left corner of button relative to the window that
        // it is contained in.
        CPoint pt(rect.left, rect.bottom);
        GetButtonWnd()->ClientToScreen(&pt); // convert pt to screen coordinates

        ... // do other stuff with that point
    }
};

IMPLEMENT_DYNCREATE(CHeaderFooter, CBCGPRibbonButton)

确定按钮所属的CWnd,以便可以将rect正确转换为屏幕坐标。

答案 1 :(得分:0)

以屏幕坐标计算。 从功能区获取按钮矩形。使用ClientToScreen,您的屏幕坐标现在使用您的按钮父句柄与ScreenToClient,并且您有相对于功能区栏的线。

PS:即使我不知道为什么在功能区折叠时显示按钮。