如何在Windows应用程序中启用通用控件
How to enable common controls in a Windows app
我正在尝试在应用程序中启用通用控件。我遵循此MSDN文章中给出的步骤,特别是仅使用标准扩展名的应用程序中使用COMCTL32.DLL版本6的部分。但是我无法正常工作。
我唯一与文章不同的事情是我在项目属性页面中添加了清单信息|配置属性|链接器|清单文件|其他清单依赖关系。这就是我在文本框中输入的内容:
" type ='win32'name ='microsoft.windows.common-controls'版本='6.0.0.0.0'processorrarchitecture ='*'*'publicKeyToken ='6595b64144ccf1df'6595b64144ccf1df'语言='//schemas.microsoft.com/developer/msbuild/2003'";%(额外manifestDepentencies)
当我检查生成的清单(myapp.exe.intermediate.manifest)时,它看起来正确。
我还向项目属性中的comctl32.lib添加了链接依赖关系|配置属性|链接器|输入|其他依赖关系。我还在启动时致电InitCommonControlsex结构,以此为初始化:
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_STANDARD_CLASSES;
但是呼叫initcommoncontrolsex始终返回false(这意味着失败)。经过一些调查,我发现从getlasterror返回的错误代码是error_file_not_found。有什么问题?
更新:我注意到可能与"未找到错误"有关的东西。当我从调试器运行应用程序时,输出窗口中的一条行是:
'myapp.exe':已加载'c: windows winds x86_microsoft.windows.common-controls_6595b64144ccf1df1df1df_5.82.82.6002.18305_none_none_none_8888f3a3a3a3a3A3A3A3A3A3A3A3A3AC2C2C2C436 co.
但是,对于某些更标准的库,例如kernel32.lib,user32.lib等,有很多类似的行:
:'myapp.exe':已加载'c: windows system32 ntdll.dll',无法找到或打开PDB文件
'myapp.exe':已加载'c: windows system32 kernel32.dll',无法找到或打开PDB文件
'myapp.exe':已加载'c: windows system32 msvcrt.dll',无法找到或打开PDB文件
'myapp.exe':已加载'c: windows system32 user32.dll',无法找到或打开PDB文件
这些行总是出现在任何应用程序中,并且不会引起任何问题。对于comctl32.dll是否有所不同?
好。我对此做了一些作业,发现了一些新事物。我最终如何工作是几乎您要做什么:
- 转到项目/properties/linker/清单文件/其他清单依赖关系
-
输入以下文本 verbatim (含义完全如下所示)。这一切都在一行,顺便说一句。
"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
-
保存您的设置做一个完整的项目(如果不是解决方案)重建以强制表现和PCH再生。
在执行此操作之前,以下是我的负载列表:
加载 'c: windows winsxs x86_microsoft.windows.common-controls_6595b641444ccf1df_ 5.82.7601.17514 _none_ec83dffa5ffa.859149af comctl32.
在手用力后,通用控件的清单版本现在包括此(并正确回答InitCommonControlsEx()
,这首先是所有这些的重点):
加载 'c: windows winsxs x86_microsoft.windows.common-controls_6595b6414144ccf1df_ 6.0.7601.17514 p>注意:您也可以使用源源#pragma进行此操作,理想情况下在您的stdafx.h标题中,但我更喜欢这种方式。
希望它有帮助。
不,关于PDB文件的警告只是在那里告诉您,您没有Windows System DLL的调试信息。从initializecommoncontrolsex()获得错误的返回当然是关键问题。
您使用的附加依赖依赖项存在问题。我修补了一段时间,但找不到缺点。通常更容易在源代码中指定链接器选项。当我使用时,一切都很好:
#include <CommCtrl.h>
#pragma comment(lib,"comctl32.lib")
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
只需将上述代码片段复制到您的一个源文件之一。
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在MFC中的静态文本控件上插入图标?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何在Qt C++中向自定义控件添加属性?
- C/C++ 检测双击 TVItem 的常用控件
- 从C++标头中导入常量而不是硬编码它们:扩展 .net 控件?
- 控件不会在选择函数旁边移动
- MFC:我们能否扩展CEditView中存在的CEdit控件类行为
- 通过嵌入式 IWebBrowser2 控件中的链接打开 youtube 搜索失败
- 查找素数:错误:控件到达非void函数的末尾
- C++ 获取"控件可能会到达约翰逊-特罗特代码上的非空函数的末尾
- C++WIN32-将RTF数据加载到Rich Edit控件
- 由非托管(C++)COM服务器实例化的托管(C#)控件在Windows更新后损坏
- 如何在Windows应用程序中启用通用控件