WIN32 API C 程序:尽管使用 CB_ADDSTRING 填充,组合框有一个空列表或不下拉

Posted

技术标签:

【中文标题】WIN32 API C 程序:尽管使用 CB_ADDSTRING 填充,组合框有一个空列表或不下拉【英文标题】:WIN32 API C-program : Combo Box has an empty list or not dropping down despite populating with CB_ADDSTRING 【发布时间】:2020-03-04 03:30:22 【问题描述】:

我正在使用 Visual C++ 2008 使用宽字符使用 WIN32 API 对话框执行 C 程序。到目前为止,每个控件都在工作,但我现在通过从工具箱拖放到资源对话框中添加了一个组合框。我已经完成了必要的编码(见下文),但是当我单击组合框时,当我单击组合框时,列表似乎没有下拉或为空。但是最后一项(“ITEM 2”)显示在组合框中。我将代码放在 WM_INITDIALOG 而不是 WM_CREATE 中,因为我的应用程序只包含一个对话框。这是我的代码的一部分:

LRESULT CALLBACK BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)


    HWND hWndComboBox;

    switch(uMsg)
    

        case WM_INITDIALOG:

            hWndComboBox = GetDlgItem(hwnd,IDC_COMBO1); //gets handle
            SendMessage(hWndComboBox, CB_ADDSTRING, 0, TEXT("ITEM 1")); //adds items
            SendMessage(hWndComboBox, CB_ADDSTRING, 0, TEXT("ITEM 2"));
            SendMessage (hWndComboBox, CB_SETCURSEL, (WPARAM) 1, (LPARAM) 0); //display first item


我已经尝试了以下与上述相同的结果:

SendMessage (hWndComboBox, (UINT) CB_ADDSTRING, (WPARAM) 0, (LPARAM) "ITEM 1");
SendMessage (hWndComboBox, (UINT) CB_ADDSTRING, (WPARAM) 0, (LPARAM) "ITEM 2");

当我点击控件时,如何在我的 Combo Box 的下拉列表中显示这两个项目(ITEM 1 和 ITEM 2)?

【问题讨论】:

组合框控件使用对话框资源中设置的高度来定义下拉菜单的高度,我怀疑您的设置高度仅足以显示单个项目。在对话框编辑器中,单击组合框的下拉箭头,它将展开以显示下拉列表的大小。调整它的大小以使其更大。 我在对话框编辑器中单击了组合框的下拉箭头,但它没有展开。而是选择了整个组合框控件。 再次点击它。它将扩展为如下所示:imgur.com/a/oekowZ1 是的,乔纳森,你是对的!谢谢。我投了赞成票! 供参考:Why does the size of a combo box include the size of the drop-down? 和 How do I get the dropped height of a combo box?。 【参考方案1】:

是的,这个问题已经解决了。问题不在于编码中的任何地方,而在于使用鼠标或箭头键手动调整组合框控件的高度在视觉 C++ 的资源编辑器中也考虑了其下拉列表区域在下降时的高度(即当它被点击)加上正常非下拉模式下组合框的正常高度。因此,当您将 Combo Box 控件放置在资源编辑器上时,其大小(高度)应大于仅 Combo Box 控件的默认高度,因为它的下拉列表区域尚未展开。

更改组合框控件的高度有点棘手。当您第一次单击组合框以选择它时,您的鼠标光标不会在您第一次单击时变为调整大小的向上/向下箭头。您必须再次单击组合框右端的向下箭头(是的,第二次)。只有你才能获得调整大小的向上/向下箭头。非常感谢@JonathanPotter 提供这些信息!

【讨论】:

干杯 Drake Wu! 也可以在控件所在的.rc文件中手动增加高度数。最后一个数字代表高度,所以如果通过编辑器太难,只需增加即可。

以上是关于WIN32 API C 程序:尽管使用 CB_ADDSTRING 填充,组合框有一个空列表或不下拉的主要内容,如果未能解决你的问题,请参考以下文章

求写一个win32api的c语言创建窗口的程序。要最简单的,带注释谢谢。

用于获取活动目录票的 Win32 API?

C# .NET Framework API(非 Win32 API)中的 CreateProcessAsUser()

c语言 win32api 创建一个按钮,点击按钮后,按钮消失?

MingW缺少Win32加密API的一些功能

win32程序创建线程用c语言库的_beginthread还是API的CreateThread?哪种用的多?