2016-08-25 2 views
0

Ich brauche Ereignis WM_LBUTTONUP von CMFCRibbonSlider KlasseVisual C++ Wie Überschreiben Ereignishandler der Parant-Klasse?

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

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

Verwenden CMyRibbonSlider Objekt in Mainframe-Klasse

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

Wenn CMFCRibbonSlider Kontrolle apears und ich Maustaste klicken Sie links außer Kraft zu setzen, passiert nichts. Was mache ich falsch?

EDIT:

Initialisierung

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

auch habe ich diese Event-Handler in Mainframe-Klasse und sie arbeiten:

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

SliderLine-> GetPos() auch mit der rechten Schieber zurück Position, so denke ich, Initialisierung ist richtig ...

+0

'CMyRibbonSlider * SliderLine;' - das ist alles? Nur Zeiger? – mvidelgauz

+0

Der Code benötigt ein wenig mehr Kontext. Da Sie sagen, dass das 'CMyRibbonSlider'-Steuerelement angezeigt wird, können Sie nicht einfach einen Zeiger darauf haben. Es muss auch irgendwann konstruiert werden. Dieser Code ist wichtig, ebenso wie Ihre [Nachrichtenzuordnung] (https://msdn.microsoft.com/en-us/library/0x0cx6b1.aspx). – IInspectable

+0

Natürlich ist es nicht nur ein Zeiger. Ich habe etwas Code hinzugefügt. –

Antwort

1

Es wird scheinen, wie die CMFCRibbonSlider Kontrolle ist nicht richtig an CMFCRibbonPanel und deshalb CMainFrame Klasse nicht aussetzen Schieber Botschaften durch Mitteilung Karte hinzugefügt. Versuchen Sie, eine in dem folgenden Artikel beschriebene Methode zu verwenden: Walkthrough: Creating a New Ribbon Application By Using MFC

Der Code wird wie folgt aussehen.

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; 
} 

ähnliche Erklärungen im 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 
}