gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:05 25 4
gpt4 key购买 nike

我正在尝试绘制 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com