[英]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.