win32 API创建tooltip的版本不匹配问题解决方法
2010-08-08 10:26
579 查看
在visual studio 2005以上版本中使用API创建tootip,创建后发送TTM_ADDTOOL等消息会失败,原因是加载的commctrl dll版本不匹配,解决方法如下:
1 在stdafx.h文件中把 #define _WIN32_WINNT 0x0501 改为 #define _WIN32_WINNT 0x0500
2 在#include "commctrl.h" #pragma comment(lib, "comctl32.lib") 之前加上如下代码:
#if _WIN32_WINNT>0x0500
#if defined _M_IX86
#pragma comment(linker, "/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'/"")
#elif defined _M_IA64
#pragma comment(linker, "/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'/"")
#elif defined _M_X64
#pragma comment(linker, "/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'/"")
#else
#pragma comment(linker, "/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'/"")
#endif
#endif
3 在填充TOOLINFO结构时改变cbSize的大小,如下:
TOOLINFO ti;
memset(&ti, 0, sizeof(TOOLINFO));
#if _WIN32_WINNT>0x0500
ti.cbSize = sizeof(TOOLINFO)-sizeof(void*);
#else
ti.cbSize = sizeof(TOOLINFO);
#endif
原因是因为_WIN32_WINNT 大于0x0500的时候,TOOLINFO结构体多了一个LPARAM lParam的定义,导致sizeof(TOOLINFO)和旧版本不匹配。
推荐使用第3种方法,因为前两种方法修改了整个commctrl dll版本号,导致整个系统用到的都是会较低版本的commctrl dll
示例代码如下:
HWND hWindow = ::CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL, WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)0, NULL, NULL);
TOOLINFO ti;
memset(&ti, 0, sizeof(TOOLINFO));
#if _WIN32_WINNT>0x0500
ti.cbSize = sizeof(TOOLINFO)-sizeof(void*);
#else
ti.cbSize = sizeof(TOOLINFO);
#endif
。。。//其他数据填充
::SendMessage(hWindow, TTM_ADDTOOL, 0, &ti);
1 在stdafx.h文件中把 #define _WIN32_WINNT 0x0501 改为 #define _WIN32_WINNT 0x0500
2 在#include "commctrl.h" #pragma comment(lib, "comctl32.lib") 之前加上如下代码:
#if _WIN32_WINNT>0x0500
#if defined _M_IX86
#pragma comment(linker, "/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'/"")
#elif defined _M_IA64
#pragma comment(linker, "/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'/"")
#elif defined _M_X64
#pragma comment(linker, "/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'/"")
#else
#pragma comment(linker, "/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'/"")
#endif
#endif
3 在填充TOOLINFO结构时改变cbSize的大小,如下:
TOOLINFO ti;
memset(&ti, 0, sizeof(TOOLINFO));
#if _WIN32_WINNT>0x0500
ti.cbSize = sizeof(TOOLINFO)-sizeof(void*);
#else
ti.cbSize = sizeof(TOOLINFO);
#endif
原因是因为_WIN32_WINNT 大于0x0500的时候,TOOLINFO结构体多了一个LPARAM lParam的定义,导致sizeof(TOOLINFO)和旧版本不匹配。
推荐使用第3种方法,因为前两种方法修改了整个commctrl dll版本号,导致整个系统用到的都是会较低版本的commctrl dll
示例代码如下:
HWND hWindow = ::CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL, WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)0, NULL, NULL);
TOOLINFO ti;
memset(&ti, 0, sizeof(TOOLINFO));
#if _WIN32_WINNT>0x0500
ti.cbSize = sizeof(TOOLINFO)-sizeof(void*);
#else
ti.cbSize = sizeof(TOOLINFO);
#endif
。。。//其他数据填充
::SendMessage(hWindow, TTM_ADDTOOL, 0, &ti);
相关文章推荐
- 安装vmware tools时,kernel版本不匹配问题的解决方法
- 【转】silverlight中文英文版本不匹配问题解决方法
- 关于Win32 API(VC作为程序设计语言)的创建线程,解决互斥访问临界资源问题
- 解决iis版本问题,不能在VS2003中创建asp.net应用程序的方法
- 有关eclipse启动时提示JVM版本太低的问题及解决方法
- 老版本彻底解决Android 应用方法数不能超过65K的问题
- rhel6.4 简单创建自己的http web 界面服务遇到的问题和解决方法
- 改进动态设置query cache导致额外锁开销的问题分析及解决方法-mysql 5.5 以上版本
- javascript创建对象的方法和遇到问题的解决方法
- 【转】VS2005 无法创建或打开“智能设备”项目的一个问题的解决方法
- 解决cocos2d-X 2.0版本后创建的Android项目提示org.cocos2dx.lib.Cocos2dxActivity找不到问题
- Eclipse导出release版本的APK遇到的问题及解决方法
- iOS如何解决某些方法低版本不支持的问题
- 【转】解决Gradle报错找不到org.gradle.api.internal.project.ProjectInternal.getPluginManager()方法问题
- VS2005调用MS Speech API 5.1 sphelper.h出现的问题及解决方法
- GDAL C#版本 "安全透明方法"问题解决方案
- android studio创建项目编译出错问题的解决方法
- 2016/4/26 sublime text 2 版本 遇到的问题及解决方法
- 关于jdk版本问题导致的eclipse导入web项目出错解决方法
- 做ssl通道时遇到“请求被中止: 未能创建 SSL/TLS 安全通道”问题的解决方法