2014-09-09 3 views
1

Я пробовал это несколькими способами. Вывод объекта из CBCGPRibbonButton (так же, как CMFCRibbonButton) и использование GetRect() из класса, и с нажатием кнопки найти кнопку на ленте и получить прямоугольник.Когда панель рухнула, нажатие кнопки перестает работать

Что происходит, так это то, что ребро относительно окна, в котором оно находится. Но если панель рухнула, то окно, в котором она находится, не является ленточным стержнем, поэтому оно становится неправильным.

Мне нужен способ получить местоположение относительно ленты. Есть идеи?

ответ

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) 

w hich определяет CWnd, что кнопка является частью так, чтобы прямоугольник мог быть правильно преобразован в экранные координаты.

0

Рассчитать в экранных координатах. Получите прямоугольник кнопки с ленты. Используйте ClientToScreen, и теперь ваши координаты экрана используют родительский дескриптор кнопок с ScreenToClient, и у вас есть шнуры относительно ленты.

PS: Даже я не знаю, почему показывать кнопку, когда лента рухнула.

+0

Я уже знаю, чтобы рассчитать в экранных координатах. Мне нужно окно, чтобы сделать это. Не окно ленты, выпадающее меню. В любом случае, я все понял. Благодарю. – Adrian

+0

BTW, я не понимаю, что означает ваш PS. – Adrian

Смежные вопросы