两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法

top_along 2014-08-26 05:23:21
一个类实现了可悬浮侧靠的对话框,另一个类实现了有滑动条的对话框,然后我就想到了多重继承来实现一个可悬靠带滑动条的对话框。

class CDockableForm : virtual public CDialog
{
// 可侧靠
public:
CDockableForm(UINT nIDTemplate);

virtual BOOL Create(LPCTSTR lpszCaption, CWnd* pParentWnd, const RECT& rect, BOOL bHasGripper, UINT nID, DWORD dwStyle, DWORD dwTabbedStyle = AFX_CBRS_REGULAR_TABS, DWORD dwControlBarStyle = AFX_DEFAULT_DOCKING_PANE_STYLE, CCreateContext* pContext = NULL);

CDockablePane& GetDockablePane() { return m_wndPane; }

private:
CDockablePaneAsContainer m_wndPane;

};

class CScrollDialog : virtual public CDialog
{
// 可滑动
public:
CScrollDialog(UINT nIDTemplate);
virtual BOOL OnInitDialog();

private:
int m_nCurWidth;
int m_nScrollPos;
CRect m_rect;


public:
DECLARE_MESSAGE_MAP()
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

};


CScrollDialog::CScrollDialog(UINT nIDTemplate)
: CDialog(nIDTemplate)
{

}

BOOL CScrollDialog::OnInitDialog()
{
CDialog::OnInitDialog();
GetWindowRect(&m_rect);
m_nScrollPos = 0;
return true;
}

// 出问题了!
BEGIN_MESSAGE_MAP(CScrollDialog, CDialog)
ON_WM_SIZE()
ON_WM_HSCROLL()
END_MESSAGE_MAP()


void CScrollDialog::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
// 实现代码

}


void CScrollDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// 实现代码

CDialog::OnVScroll(nSBCode, nPos, pScrollBar);

}


问题如下:






class CControlDialog : public CDockableForm, private CScrollDialog
{
// 可停靠的带滑条对话框
DECLARE_DYNAMIC(CControlDialog)

public:
CControlDialog(CWnd* pParent = NULL); // 标准构造函数
virtual ~CControlDialog();

// 对话框数据
enum { IDD = IDD_CONTROL };



protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
private:
virtual BOOL OnInitDialog();

DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);



private:
// 一些变量
};

// 有问题!
BEGIN_MESSAGE_MAP(CControlDialog, CDockableForm)
ON_WM_SIZE()
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_CHECK_HAS_LEADER, &CControlDialog::OnBnClickedCheckHasLeader)
END_MESSAGE_MAP()


我倒是知道用CScrollDialog继承CDockableForm,再用CControlDialog继承CScrollDialog可以实现,但是我希望试试多重继承,求解答。
...全文
401 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2014-09-04
  • 打赏
  • 举报
回复
在对话框模板里 加 WS_VSCROLL 和WS_HSCROLL 再响应OnVScroll ....
top_along 2014-09-04
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
“另一个类实现了有滑动条的对话框” 对话框本身 有 滚动条 !
O_O不是吧?那怎么给它搞出来?
top_along 2014-09-04
  • 打赏
  • 举报
回复
引用 6 楼 VisualEleven 的回复:
把两个类的代码合并
代码合并?直接重新写而不且继承吗?那好复杂哦? 如果是继承的话,多重继承最直观嘛。 最简单的话就是一个类继承自对话框类并加入滑动条。
schlafenhamster 2014-09-01
  • 打赏
  • 举报
回复
“另一个类实现了有滑动条的对话框” 对话框本身 有 滚动条 !
Eleven 2014-08-30
  • 打赏
  • 举报
回复
把两个类的代码合并
schlafenhamster 2014-08-30
  • 打赏
  • 举报
回复
"可停靠的带滑条对话框" 应该是 对话框 + 停靠功能
向立天 2014-08-30
  • 打赏
  • 举报
回复
MFC内部机制很复杂 你这样搞多重继承恐怕不太合适 如果只是想联系多重继承可以自己设计类关系 如果就是想通过现有的东西实现功能建议通过你现有的类在新类中声明对象来实现 这样可以规避继承的问题
top_along 2014-08-26
  • 打赏
  • 举报
回复
找到了一个远古的贴子,总之就是多重继承情况下子类转向父类时候,消息印射会出现问题。 不过贴子中的消息印射有参数,所以可以改参数,我这个难道得跟进宏定义文件里改宏? http://bbs.csdn.net/topics/320065359
top_along 2014-08-26
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
"MFC类实现多重继承" 不能有公共基类.
额,我不是看书上用公共基类都只要把公共基类虚继承就好么了? 还是对MFC特有的不能有公共基类?
schlafenhamster 2014-08-26
  • 打赏
  • 举报
回复
"MFC类实现多重继承" 不能有公共基类.

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧