Winapi 从窗口句柄获取列表框句柄

Winapi 从窗口句柄获取列表框句柄,winapi,listbox,window,Winapi,Listbox,Window,我被WIN32 API中的“窗口”和“列表框”这两个词弄糊涂了。我只是尝试创建一个窗口作为“列表框”,并向其中添加元素。我的最终目标是创建一个类似于以下内容的列表框: 我首先创建一个带有列表框的窗口,如下所示: hDlg = CreateWindowExA( WS_EX_CLIENTEDGE, "ListBox", "The title of my window", WS_OVERLAPPEDWINDOW, CW_

我被WIN32 API中的“窗口”和“列表框”这两个词弄糊涂了。我只是尝试创建一个窗口作为“列表框”,并向其中添加元素。我的最终目标是创建一个类似于以下内容的列表框:

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

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\u LISTBOX\u示例
抛出一个编译错误,因为它没有包含在任何地方。就我个人而言,我无法用谷歌搜索第二个参数
int-nIDDlgItem
的正确结果


有人能告诉我如何从
CreateWindowExA()
中找到值
GetDlgItem()
,或者找到列表框的句柄吗?

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

hDlg = CreateWindowExA(WS_EX_CLIENTEDGE, "ListBox", ...
这是在创建listbox控件。
CreateWindowEx
的第二个参数指定窗口类-这告诉系统要创建的窗口类型。由于您正在为该值传递
“ListBox”
,因此它将创建
ListBox
类的实例

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


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

问题在于,您使用预定义的
列表框
窗口类来创建顶级窗口

hDlg = CreateWindowExA(WS_EX_CLIENTEDGE, "ListBox", ...
这是在创建listbox控件。
CreateWindowEx
的第二个参数指定窗口类-这告诉系统要创建的窗口类型。由于您正在为该值传递
“ListBox”
,因此它将创建
ListBox
类的实例

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


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

问题在于,您使用预定义的
列表框
窗口类来创建顶级窗口

hDlg = CreateWindowExA(WS_EX_CLIENTEDGE, "ListBox", ...
这是在创建listbox控件。
CreateWindowEx
的第二个参数指定窗口类-这告诉系统要创建的窗口类型。由于您正在为该值传递
“ListBox”
,因此它将创建
ListBox
类的实例

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


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

问题在于,您使用预定义的
列表框
窗口类来创建顶级窗口

hDlg = CreateWindowExA(WS_EX_CLIENTEDGE, "ListBox", ...
这是在创建listbox控件。
CreateWindowEx
的第二个参数指定窗口类-这告诉系统要创建的窗口类型。由于您正在为该值传递
“ListBox”
,因此它将创建
ListBox
类的实例

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


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

我了解注册一个类并使用该类创建窗口。但是如何在该窗口中创建子控件呢?每个控件都需要单独创建,方法是将适当的类名传递给
CreateWindowEx
,并确保设置了
WS_child
样式。或者使用一个对话框,系统会帮你完成所有的事情。顺便说一句,这是非常基本的Windows 101的东西,你可能想尝试一本书来入门-Petzold one通常是初学者的金标准。谢谢。我的老板让我使用我非常不熟悉的WINAPI(linux背景)创建一个小型GUI。所以我试着跟随MSDN的文章,但他们似乎比我知道的要多一些