今天在工作中遇到一个问题,一个动态菜单,每个菜单的菜单项ID是我自己定义的,定义如下:
#define IDM_SEARCHRECORD0 222240 #define IDM_SEARCHRECORD1 222241 #define IDM_SEARCHRECORD2 222242 #define IDM_SEARCHRECORD3 222243 #define IDM_SEARCHRECORD4 222244 #define IDM_SEARCHRECORD5 222245 #define IDM_SEARCHRECORD6 222246 #define IDM_SEARCHRECORD7 222247 #define IDM_SEARCHRECORD8 222248 #define IDM_SEARCHRECORD9 222249
然后定义了一个ON_COMMAND_RANGE宏来对着十个菜单项进行消息响应:
ON_COMMAND_RANGE(IDM_SEARCHRECORD0,IDM_SEARCHRECORD9,OnRecentSearchClicked)
下面是消息响应函数OnRecentSearchClicked:
void OnRecentSearchClicked(UINT nID) { if(nID < IDM_SEARCHRECORD0 || nID > IDM_SEARCHRECORD9) { return; } else { ...... } }
可是奇怪的是,程序怎么都进不到else里面,控件的ID怎么都传不对。
后面上网找了很久才知道nID不能大于65535,不然会溢出,当然不对了。
引用原文描述:
“这个uID是在 id1,id2之间的,但是MFC提供的这个 id1,id2是有个范围的,最大为65535个,所以用户在创建动态菜单,BUTTON时,在资源文件中定义这些宏时请最好不要超过这些范围,如果硬是要超过65535,那麽在memberFxn(UINT uID)函数判断的时候 需要取余 uID%65535 处理。”