C ++ / Win32:XP视觉样式 - 没有控件出现?

时间:2010-05-30 11:03:25

标签: c++ winapi windows-xp button visual-styles

好的,所以我对C ++& Windows API,我只是在编写一个小应用程序。我希望我的应用程序能够在XP,Vista和Windows 7中使用视觉样式,所以我将这一行添加到我的代码顶部:

#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

它似乎在我的Windows 7机器和Vista机器上完美运行。但是当我在XP上尝试应用程序时,应用程序不会加载任何控件(例如按钮,标签等) - 甚至不会显示消息框。

此图片显示了一个小型测试应用程序,我刚刚将它们放在一起以演示我要解释的内容:http://img704.imageshack.us/img704/2250/myapp.png

在这个测试应用程序中,我没有使用任何特别奇特或复杂的代码。我实际上只是从MSDN Library(http://msdn.microsoft.com/en-us/library/ff381409.aspx)中获取了最基本的示例代码,并在WM_CREATE消息中添加了一个部分来创建一个按钮:

MyBtn = CreateWindow(L"Button", L"My Button", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 25, 25, 100, 30, hWnd, NULL, hInst, 0);

但我无法弄清楚发生了什么,以及为什么它不起作用。有什么想法吗?先谢谢你。

(顺便说一下,如果我从顶部移除清单部分,应用程序在XP中运行 - 显然没有视觉样式。我还应该提到该应用程序是在Windows 7机器上使用Visual C ++ 2010 Express构建的 - 如果这会有所不同吗?)

4 个答案:

答案 0 :(得分:1)

你是否致电InitCommonControlsEx?详情are here

答案 1 :(得分:1)

#pragma comment(linker,"/manifestdependency:\"type='win32'...

答案 2 :(得分:1)

升级到Win7和VC ++ 2010专业版后,我今天也遇到了这个问题。

我首先想到的可能是我的清单是腐败的,最糟糕的是这是我在VC ++ 2010中的第二个项目,第一个在Win7和XP上工作正常。

所以我得出的结论是,在我的程序开头包含InitCommonControls()修复了这个问题,为什么?

所以我在代码的顶部添加了这个:

#include <Commctrl.h>
#pragma comment (lib, "Comctl32.lib")

这在我的初始代码中:

InitCommonControls();

再加上我的搜索答案,VC + 2010现在控件列表中有SysLink控件,这就是我的第一个项目正常运行的原因。将其中一个添加到对话框中,只要添加代码来处理通知,就不需要Comctl32.lib和InitCommonControls或InitCommonControlsEx?只要嵌入了带有公共控件的清单,构建的程序就会在Win7和XP中运行!

答案 3 :(得分:0)

Hans Passant:

在可执行文件中包含“manifest”的想法是避免调用InitCommonControls

如果没有清单,操作系统会自动初始化最常用的comomn控件的使用。如果清单在可执行资源中找到 - 那么这些控件就被初始化了。

好吧,我不知道问题的确切原因,我只能猜测。

  • Windows XP(?)
  • 中可能不支持常用控件6.0版
  • 也许清单必须包含所有需要的控件,而不仅仅是版本。 Vista和Wnd7可以自动初始化指定版本的所有“常用”常用控件,而Windows XP可能不会