为什么无法在组合框中添加字符串? VS C ++

时间:2015-07-01 18:36:39

标签: c++ winapi combobox

当我启动我的应用程序并单击“触发器”选项卡时,很少有选择框可以加载项目列表。有内置函数可以工作(如果从菜单中打开方案文件testscen.scx然后单击Units选项卡,则可以检查它,因此函数ret = Units_HandleInit(dialog);调用Combo_Fill(dialog, IDC_U_TYPE, esdata.unitgroups.head(), L"All");来加载数据以进行输入selectbox(view / editunits.cpp)。

当没有加载文件时,我想在模块视图/ edittriggers2.cpp中做类似的事情 - 有函数BOOL Handle_WM_INITDIALOG2(HWND dialog)

BOOL Handle_WM_INITDIALOG2(HWND dialog)
{
    LCombo_Fill(dialog, IDC_T_UCLASS1, esdata.unitgroups.head(), L"All");
    LCombo_Fill(dialog, IDC_T_UCLASS2, esdata.unitgroups.head(), L"All");
    LCombo_Fill(dialog, IDC_T_UCLASS3, esdata.unitgroups.head(), L"All");
    return TRUE;
}

调用LCombo_Fill(dialog, IDC_T_UCLASS1, esdata.unitgroups.head(), L"All");,但不幸的是,唯一的项目添加了"全部"。我无法理解为什么,第一个被添加,其余项目没有添加?我可以调试它并在函数中循环检查是否有消息发送以添加字符串。

esdata.unitgroups.head() returns link.
When I debug the LCombo_Fill so it first jumps to [code]
template <class T> T * LinkList<T>::head()
{
    return _head;
}

然后到

inline LRESULT LCombo_Fill(HWND dialog, int id, const Link * list,
        const wchar_t * nosel = NULL)
{
    return LinkComboBox_Fill(GetDlgItem(dialog, id), list, NULL, nosel);
}

list是完全有效的单位类型列表。我用Units检查了地址和值,这是正确的。 nosel是&#34; All&#34;

然后到:

LRESULT Combo_AddW(HWND combobox, LPCWSTR string, const void * data)
{
    LRESULT index = Combo_AddStringW(combobox, string);
    Combo_SetItemData(combobox, index, data);

    return index;
}

然后到:

int LinkComboBox_Fill(HWND combobox, const Link *list, const Link *select,
        const wchar_t * nosel)
{
    int ret = -1;

    SendMessage(combobox, CB_RESETCONTENT, 0, 0);

    if (nosel)
        Combo_AddW(combobox, nosel, NULL);

    for (; list; list = list->next())
    {
        LRESULT index = Combo_AddW(combobox, list->name(), list);

        if (list == select)
        {
            SendMessage(combobox, CB_SETCURSEL, index, 0);
            ret = index;
        }
    }

    if (ret == -1 && nosel)
    {
        SendMessage(combobox, CB_SETCURSEL, 0, 0);
        ret = 0;
    }

    return ret;
}

然后到:

LRESULT Combo_AddW(HWND combobox, LPCWSTR string, const void * data)
{
    LRESULT index = Combo_AddStringW(combobox, string);
    Combo_SetItemData(combobox, index, data);

    return index;
}

最后:

inline LRESULT Combo_SetItemData(HWND control, WPARAM index, const void * ptr)
{
    // LPARAM is defined as a LONG_PTR by the documentation. Hopefully that
    // won't change.
    return SendMessageW(control, CB_SETITEMDATA, index,
        reinterpret_cast<LPARAM>(ptr));
}
// (the comments above are not of me)

ptr是0x00000000

然后在循环中调用相同的函数:

LRESULT index = Combo_AddStringW(combobox, string);
Combo_SetItemData(combobox, index, data);

所以我需要帮助才能找到为什么组合框没有填充通过循环传递的值的原因。

注意: 在循环中调试: res = SendMessageW(control, CB_ADDSTRING, 0, (LPARAM)string); res是1

LRESULT index = Combo_AddStringW(combobox, string); 结果是1(看起来像索引,循环时增加)

在Combo_SetItemData中

LRESULT res = SendMessageW(control, CB_SETITEMDATA, index, reinterpret_cast<LPARAM>(ptr)); res是1

我没有编写程序,源代码很复杂。我不能简化它,但是有人知道除了第一项之外没有添加项目的原因吗?没有添加到组合框中的项目。

项目链接: http://sourceforge.net/projects/autots/files/AOKTS%20update/aokts-1.0.1%20r72%20update_test.zip/download 项目文件名:aokts.sln

1 个答案:

答案 0 :(得分:3)

调整Combobox的大小以查看其他添加内容。如果您在资源文件中有对话框,则可以单击组合框的箭头并在那里调整大小。