【问题标题】:What does IDC_STATIC means in a resource.h file?在 resource.h 文件中 IDC_STATIC 是什么意思?
【发布时间】:2021-01-14 05:19:03
【问题描述】:

我有一个 VS 2012 生成的简单 Win32 项目。在resource.h 文件中,我看到了这个:

#ifndef IDC_STATIC
#define IDC_STATIC              -1
#endif

我发现它在 resource.rc 文件的几个地方被引用。但我无法理解这意味着什么。我也没有在网上找到有关它的参考资料。有什么想法吗?

【问题讨论】:

  • 它与 STATIC TEXT 控件有关(常见控制的一部分。您可以找到更多详细信息here,然后点击该页面上的链接到 CreateWindow/CreateWindowEx 获取更多详细信息。
  • 当您不需要为控件分配特定 ID 时使用它,因为您不想以编程方式引用它;大多数情况下,一个永远不会改变且用户不会与之交互的静态标签。
  • 没有静态文本控件。有一个可以显示文本或图像的 STATIC 控件。正如乔纳森所说,当你不需要在运行时与控件交互,不需要接收通知时,ID 并不重要。因此,约定将 -1 分配给不需要运行时交互的任何控件。
  • 在 WinRes.h 中声明。一个非常不起眼的 SDK 头文件,几乎没有人想到 #include 。因此,粗略地说,为了减少支持调用的数量,他们让资源编辑器在尚未定义的情况下生成它。
  • @HansPassant:没有人包含 winres.h,因为它严格来说不是 Windows SDK 的一部分。第一行内容为:"// 这是 Microsoft Foundation Classes C++ 库的一部分。" 它作为 Windows SDK 的一部分提供,以减少支持调用的数量。既不包括它也不定义一个名为 IDC_STATIC 的预处理器符号是强制性的(而后者至少是有用的)。

标签: windows winapi


【解决方案1】:

通过调用CreateWindowEx 创建子控件时,您必须分配控件ID(通过重载的hMenu 参数)。控件 ID 稍后可用于引用控件,而不必存储动态创建的 HWND(例如,在调用 GetDlgItemGetDlgItemInt 时)。

有些控件很少需要在代码中标识。一个突出的例子是Static Control1,如果在资源脚本中定义,通常不需要在代码中引用。您(或对话框管理器)在创建控件时仍然需要传递控件 ID,即使您以后不使用它。对于这些控件,您可以传递 IDC_STATIC 控件 ID,该 ID 在向导生成的 Resource.h 文件2 中定义。


1其他示例包括Icon Control(具有SS_ICON 样式的静态控件)、Line Control(具有SS_ETCHEDHORZSS_SUNKEN 的静态控件样式),或GroupBox Control

2这不是 Windows API3 的约定。这完全是由用户代码做出的决定。您可以使用另一个 ID 值,或者根据需要根本不定义 IDC_STATIC,并在 LTEXT control statement 中使用整数文字:LTEXT "Filename", -1, 10, 10, 100, 100

3当然,SDK 标头 winres.h 确实将预处理器符号 IDC_STATIC 定义为 (-1),所以如果你在你的代码,请确保分配相同的值以避免任何混淆。

【讨论】:

  • 当我们对所有这些脚注进行吹毛求疵时,我不得不指出“图标”和“线条”控件实际上是具有不同样式的静态控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 2011-08-12
  • 2017-06-11
  • 2018-03-05
  • 2023-03-27
相关资源
最近更新 更多