簡體   English   中英

無法將項目添加到Win32列表框控件

[英]Cannot add items to Win32 List Box Control

背景故事:我正在創建Game Maker擴展程序,這是一個流行的游戲開發套件。 擴展名是DLL,它向內置腳本語言添加了新功能,但使用C或Pascal或其他語言編寫。 通常,它用於允許游戲使用外部庫。

就我而言,我要添加FMOD支持。 這無關緊要。 與此相關的是,出於調試目的,我還添加了一個在運行時顯示的對話框,該對話框向我顯示了庫的內部狀態。 我需要此窗口的幫助。 在今天之前,我實際上根本沒有進行過原始的Win32表單編程(.NET WinForms 4eva),因此我可能做的事情非常笨拙。

無論如何。 我有一個列表框,我想將內容添加到列表框中,但是當我嘗試添加它們時,它會失敗。 我的代碼:

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;
    }
};

沒什么特別的。

我有一個非常類似的問題,已經解決。 基本上,您必須將其作為c樣式字符串傳遞(str.c_str()) 盡管我是一個完全的新手,但是在搜尋了如何使用它之后,它還是有效的。

盡管我使用的代碼提供的功能與您使用的功能完全不同,但也許它將是一個很好的例子。

int i = res->getInt("ID");
    std::string str = boost::lexical_cast<std::string>(i);
    char *cstr = new char[10];
    strcpy_s(cstr, 10, str.c_str());
    SendDlgItemMessage(hwnd, IDC_lbList, LB_ADDSTRING, 0, (LPARAM)cstr);

編輯:哇,我什至沒有看日期。 我是個死靈法師...

您可以顯示FMODGM_Sound結構和文件字段的聲明嗎?

如果更換會怎樣?

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

與?

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

您的DLL是否編譯為Unicode版本或多字節版本?

如果是Unicode,則sound_text應該是Unicode字符串。 我猜該文件是std :: string,所以file.c_str()將返回一個多字節字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM