我已经在几个方面尝试过这个。从CBCGPRibbonButton派生一个对象(与CMFCRibbonButton相同)并在类中使用GetRect(),并且单击事件找到功能区中的按钮并获取矩形。
矩形是相对于它所在的窗口。但如果面板折叠,那么它所在的窗口不是色带条,因此它的位置错误。
我需要一种获取相对于功能区栏的位置的方法。有什么想法吗?
答案 0 :(得分:1)
好的,所以我试图弄清楚按钮的矩形是什么:
当面板崩溃时:
这是我的解决方案:
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:即使我不知道为什么在功能区折叠时显示按钮。