如何从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(其实这里可选的类非常少)不知道是为什么???

怎么办????
...全文
481 点赞 收藏 17
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
怎么写?能给点例子吗?
回复
自己用手写啊,一样的
回复
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
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告