c++ - 无法将项目添加到 Win32 列表框控件

标签 c++ winapi listbox dialog game-maker

背景故事:我正在为一个流行的游戏开发套件 Game Maker 创建一个扩展。扩展是一个 DLL,它将新功能添加到内置脚本语言中,但它是用 C 或 Pascal 或其他语言编写的。通常,它用于允许游戏使用外部库。

就我而言,我正在添加 FMOD 支持。这无关紧要。相关的是,出于调试目的,我还添加了一个在运行时显示的对话框,显示我的库的内部状态。我需要有关此窗口的帮助。在今天(.NET WinForms 4eva)之前,我完全没有做过任何原始 Win32 表单编程,所以我可能正在做一些非常无能的事情。

无论如何。我有一个列表框,我想向列表框中添加内容,但是当我尝试添加它们时却失败了。我的代码:

extern DebugDialog * debugDialog;

DebugDialog::DebugDialog(HWND owner, HINSTANCE hInst) {
    this->hWnd = 0;

    HWND hWnd = CreateDialogParam(hInst,
                        MAKEINTRESOURCE(IDD_DEBUGDIALOG),
                        owner,
                        DialogProc,
                        reinterpret_cast<LPARAM>(this));

    ShowWindow(hWnd, SW_SHOW);

}

DebugDialog::~DebugDialog(void) {
    DestroyWindow(this->getHWnd());
    debugDialog = NULL;
}

BOOL CALLBACK DebugDialog::DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    DebugDialog * self;

    if(message == WM_INITDIALOG) {
        self = reinterpret_cast<DebugDialog *>(lParam);
        self->hWnd = hWnd;
        SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(self));
    } else {
        self = reinterpret_cast<DebugDialog*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
    }

    if(self) {
        return self->HandleMessage(message, wParam, lParam);
    } else {
        return FALSE;
    }
}


BOOL DebugDialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch(uMsg) {
        case WM_INITDIALOG:
            MessageBox(this->getHWnd(), "Okay!", "Debug", 0);
            return TRUE;

        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case ID_CLOSE:
                case IDOK:
                case IDCANCEL:
                    delete this;
                    return TRUE;
                default:
                    return FALSE;
            }
            return TRUE;
    }

    return false;
}

void DebugDialog::loadedSound(FMODGM_Sound * sound) {
    HWND hwndList = GetDlgItem(this->getHWnd(), IDC_LIST);

    LPARAM sound_text = (LPARAM)sound->file.c_str();

    LRESULT lResult = SendMessage(hwndList, LB_ADDSTRING, NULL, sound_text);
    SendMessage(hwndList, LB_SETITEMDATA, lResult, (LPARAM)sound);

}

DebugDialog 是一个包装窗口的简单类,让我可以从外部对其进行操作。基本上,在其他时候,我这样做:

debugWindow = new DebugDialog(owner, hInst);

然后当我执行并做一些有趣的事情时,我会这样做:

FMODGM_Sound * sound = ...;

if(debugWindow) debugWindow->loadedSound(sound);

loadedSound 中,我向列表框发送消息说“嘿,这是一个项目。继续添加。”,它没有返回错误。但是,它也不会向框中添加任何内容。每次我调用它时它都会返回 0。根据文档,0 表示它添加了一个项目,其索引为 0。但是,该项目不存在。

我有一个关于为什么它不起作用的理论。我无法控制 Game Maker 运行的消息泵,所以如果它正在做任何奇怪的事情,我不知道,也无法更改它。也就是说,对话框的其他所有功能都有效,包括移动它、单击我的“关闭”按钮以及使用鼠标在列表框中绘制选取框。

有人,请告诉我我做错了什么:(

编辑:有人询问了FMODGM_Sound 结构,这里是:

struct FMODGM_Sound {
FMOD::Sound * sound;
std::vector<FMOD::Channel*> channels;
    std::string file;

public:
    FMODGM_Sound() {
        sound = NULL;
    }
};

没什么特别的。

最佳答案

你能展示 FMODGM_Sound 结构和文件字段的声明吗?

如果替换会发生什么

LRESULT lResult = SendMessage(hwndList, LB_ADDSTRING, NULL, sound_text);

与?

LRESULT lResult = SendMessage(hwndList, LB_ADDSTRING, NULL, "some constant text");

关于c++ - 无法将项目添加到 Win32 列表框控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5727108/

相关文章:

c++ - Windows 工具栏 - 控制按钮大小和填充

c# 如何将一个对象添加到我的列表框但显示一个字符串

c++ - 如何正确使用 noexcept 运算符

c++ - 在C++中生成任意嵌套的 vector

c++ - 如何从C++中的字符串中提取单词

c++ - 编辑控件替换背景需要选择HBRUSH吗?

windows - 具有最小延迟的串行通信

c++ - 如何在 C++ 中通过内置的 reverse() 函数存储反转的字符串

asp.net-mvc - formcollection 只保存选定的 html.listbox 项目值? MVC

c# - 如何在可导航应用程序中支持 ListBox SelectedItems 与 MVVM 的绑定(bind)