2016-08-25 4 views
0

J'ai besoin de passer outre l'événement WM_LBUTTONUP de CMFCRibbonSlider classeVisual C++ Comment remplacer le gestionnaire d'événements de la classe parant?

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

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

Utilisation d'objets CMyRibbonSlider en classe MainFrame

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

Lorsque le contrôle CMFCRibbonSlider apears et je clique gauche mousebutton, rien ne se passe. Qu'est-ce que je fais de mal?

EDIT:

initialisation

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

J'ai aussi ces gestionnaires d'événements en classe Mainframe et ils travaillent:

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

SliderLine-> getPos() retourne également curseur à droite position, donc je pense que l'initialisation est juste ...

+0

'CMyRibbonSlider * SliderLine;' - c'est tout? Seul pointeur? – mvidelgauz

+0

Le code a besoin d'un peu plus de contexte. Puisque vous dites que le contrôle 'CMyRibbonSlider' apparaît, vous ne pouvez pas avoir un pointeur dessus. Il doit également être construit à un moment donné. Ce code est important, tout comme votre [plan du message] (https://msdn.microsoft.com/fr-fr/library/0x0cx6b1.aspx). – IInspectable

+0

Bien sûr, ce n'est pas seulement un pointeur. J'ai ajouté du code. –

Répondre

1

Il est semble comme le CMFCRibbonSlider contrôle n'est pas ajouté correctement CMFCRibbonPanel et donc CMainFrame classe n'expose pas les messages du curseur par carte de message. Essayez d'utiliser une méthode décrite dans l'article suivant: Walkthrough: Creating a New Ribbon Application By Using MFC

Le code apparaîtra ci-dessous.

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

déclarations connexes dans le 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 
}