从Window句柄获取ListBox句柄

时间:2014-03-05 19:39:15

标签: winapi listbox window

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

List Box Example

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

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()列表框的句柄吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

麻烦的是你正在创建那个窗口作为顶级窗口。 WS_OVERLAPPEDWINDOW是用于顶级窗口的窗口样式(即上面屏幕截图中标题为“列表框示例”的窗口样式)。子窗口(例如列表框控件)需要设置WS_CHILD样式。

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