【问题标题】:Visual C++ How to override event handler of parant class?Visual C++ 如何覆盖父类的事件处理程序?
【发布时间】:2016-08-25 14:47:34
【问题描述】:

我需要重写 CMFCRibbonSlider 类的 wm_lbuttonup 事件

    class CMyRibbonSlider : public CMFCRibbonSlider
    {
     public:
       virtual void OnLButtonUp(CPoint point); // need this event handler!
    };

    void CMyRibbonSlider::OnLButtonUp(CPoint point)
    {
        AfxMessageBox(_T("Works!"))
        return;
    }

在 MainFrame 类中使用 CMyRibbonSlider 对象

    class CMainFrame : public CMDIFrameWndEx
    {
    ....
    CMyRibbonSlider*  SliderLine;
    }

当 CMFCRibbonSlider 控件出现并且我单击鼠标左键时,没有任何反应。我做错了什么?

编辑:

初始化

CArray<CMFCRibbonBaseElement*, CMFCRibbonBaseElement*> ar;
m_wndRibbonBar.GetElementsByID(ID_SLIDER2, RibbonElementsArray);

m_wndRibbonBar.GetElementsByID(ID_START_BTN, ar);
RibbonElementsArray.Append(ar);

m_wndRibbonBar.GetElementsByID(ID_STOP_BTN, ar);
RibbonElementsArray.Append(ar);

m_wndRibbonBar.GetElementsByID(ID_SLIDER_LINE, ar); //HERE!
RibbonElementsArray.Append(ar);

m_wndRibbonBar.GetElementsByID(IDC_STATIC_TT, ar);
RibbonElementsArray.Append(ar);

Slider = DYNAMIC_DOWNCAST(CMFCRibbonSlider, RibbonElementsArray[0]);
btnStart = DYNAMIC_DOWNCAST(CMFCRibbonButton, RibbonElementsArray[1]);
btnStop = DYNAMIC_DOWNCAST(CMFCRibbonButton, RibbonElementsArray[2]);
SliderLine = (CMyRibbonSlider*)DYNAMIC_DOWNCAST(CMFCRibbonSlider, RibbonElementsArray[3]); //and HERE!
TmpLable = DYNAMIC_DOWNCAST(CMFCRibbonLabel, RibbonElementsArray[4]);

我在 Mainframe 类中也有这些事件处理程序,它们可以工作:

ON_UPDATE_COMMAND_UI(ID_SLIDER_LINE, &CMainFrame::OnUpdateSliderLine)
ON_COMMAND(ID_SLIDER_LINE, &CMainFrame::OnSliderLine)

SliderLine->GetPos() 也返回正确的滑块位置,所以我认为初始化是对的...

【问题讨论】:

  • CMyRibbonSlider* SliderLine; - 仅此而已?只有指针?
  • 代码需要更多上下文。由于您说出现了CMyRibbonSlider 控件,因此您不能只拥有指向它的指针。它还需要在某个时候构建。该代码很重要,您的 message map 也很重要。
  • 当然它不仅仅是一个指针。我添加了一些代码。

标签: c++ mfc overriding eventhandler ribbon-control


【解决方案1】:

似乎 CMFCRibbonSlider 控件未正确添加到 CMFCRibbonPanel,因此 CMainFrame 类不通过消息映射公开滑块的消息。 尝试使用以下文章中描述的方法: Walkthrough: Creating a New Ribbon Application By Using MFC

代码如下所示。

MyRibbonSlider.h

#include "afxribbonslider.h"
#pragma once

class CMyRibbonSlider : public CMFCRibbonSlider
{
    DECLARE_DYNCREATE(CMyRibbonSlider)
public:
    CMyRibbonSlider();
    CMyRibbonSlider(UINT nID, int nWidth = 100);

// Implementation
public:
    virtual ~CMyRibbonSlider();
    virtual void OnLButtonUp(CPoint point); 
};

MyRibbonSlider.cpp

#include "stdafx.h"
#include "MyRibbonSlider.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

IMPLEMENT_DYNCREATE(CMyRibbonSlider, CMFCRibbonSlider)

CMyRibbonSlider::CMyRibbonSlider()
{
}

CMyRibbonSlider::CMyRibbonSlider(UINT nID, int nWidth)
    : CMFCRibbonSlider(nID, nWidth)
{   
}

CMyRibbonSlider::~CMyRibbonSlider()
{
}

void CMyRibbonSlider::OnLButtonUp(CPoint point)
{
    TRACE("\nCMyRibbonSlider::OnLButtonUp()");
    return;
}

CMainFrame.h

中的相关声明
afx_msg void OnSliderLine();
afx_msg void OnUpdateSliderLine(CCmdUI* pCmdUI);

CMainFrame.cpp

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
    ...
    ON_COMMAND(ID_SLIDER, &CMainFrame::OnSliderLine)
    ON_UPDATE_COMMAND_UI(ID_SLIDER, &CMainFrame::OnUpdateSliderLine)
END_MESSAGE_MAP()

void CMainFrame::InitializeRibbon()
{
    ...
    bNameValid = strTemp.LoadString(*your title*);
    ASSERT(bNameValid);
    CMFCRibbonPanel* pPanelAdvanced = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon (*your icon*));    
    strTemp = _T("Slider"); 
    CMyRibbonSlider* pRibbonSlider = new CMyRibbonSlider(ID_SLIDER);
    pPanelAdvanced->Add(pRibbonSlider);
    ...
}

void CMainFrame::OnSliderLine()
{
    // TODO
}

void CMainFrame::OnUpdateSliderLine(CCmdUI* pCmdUI)
{
    // TODO
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多