【问题标题】:Get ListBox handle from Window handle从窗口句柄获取 ListBox 句柄
【发布时间】:2014-03-05 19:39:15
【问题描述】:

我对 WIN32 API 中的整个“窗口”和“列表框”这件事感到非常困惑。我只是想创建一个窗口作为“列表框”并向其中添加元素。我的最终目标将是一个类似于此处的列表框:http://msdn.microsoft.com/en-us/library/windows/desktop/hh298365%28v=vs.85%29.aspx

我首先创建一个带有列表框的窗口,如下所示:

hDlg = CreateWindowExA(
        WS_EX_CLIENTEDGE,
        "ListBox",
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

但据我了解,hDlg 现在指向整个窗口而不是列表框。

理想情况下,我希望能够将项目添加到类似于以下内容的列表框中:

int pos = (int)SendMessage(hwndList, LB_ADDSTRING, 0, 
                    (LPARAM) "Test Item1"); 

但是我无法以与教程相同的方式获取列表的句柄,因为他们使用这一行:

HWND hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE);  

但是IDC_LISTBOX_EXAMPLE 会抛出编译错误,因为它没有包含在任何地方。对于我的一生,我无法通过谷歌搜索第二个参数 int nIDDlgItem 的正确结果。

有人可以向我解释如何找到值GetDlgItem() 或从CreateWindowExA() 找到我的列表框的句柄吗?

【问题讨论】:

  • 屏幕截图不是从该代码生成的,该列表框是 WS_CHILD。
  • 那是我困惑的一部分......他们在“如何创建示例列表框”中没有提到 WS_CHILD......
  • “先决条件:Windows 用户界面编程。”在处理此示例之前,您应该知道这一点,因此它不会显示 CreateWindowEx() 调用。它实际上是一个 DialogBox() 调用。 Petzold 很好地解释了这一点。

标签: winapi listbox window


【解决方案1】:

问题是您使用预定义的ListBox 窗口类来创建顶级窗口。

hDlg = CreateWindowExA(WS_EX_CLIENTEDGE, "ListBox", ...

这是创建一个列表框控件。 CreateWindowEx 的第二个参数指定 窗口类 - 这告诉系统您要创建什么类型的窗口。由于您为该值传递了"ListBox",因此它将创建ListBox 类的实例。

问题在于您将该窗口创建为顶级窗口。 WS_OVERLAPPEDWINDOW 是一种用于顶级窗口的窗口样式(即上面屏幕截图中标题为“列表框示例”的窗口样式)。子窗口,如列表框控件,需要设置WS_CHILD样式。

您真正需要做的是使用RegisterClass 为顶级窗口注册您自己的窗口类。在调用 CreateWindowEx 创建主窗口时,您将使用此类名称,然后然后将各种控件创建为该窗口的子窗口。

【讨论】:

  • 我了解注册一个类并用它创建窗口。但是我将如何在该窗口中创建子控件?
  • 每个控件都需要单独创建,通过将适当的类名传递给CreateWindowEx 并确保设置WS_CHILD 样式。或者使用对话框,系统会为您完成所有工作。
  • 顺便说一下,这是非常基本的 Windows 101 内容,您可能想尝试一本书来帮助您入门 - Petzold 书通常是初学者的黄金标准。
  • 谢谢。我的老板要求我使用我非常不熟悉的 WINAPI(Linux 背景)创建一个小型 GUI。所以我正在尝试关注 MSDN 文章,但它们似乎比我知道的要多一些。
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 2011-02-26
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
相关资源
最近更新 更多