谁能用最通俗话解决这个问题之二(第一个答完的得满分)

greensoft 2001-03-30 10:40:00
谁能给我细致的讲一讲消息映射?
BEGIN_MESSAGE_MAP()
END_MESSAGE_MAP()




谢谢!第一个答完并且最详细的得满分(老规矩)
...全文
383 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzhljylg 2001-04-01
  • 打赏
  • 举报
回复
呵呵,温书
111222 2001-03-31
  • 打赏
  • 举报
回复
管他什么意思!用就是了!
holyfire 2001-03-31
  • 打赏
  • 举报
回复
于是,DECLARE_MESSAGE_MAP 就相当于宣告了这样一个数据结构:
_messageEntries[]
messageMap
pBaseMessageMap
lpEntries nMessage, nCode, nID, nLastID, nSig, pfn
这个数据结构的内容填塞工作由三个宏完成:
#define BEGIN_MESSAGE_MAP(theClass, baseClass) AFX_MSGMAP* theClass::GetMessageMap() const { return &theClass::messageMap; } AFX_MSGMAP theClass::messageMap = { &(baseClass::messageMap), (AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; AFX_MSGMAP_ENTRY theClass::_messageEntries[] = {
#define ON_COMMAND(id, memberFxn) { WM_COMMAND, 0, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memberFxn },
#define END_MESSAGE_MAP() { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } };
其中的 AfxSig_end 定义为:
enum AfxSig
{
AfxSig_end = 0, // [marks end of message map]
AfxSig_vv, 
};

从深入浅出MFC中抄了几句话来骗分了
不过我觉得还是原文讲的比较好
忠于原著
7zkeeper 2001-03-31
  • 打赏
  • 举报
回复
利用几个简单的宏建立的一个消息映射表。
holyfire 2001-03-31
  • 打赏
  • 举报
回复
//----------------------------------------------------------------------
这幺一来,WndProc 和 OnCommand 永远不必改变,每有新要处理的消息,只要在
_messageEntries[ ] 和 _commandEntries[ ] 两个数组中加上新元素,并针对新消息撰写新
的处理例程即可。

首先定义一个数据结构:
struct AFX_MSGMAP
AFX_MSGMAP* pBaseMessageMap;
AFX_MSGMAP_ENTRY* lpEntries;
其中的 AFX_MSGMAP_ENTRY 又是另一个数据结构:
struct AFX_MSGMAP_ENTRY // MFC 4.0 format
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
其中的 AFX_PMSG 定义为函式指针:
typedef void (CCmdTarget::*AFX_PMSG)(void);
然后我们定义一个宏:
#define DECLARE_MESSAGE_MAP() static AFX_MSGMAP_ENTRY _messageEntries[]; static AFX_MSGMAP messageMap; virtual AFX_MSGMAP* GetMessageMap() const;

holyfire 2001-03-31
  • 打赏
  • 举报
回复
首先,定义一个 MSGMAP_ENTRY 结构和一个 dim 宏:
struct MSGMAP_ENTRY {
UINT nMessage;
LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);
#define dim(x) (sizeof(x) / sizeof(x[0]))
请注意 MSGMAP_ENTRY 的第二元素 pfn 是一个函式指针,我准备以此指针所指之函
nMessage 消息。这正是对象导向观念中把「资料」和「处理资料的方法」封装
起来的一种具体实现,只不过我们用的不是 C++ 语言。
接下来,组织两个数组 _messageEntries[ ] 和 _commandEntries[ ],把程序中欲处理的讯
息以及消息处理例程的关联性建立起来:
// 消息与处理例程之对照表格
struct MSGMAP_ENTRY _messageEntries[] =
{
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND, OnCommand,
WM_SETFOCUS, OnSetFocus,
WM_CLOSE, OnClose,
WM_DESTROY, OnDestroy,
} ;
// Command-ID 与处理例程之对照表格
struct MSGMAP_ENTRY _commandEntries =
{
IDM_ABOUT, OnAbout,
IDM_FILEOPEN, OnFileOpen,
IDM_SAVEAS, OnSaveAs,
} ; ↑↑
这是WM_COMMAND 命令项 这是命令处理例程
于是窗口函式可以这幺设计:
//----------------------------------------------------------------------
// 窗口函式
//----------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for(i=0; i < dim(_messageEntries); i++) { // 消息对照表
if (message == _messageEntries[i].nMessage)
return((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
}
//----------------------------------------------------------------------
// OnCommand -- 专门处理 WM_COMMAND
//----------------------------------------------------------------------
LONG OnCommand(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for(i=0; i < dim(_commandEntries); i++) { // 命令项目对照表
if (LOWORD(wParam) == _commandEntries[i].nMessage)
return((*_commandEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
}
//----------------------------------------------------------------------
LONG OnCreate(HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}.
//----------------------------------------------------------------------
LONG OnAbout(HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}
//----------------------------------------------------------------------
这幺一来,WndProc 和 OnCommand 永远不必改变,每有新要处理的消息,只要在
_messageEntries[ ] 和 _commandEntries[ ] 两个数组中加上新元素,并针对新消息撰写新
的处理例程即可。

首先定义一个数据结构:
struct AFX_MSGMAP
AFX_MSGMAP* pBaseMessageMap;
AFX_MSGMAP_ENTRY* lpEntries;
其中的 AFX_MSGMAP_ENTRY 又是另一个数据结构:
struct AFX_MSGMAP_ENTRY // MFC 4.0 format
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
其中的 AFX_PMSG 定义为函式指针:
typedef void (CCmdTarget::*AFX_PMSG)(void);
然后我们定义一个宏:
#define DECLARE_MESSAGE_MAP() static AFX_MSGMAP_ENTRY _messageEntries[]; static AFX_MSGMAP messageMap; virtual AFX_MSGMAP* GetMessageMap() const;

于是,DECLARE_MESSAGE_MAP 就相当于宣告了这样一个数据结构:
_messageEntries[]
messageMap
pBaseMessageMap
lpEntries nMessage, nCode, nID, nLastID, nSig, pfn
这个数据结构的内容填塞工作由三个宏完成:
#define BEGIN_MESSAGE_MAP(theClass, baseClass) AFX_MSGMAP* theClass::GetMessageMap() const { return &theClass::messageMap; } AFX_MSGMAP theClass::messageMap = { &(baseClass::messageMap), (AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; AFX_MSGMAP_ENTRY theClass::_messageEntries[] = {
#define ON_COMMAND(id, memberFxn) { WM_COMMAND, 0, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memberFxn },
#define END_MESSAGE_MAP() { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } };
其中的 AfxSig_end 定义为:
enum AfxSig
{
AfxSig_end = 0, // [marks end of message map]
AfxSig_vv, 
};

从深入浅出MFC中抄了几句话来骗分了
不过我觉得还是原文讲的比较好
忠于原著
holyfire 2001-03-31
  • 打赏
  • 举报
回复
首先,定义一个 MSGMAP_ENTRY 结构和一个 dim 宏:
struct MSGMAP_ENTRY {
UINT nMessage;
LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);
#define dim(x) (sizeof(x) / sizeof(x[0]))
请注意 MSGMAP_ENTRY 的第二元素 pfn 是一个函式指针,我准备以此指针所指之函
nMessage 消息。这正是对象导向观念中把「资料」和「处理资料的方法」封装
起来的一种具体实现,只不过我们用的不是 C++ 语言。
接下来,组织两个数组 _messageEntries[ ] 和 _commandEntries[ ],把程序中欲处理的讯
息以及消息处理例程的关联性建立起来:
// 消息与处理例程之对照表格
struct MSGMAP_ENTRY _messageEntries[] =
{
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND, OnCommand,
WM_SETFOCUS, OnSetFocus,
WM_CLOSE, OnClose,
WM_DESTROY, OnDestroy,
} ;
// Command-ID 与处理例程之对照表格
struct MSGMAP_ENTRY _commandEntries =
{
IDM_ABOUT, OnAbout,
IDM_FILEOPEN, OnFileOpen,
IDM_SAVEAS, OnSaveAs,
} ; ↑↑
这是WM_COMMAND 命令项 这是命令处理例程
于是窗口函式可以这幺设计:
//----------------------------------------------------------------------
// 窗口函式
//----------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for(i=0; i < dim(_messageEntries); i++) { // 消息对照表
if (message == _messageEntries[i].nMessage)
return((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
}
//----------------------------------------------------------------------
// OnCommand -- 专门处理 WM_COMMAND
//----------------------------------------------------------------------
LONG OnCommand(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for(i=0; i < dim(_commandEntries); i++) { // 命令项目对照表
if (LOWORD(wParam) == _commandEntries[i].nMessage)
return((*_commandEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
}
//----------------------------------------------------------------------
LONG OnCreate(HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}.
//----------------------------------------------------------------------
LONG OnAbout(HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}
//----------------------------------------------------------------------
这幺一来,WndProc 和 OnCommand 永远不必改变,每有新要处理的消息,只要在
_messageEntries[ ] 和 _commandEntries[ ] 两个数组中加上新元素,并针对新消息撰写新
的处理例程即可。

首先定义一个数据结构:
struct AFX_MSGMAP
AFX_MSGMAP* pBaseMessageMap;
AFX_MSGMAP_ENTRY* lpEntries;
其中的 AFX_MSGMAP_ENTRY 又是另一个数据结构:
struct AFX_MSGMAP_ENTRY // MFC 4.0 format
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
其中的 AFX_PMSG 定义为函式指针:
typedef void (CCmdTarget::*AFX_PMSG)(void);
然后我们定义一个宏:
#define DECLARE_MESSAGE_MAP() static AFX_MSGMAP_ENTRY _messageEntries[]; static AFX_MSGMAP messageMap; virtual AFX_MSGMAP* GetMessageMap() const;

于是,DECLARE_MESSAGE_MAP 就相当于宣告了这样一个数据结构:
_messageEntries[]
messageMap
pBaseMessageMap
lpEntries nMessage, nCode, nID, nLastID, nSig, pfn
这个数据结构的内容填塞工作由三个宏完成:
#define BEGIN_MESSAGE_MAP(theClass, baseClass) AFX_MSGMAP* theClass::GetMessageMap() const { return &theClass::messageMap; } AFX_MSGMAP theClass::messageMap = { &(baseClass::messageMap), (AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; AFX_MSGMAP_ENTRY theClass::_messageEntries[] = {
#define ON_COMMAND(id, memberFxn) { WM_COMMAND, 0, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memberFxn },
#define END_MESSAGE_MAP() { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } };
其中的 AfxSig_end 定义为:
enum AfxSig
{
AfxSig_end = 0, // [marks end of message map]
AfxSig_vv, 
};

从深入浅出MFC中抄了几句话来骗分了
不过我觉得还是原文讲的比较好
忠于原著
holyfire 2001-03-31
  • 打赏
  • 举报
回复
// Command-ID 与处理例程之对照表格
struct MSGMAP_ENTRY _commandEntries =
{
IDM_ABOUT, OnAbout,
IDM_FILEOPEN, OnFileOpen,
IDM_SAVEAS, OnSaveAs,
} ;
这是WM_COMMAND 命令项 这是命令处理例程
于是窗口函式可以这幺设计:
//----------------------------------------------------------------------
// 窗口函式
//----------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for(i=0; i < dim(_messageEntries); i++) { // 消息对照表
if (message == _messageEntries[i].nMessage)
return((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
}
//----------------------------------------------------------------------
// OnCommand -- 专门处理 WM_COMMAND
//----------------------------------------------------------------------
LONG OnCommand(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for(i=0; i < dim(_commandEntries); i++) { // 命令项目对照表
if (LOWORD(wParam) == _commandEntries[i].nMessage)
return((*_commandEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
}
//----------------------------------------------------------------------
LONG OnCreate(HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}.
//----------------------------------------------------------------------
LONG OnAbout(HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}
holyfire 2001-03-31
  • 打赏
  • 举报
回复
首先,定义一个 MSGMAP_ENTRY 结构和一个 dim 宏:
struct MSGMAP_ENTRY {
UINT nMessage;
LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);
#define dim(x) (sizeof(x) / sizeof(x[0]))
请注意 MSGMAP_ENTRY 的第二元素 pfn 是一个函式指针,我准备以此指针所指之函
nMessage 消息。这正是对象导向观念中把「资料」和「处理资料的方法」封装
起来的一种具体实现,只不过我们用的不是 C++ 语言。
接下来,组织两个数组 _messageEntries[ ] 和 _commandEntries[ ],把程序中欲处理的讯
息以及消息处理例程的关联性建立起来:
// 消息与处理例程之对照表格
struct MSGMAP_ENTRY _messageEntries[] =
{
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND, OnCommand,
WM_SETFOCUS, OnSetFocus,
WM_CLOSE, OnClose,
WM_DESTROY, OnDestroy,
} ;
holyfire 2001-03-31
  • 打赏
  • 举报
回复
look
micrack 2001-03-31
  • 打赏
  • 举报
回复
看<深入简出MFC>不就得,在这谁也没书上讲的明白,我怀疑您这样能不能继续学下去,哎
hyls 2001-03-31
  • 打赏
  • 举报
回复
自己研究吧。
vcbear 2001-03-31
  • 打赏
  • 举报
回复
打开你的vc安装目录,搜索包含“BEGIN_MESSAGE_MAP”或“END_MESSAGE_MAP”的文件,
打开看。
看不懂,就是基础不够。打完基础再说。
cowmax 2001-03-31
  • 打赏
  • 举报
回复
管他什么意思!用就是了!
greensoft 2001-03-31
  • 打赏
  • 举报
回复
这道题的分数可是127分啊
大家努力讲讲吧
joke100 2001-03-30
  • 打赏
  • 举报
回复
深入浅出MFC里讲的比较好...
要不你就去把这两个宏展开看源代码....好长啊.

hyqryq 2001-03-30
  • 打赏
  • 举报
回复
这个问题不是三言两语能讲明白的,建议
看看<<深入浅出MFC>>,上面对消息映射的作用
和剖析讲得很透彻!
greensoft 2001-03-30
  • 打赏
  • 举报
回复
关注
软件的核心功能:探测淘宝店铺宝贝是否被淘宝网隐形降权。 注意以下几个问题: 1、对于宝贝很多差不多上千宝贝的店铺 “降权宝贝”这个数据会出现问题,不用理会,这是淘宝的问题,淘宝的数据干扰! 2、不管什么情况下 隐形降权宝贝的数据是绝对正确的! 3、“隐形降权”这块出现负值,证明这个宝贝权重被降低了!正值的宝贝权重都没有问题,或者权重有加分! 4、隐形降权的宝贝,也就是负值的宝贝目前宝贝排名肯定不在最前面! 被隐形降权的宝贝,不可能排到最前面,隐形降权这个问题是比较恶心的,可以通俗的这样说降权宝贝是指被直接枪毙的(但是可以去申诉,有机会成功),隐形降权宝贝是犯罪嫌疑人,处于观察阶段(无法申诉),从某种意义上讲,隐形降权比降权更难受! 隐形降权一般和以下因素有关: 1、刷销量:有黑号参与(被淘宝判断有刷销量嫌疑,但是不完全确定,就关小黑屋); 2、转化率低; 3、支付宝使用率。 简单的说,就是这个宝贝权重被扣了很多分,要么想办法解决上面的因素,要么就是想办法给这个宝贝加分,有些宝贝隐形降权恢复了,基本是有干净的正常的自然流量注入和自然的成交了一段时间然后恢复了,也就是说被淘宝释放了,所以怎么办?刷的要么你能保证刷号干干净净那么继续,要么就停止刷;转化率这块自己内功继续做足,有把握能用干干净将号刷的,可以刷转化率出来;支付宝使用率这块很简单,不要经常改价和被退换货,这个自己把握。想给宝贝加分要么搞转化率,要么搞老客户回头率,基本就这样,不能保证每个隐形降权宝贝都会回来! 软件评分功能: 软件能根据查询店铺给予较合理的评分,评分数据参考店铺以及大淘宝整体20多项数据指标,满分为百分制,此数据可以体现店铺的整体经营成绩,如果低于60分以下则需要认真检查店铺的经营状况进行调整。声明:此数据为整体参考数据,由商易论坛提供,并非淘宝官方数据,仅作为第三方参考,请勿用于商业用途,请知晓!

16,472

社区成员

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

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

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