Win32 API:使用Aero效果创建按钮

3

我可以使用CreateWindow函数创建按钮,例如:

    CreateWindow(L"BUTTON", "Button label", WS_VISIBLE | WS_CHILD, 0, 0, 100, 25, parentWnd, ID, NULL, NULL);

它能够正常运行,但按钮没有光泽效果,字体没有抗锯齿。

我还编译了清单:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="Win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0"
                        processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
    </dependentAssembly>
  </dependency>
</assembly>

我不确定要使用哪个标记,因为我从某个网站获取了样本。然后,我创建了资源列表:

   CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "manifest.xml"

编译时使用的:

   i686-w64-mingw32-windres -i resources.txt -OCOFF resources.res

最后与resources.res链接,但没有任何结果。

当我创建清单并将其放在我的exe文件旁边时,一切都正常。但是当我尝试将清单编译到资源中时,没有任何效果。

如何解决?我更喜欢不使用任何库,特别是像Qt这样的大型库。


1
你不需要链接 .rc 文件,而是需要链接 .res 文件。 - David Heffernan
您是否想要在您的应用程序中使用新的Windows XP/Vista/7风格主题或Aero效果?如果是,那么您将需要创建应用程序清单并初始化常见控件。 - Asesh
当我创建清单并将其放置在我的exe文件旁边时,一切都正常。但是当我尝试将清单编译到资源中时,没有任何效果。 - bukkojot
你做错了。你没有提供完整的细节,所以我们无法告诉你哪里出了问题。 - David Heffernan
@bukkojot,你是否链接了comctl32并调用了InitCommonControls函数?请参考此页面:https://msdn.microsoft.com/zh-cn/library/windows/desktop/bb773175(v=vs.85).aspx - Asesh
1个回答

1

编辑:
确保CREATEPROCESS_MANIFEST_RESOURCE_ID被定义为1

或者将清单行替换为以下内容:

1 RT_MANIFEST "manifest.xml"

或者

1 24 "manifest.xml"

2
@bukkojot:这意味着您的开发环境没有定义“CREATEPROCESS_MANIFEST_RESOURCE_ID”和/或“RT_MANIFEST”常量,因此您最终将创建一个实际名称为“CREATEPROCESS_MANIFEST_RESOURCE_ID”的资源,而不是ID为1的资源,以及一个实际名称为“RT_MANIFEST”的资源类型,而不是类型24。请使用资源编辑器/查看器进行验证。 - Remy Lebeau
错误的解决方案。最好嵌入资源。 - David Heffernan
1
@DavidHeffernan 你是什么意思?这应该是一个“嵌入式资源”解决方案。它应该可以在分发包中没有单独的“MYAPPNAME.exe.manifest”文件的情况下工作。除非OP另有说明。 - Barmak Shemirani
1
@DavidHeffernan 问答者已经了解非嵌入式解决方案。请参见原始帖子,其中写着“当我创建清单并将其放在我的exe文件附近时,一切正常。但是当我尝试将清单编译到资源中时,没有效果”。整个问题都是关于嵌入式解决方案的。 - Barmak Shemirani
1
@DavidHeffernan 我认为唯一的问题是 CREATEPROCESS_MANIFEST_RESOURCE_ID 没有声明为 1。我在 CodeBlock 和 MinGW 上尝试了一下,它可以工作。有时候我会在我的帖子中添加一些毫无意义的迷信。我已经删除了那部分内容。 - Barmak Shemirani
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接