2016-08-25 39 views
0

我需要重写CMFCRibbonSlider类的事件WM_LBUTTONUPVisual C++如何重写parant类的事件处理程序?

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

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

使用CMyRibbonSlider对象大型机类

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

当CMFCRibbonSlider控制apears和我点击左侧mousebutton,什么都不会发生。我做错了什么?

编辑:

初始化

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]); 

也是我在大型机级别的这些事件处理程序和他们的工作:

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

SliderLine-> GETPOS()也返回右边的滑块所以我觉得初始化是正确的...

+0

'CMyRibbonSlider * SliderLine;' - 这一切?只有指针? – mvidelgauz

+0

代码需要更多的上下文。既然你说'CMyRibbonSlider'控件出现了,你不能只有一个指向它的指针。它也需要在某个时候建造。该代码非常重要,因为您的[消息映射](https://msdn.microsoft.com/en-us/library/0x0cx6b1.aspx)。 – IInspectable

+0

Ofcourse它不仅是一个指针。我添加了一些代码。 –

回答

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 
}