mfc — Visual C ++ Как переопределить обработчик событий класса parant?

Мне нужно переопределить событие wm_lbuttonup класса CMFCRibbonSlider

    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 и я нажимаю левую кнопку мыши, ничего не происходит. Что я делаю не так?

РЕДАКТИРОВАТЬ:

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

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

также у меня есть эти обработчики событий в классе Mainframe, и они работают:

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

SliderLine-> GetPos () также возвращает правую позицию ползунка, поэтому я думаю, что инициализация правильная …

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]