今天在写一个关于响应WM_MOUSEWHEEL(鼠标滚轮)消息的程序中 , 用vc++6.0编译器编译时 , 却发现编译没通过 , 提示如下:
error C2065: 'WM_MOUSEWHEEL' : undeclared identifier
error C2051: case expression not constant
从英文表面意思上可以知道 , WM_MOUSEWHEEL这个没有定义 , 不可识别
但是仔细一看 , WM_MOUSEWHEEL也没有输入错误啊???
那到底是什么原因呢?
下面我讲两个我了解到的解决方案:
(1)
……
我先看了一会儿MSDN (API) , 没发觉什么异常
……
我再看了一下头文件(windows.h):
当然不是从头到尾看windows.h , 而是在VC++6.0中选中WM_MOUSEWHEEL ,
然后右键 , 选择"Go To Definition Of WM_MOUSEWHEEL"
然后看到如下声明:
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL 0x020A
#define WM_MOUSELAST 0x020A
#else
#define WM_MOUSELAST 0x0209
#endif /* if (_WIN32_WINNT < 0x0400) */
从上面不难发现WM_MOUSEWHEEL的定义是有先决条件的 , 那就是
_WIN32_WINNT和_WIN32_WINDOWS二者之一大于ox0400
而vc++默认值情况下 , 这两个都是没有定义的 , 于是这段代码实际上是没有执行的
看到这儿 , 可能你就知道要怎么做了吧?
对 , 我们必须在添加windows.h头文件之前 , 先修改
_WIN32_WINNT或_WIN32_WINDOWS的值 , 以使它们的值大于ox0400
这样WM_MOUSEWHEEL就有了定义 , 编译也就通过了
具体如下:
#define _WIN32_WINNT 0x0401//只要比ox0400大就行 , 但是必须在头文件之前 #include<windows.h> //...... //书写代码 //......
(2)
如果你觉得这样会比较麻烦 , 那么你可以升级你的编译器 , 使用vs2008或者更高版本 ,
因为更高版本对于_WIN32_WINNT是有定义的 , 而且是ox0600 , 比ox0400大 ,
那么那段头文件代码也就执行了
WM_MOUSEWHEEL也就有了定义 , 我们也可以使用这个消息