我对WIN32 API中的整个“窗口”经文“listbox”事情感到非常困惑。我只是尝试创建一个窗口作为“列表框”并添加元素。我的最终目标是一个类似于此处的列表框: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()
列表框的句柄吗?
答案 0 :(得分:3)
问题是您正在使用预定义的ListBox
窗口类来创建顶级窗口。
hDlg = CreateWindowExA(WS_EX_CLIENTEDGE, "ListBox", ...
这是创建一个列表框控件。 CreateWindowEx
的第二个参数指定窗口类 - 这告诉系统您要创建什么类型的窗口。由于您为该值传递"ListBox"
,因此它将创建ListBox
类的实例。
麻烦的是你正在创建那个窗口作为顶级窗口。 WS_OVERLAPPEDWINDOW
是用于顶级窗口的窗口样式(即上面屏幕截图中标题为“列表框示例”的窗口样式)。子窗口(例如列表框控件)需要设置WS_CHILD
样式。
您真正需要做的是使用RegisterClass
为顶级窗口注册您自己的窗口类。您可以在调用CreateWindowEx
创建主窗口时使用此类名称,然后然后创建各种控件作为该窗口的子项。