无法向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;
}
};
没什么特别的
能否显示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()将返回一个多字节字符串。
我遇到过一个非常类似的问题,但已经解决了。基本上,你必须传递它作为一个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);
编辑:哇,我都没看日期。
- 如何在Qt C++中向自定义控件添加属性?
- MFC CEdit 控件在添加到加速器后不处理按键
- 检测何时使用 WM_PARENTNOTIFY 将子 CButton 控件添加到 CDialog
- 为C /CLI中的所有请求添加自定义的标头到WebBrowser控件
- 如何将选项卡添加到我的选项卡控件(WIN32 API C++ GUI)
- C++ 如何将用户控件添加到窗体,以便我可以在面板之间转换
- MFC Applicaton:如何将一组控件添加到单个文档应用程序中
- 将事件处理程序添加到任何控件都会导致 Visual Studio 中出错
- 在运行时向窗口添加控件
- 动态地将控件添加到wxWidgets对话框
- 将变量添加到 mfc 对话框控件
- 在tizen中的表单类以外的类中添加控件
- 使用 win32 API 向丰富的编辑控件添加格式
- 无法将多媒体控件添加到Qt Creator C++项目中
- Firemonkey:在运行时将子控件添加到TListViewItem
- 向树控件添加项
- 在 c++ 生成器中将控件添加到 StringGrid
- 将子控件添加到Qt中的另一个控件
- 无法向Win32列表框控件添加项
- Visual Studio在试图向MFC窗体上的控件添加处理程序时崩溃