为啥列表框不使用 Visual C++ 6 显示元素?
Posted
技术标签:
【中文标题】为啥列表框不使用 Visual C++ 6 显示元素?【英文标题】:Why is Listboxes not displaying elements using Visual C++ 6?为什么列表框不使用 Visual C++ 6 显示元素? 【发布时间】:2016-02-11 21:04:30 【问题描述】:所以,我有一个列表框问题,我希望它显示的条目没有在 Visual C++ 6 中显示。
代码如下。
switch (m)
case WM_INITDIALOG: //To initiate the dialog box
HICON hicon = (HICON__ *)LoadImageW(GetModuleHandleW(NULL), MAKEINTRESOURCEW(IDI_ICONMAIN), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
SendMessageW(h, WM_SETICON, ICON_BIG, (long)hicon);
RECT Rect;
::GetWindowRect(h, &Rect);
::SetWindowPos(h, HWND_TOPMOST, (::GetSystemMetrics(SM_CXSCREEN)/2 - ((Rect.right - Rect.left)/2)), (::GetSystemMetrics(SM_CYSCREEN)/2 - ((Rect.bottom - Rect.top)/2)), (Rect.right - Rect.left), (Rect.bottom - Rect.top), SWP_SHOWWINDOW);
//Place items in listbox.
const std::string StringArray[] = "10", "20", "30", "40", "50", "60", "70";
SendMessage(h, LB_ADDSTRING, DROPDOWN1, (LPARAM)StringArray);
return TRUE;
【问题讨论】:
c++ 6 实际上是什么? 您将消息发送到错误的窗口。使用描述性变量名称,“h”很烂。 @πάνταῥεῖ 快速谷歌让我觉得他的意思是 Visual C++ 6,但我们不能确定。 你需要一个一个地发送字符串,你不能发送这样的数组。 Win32 对 std::string 一无所知,因此您需要发送原始 c 字符串,即 StringArray[i].c_str() 您从哪里得到可以像这样使用LB_ADDSTRING
的想法? LB_ADDSTRING
需要一个指向单个零结尾字符串的指针 lparam
。您正在发送一个指向 array 的指针。除此之外,该数组还包含std::string
对象,它们根本不是以零结尾的字符串。
【参考方案1】:
C++ 不是 C#。原始数组不是类,也没有方法。
使用std::vector< std::string >
。
但在此之前,请获取a good C++ book 并学习 C++。
ETA 由于您在尝试调用 StringArray
变量上不存在的 .Length
以在 for 循环中遍历它的地方进行了编辑...
MSDN 文档中关于 LB_ADDSTRING 消息的哪些内容让您认为它会接受std::string
? std::string
不是以 NULL 结尾的字符数组。为什么您认为可以将 std::string
的数组转换为 LPARAM
?
你想要的更像是:(我没有编译这段代码。)
typedef std::vector< std::string > string_vec;
const string_vec StringArray"10", "20", "30", "40", "50", "60", "70";
for( const auto & s : StringArray )
SendMessage(h, LB_ADDSTRING, DROPDOWN1, (LPARAM)( s.c_str() ) );
Range-based for
注意这是现代的 C++,而不是古老的过时的 VC++ 6。
【讨论】:
以上是关于为啥列表框不使用 Visual C++ 6 显示元素?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我用Microsoft Visual C++ 6.0运行c语言文件出错?
德尔福。为啥要在 Windows 7 64 位上以发布模式编译程序。但是文本框不显示文本?