如何从CMenu继承一个MFC类??Insert -> New Class, 基类中没有CMenu!

uoyevoli 2004-04-05 11:01:52
我想从CMenu继承一个MFC类,之所以不用Generic Class 是因为我想使用Class Wizard,主要是想使用Message Reflection来把WM_DRAWITEM等消息放到这个类中进行处理,不想放在父窗口中处理。

但是Insert -> New Class,基类中没有CMenu(其实这里可选的类非常少)不知道是为什么???

怎么办????
...全文
526 17 打赏 收藏 举报
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
pomelowu 2004-04-08
  • 打赏
  • 举报
回复
恐怕不行,没有messageMap成员,宏BEGIN_MESSAGE_MAP(class,baseclass)都不能使用,如何进行消息反射?或者也有高手知道如何解决,一起学习了。
uoyevoli 2004-04-08
  • 打赏
  • 举报
回复
在国外论坛的到的答案也是message reflection只能用于CWnd的继承类。

晕,看来我只能放弃了。
uoyevoli 2004-04-07
  • 打赏
  • 举报
回复
能手工添加吗?
主要是Message Reflection!即消息反射!就是把WM_DRAWITEM WM_MEASUREITEM消息放到该类内部处理。
uoyevoli 2004-04-06
  • 打赏
  • 举报
回复
怎么写?能给点例子吗?
薛定谔之死猫 2004-04-06
  • 打赏
  • 举报
回复
自己用手写啊,一样的
xuyun11141 2004-04-06
  • 打赏
  • 举报
回复
先从一个类里派生后,然后在在.H和.CPP将基类改在CMenu就行了
pomelowu 2004-04-06
  • 打赏
  • 举报
回复
在头文件类申明的最后加上
DECLARE_DYNAMIC(CMyClass)
在实现类的cpp文件的预编译后加上
IMPLEMENT_DYNAMIC(CMyClass, CMenu)
garygao 2004-04-06
  • 打赏
  • 举报
回复
象 bjyst2008(追风) 说的,常见新类时选择generic class,然后在derived from内填上CMenu就行
bjyst2008 2004-04-06
  • 打赏
  • 举报
回复
你在创建新类是不要选择mfc class 而是选择generic class
pomelowu 2004-04-06
  • 打赏
  • 举报
回复
原因在于 DECLARE_MESSAGE_MAP()
CMenu类并没有messageMap成员,也就是说,就算你改写了这个类,也没有办法通过class wizard给你的类添加消息映射和消息响应
uoyevoli 2004-04-06
  • 打赏
  • 举报
回复
顶啊,再线等!!
uoyevoli 2004-04-06
  • 打赏
  • 举报
回复
可能我的帖子没有说清楚,我之所以不选Generic Class是因为我想利用Class Wizard来添加CMyClass的Message Reflection来在该类内部处理WM_DRAWITEM WM_MEASUREITEM消息而不是把该消息发给父窗口处理。便于该类移植到其他工程中。而Generic Class是无法使用Class Wizard的,我自己有不会手工添加Message Reflection代码。

说白了,我就是想实现 “自画菜单” 而我从Codeproject下载的源码都是在菜单的父窗口中处理那两个消息的,不便于移植,我想用Messag Reflection来改造它。

我看MSDN TN062: Message Reflection for Windows Controls
里面的例子是通过Classs Wizard来添加 =WM_CTLCOLOR 反射消息的。没有提到如何手工添加。
uoyevoli 2004-04-05
  • 打赏
  • 举报
回复
帮忙啊!!应该是个简单问题吧??
在线等啊!!
uoyevoli 2004-04-05
  • 打赏
  • 举报
回复
是啊,我在书上看的也是这么说的,但我觉得这个办法只对从CWnd继承的类有用。
因为我从CStatic(其他什么都一样的)继承,然后手工改动CStatic为CMenu,但编译出错!!

error C2039: 'messageMap' : is not a member of 'CMenu'

我的源文件如下:(手工改动后的)
#if !defined(AFX_MYCLASS_H__E145A8E1_874D_11D8_8D5E_E44DA39E591C__INCLUDED_)
.....
// MyClass.h : header file
/////////////////////////////////////////////////////////////////////////////
// CMyClass window
class CMyClass : public CMenu
{
// Construction
public:
CMyClass();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyClass)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMyClass();
// Generated message map functions
protected:
//{{AFX_MSG(CMyClass)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYCLASS_H__E145A8E1_874D_11D8_8D5E_E44DA39E591C__INCLUDED_)

**************************************
// MyClass.cpp : implementation file
//
#include "stdafx.h"
.......
/////////////////////////////////////////////////////////////////////////////
// CMyClass
CMyClass::CMyClass()
{
}
CMyClass::~CMyClass()
{
}
BEGIN_MESSAGE_MAP(CMyClass, CMenu)
//{{AFX_MSG_MAP(CMyClass)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyClass message handlers
itmaster 2004-04-05
  • 打赏
  • 举报
回复
先继承一个类
然后手工改写
dawndu 2004-04-05
  • 打赏
  • 举报
回复
先写一个其他类,然后替换它
bm1408 2004-04-05
  • 打赏
  • 举报
回复
的确是没有这个类!

只能通过动态的创建!
发帖
VC/MFC

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2004-04-05 11:01
社区公告

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