2016-08-25 3 views
0

мне нужно переопределить событие WM_LBUTTONUP класса CMFCRibbonSliderVisual C++ Как переопределить обработчик событий класса-участника?

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

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

объект Использование CMyRibbonSlider в классе MainFrame

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

Когда управление CMFCRibbonSlider apears и я нажать левую кнопку мыши, ничего не происходит. Что я делаю неправильно?

EDIT:

инициализации

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

Конечно, это не только указатель. Я добавил код. –

ответ

1

Это похоже, как управления CMFCRibbonSlider не добавляется правильно CMFCRibbonPanel и поэтому CMainFrame класс не выставляет сообщения Slider через карту сообщений. Попробуйте использовать способ, описанный в следующей статье: 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 
} 
Смежные вопросы