2016-08-25 43 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 
}