c++ - 使用基类对象调用派生类函数

标签 c++ mfc ribbon

我正在尝试绘制 CMFCRibbonTab ,其中文本的位置稍微有点高。

为了实现这一点,我创建了一个名为 DCRibbonTab 的派生类,它扩展了 CMFCRibbonTab 并重写了 virtual void OnDraw(CDC * pDC) 函数如下所示:

#pragma once
#include "StdAfx.h"

class DCRibbonTab : public CMFCRibbonTab
{
public:
    DCRibbonTab ();

    virtual ~DCRibbonTab ();
    virtual void OnDraw(CDC* pDC);
};

DCRibbonTab::~DCRibbonTab()
{
}

void DCRibbonTab::OnDraw(CDC * pDC)
{
    CMFCRibbonTab::OnDraw(pDC);
    ASSERT_VALID(this);
    ASSERT_VALID(m_pParent);
    ASSERT_VALID(m_pParent->GetParentRibbonBar());

    if (m_rect.IsRectEmpty())
    {
        return;
    }

    COLORREF clrText = CMFCVisualManager::GetInstance()->OnDrawRibbonCategoryTab(pDC, this, m_pParent->IsActive() || GetDroppedDown() != NULL);
    COLORREF clrTextOld = pDC->SetTextColor(clrText);

    CRect rectTab = m_rect;
    CRect rectTabText = m_rect;

    pDC->DrawText(L"test", rectTabText, DT_CALCRECT | DT_SINGLELINE | DT_VCENTER);

    const int cxTabText = rectTabText.Width();
    const int cxTabTextMargin = max(4, (rectTab.Width() - cxTabText) / 2);

    rectTab.DeflateRect(cxTabTextMargin, 0);
    //rectTab.top += nPanelMarginTop;

    pDC->DrawText(GetParentCategory()->GetName(), rectTab, DT_SINGLELINE | DT_VCENTER);
    pDC->SetTextColor(clrTextOld);
}

为了能够调用 DCRibbonTab 的新virtual void OnDraw(CDC * pDC),我必须覆盖 void OnPaint() CMFCRibbonBar 类的 > 如下所示:

void DCRibbonBar::OnPaint()
{
    CMFCRibbonBar::OnPaint();

    CPaintDC dc(this); // device context for painting

    int i = 0;

    CMemDC memDC(dc, this);
    CDC* pDC = &memDC.GetDC();

    for (i = 0; i < (int)m_arCategories.GetSize(); i++)
    {
        CMFCRibbonCategory* pCategory = m_arCategories[i];
        ASSERT_VALID(pCategory);

        if (pCategory->IsVisible())
        {
            CMFCRibbonTab * CurrentTab = pCategory->GetTab();

            //Need to Call DCRibbonTab OnDraw function using CMFCRibbonTab object CurrentTab

        }
    }
}

然而,我似乎无法实现的是使用基类对象调用派生类DCRibbonTab virtual void OnDraw(CDC * pDC)其中是 CMFCRibbonTab 对象。

那么,如何从基类对象CMFCRibbonTab 调用派生类函数DCRibbonTab

最佳答案

class DCRibbonTab : public CMFCRibbonTab
{
public:
    DCRibbonTab ();

    virtual ~DCRibbonTab ();
    void OnDraw(CDC* pDC) override;
};

如果您的 OnDraw() 方法版本实际上并未覆盖基类中定义的方法,则此版本应提供明确的错误消息。如果您看到该错误,您就知道您需要仔细检查您是否与基类中的函数签名完全匹配,当然还要确认该函数在基类中被声明为“虚拟”。

如果添加“override”后没有出现错误,那么调用正确的版本应该很简单:

CurrentTab->OnDraw(pDC);

关于c++ - 使用基类对象调用派生类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51501581/

相关文章:

c++ - 转换 Classname::FunctionName( Para1, Para2 ) 中的符号

c++ - 从继承的模板类中正确实现虚函数

c++ - 在回溯中格式化 GDB 模板参数

c++ - glBindTexture 不工作

c++ - 覆盖虚函数返回类型不同且不是协变的

c++ - 如何使 slider 控件的 slider 变宽? (使用 MFC)

c# - 使用字符串数组动态填充功能区设计组合框?

c# - 如何将按钮添加到功能区 (C#) 上预先存在的选项卡?

C++ - 设计问题