【问题标题】:Adding numbers to a listview将数字添加到列表视图
【发布时间】:2013-11-27 18:16:48
【问题描述】:

我正在尝试在列表视图中添加显示我的结构。 TCHAR 字段显示正常,但对于数字,它显示错误的空矩形或中文符号。调试器在转换后显示正确的字符串。 这是我的结构:

typedef struct {
    unsigned phone_number, house, appartment;
    TCHAR Name[30], Street[15], date[11];
} PHONE_DATA;

我正在使用LVN_GETDISPINFO 回调初始化项目和子项目值。

TCHAR wStr[16];
//other code

switch (((LPNMHDR) lParam)->code)
{
case LVN_GETDISPINFO:

    plvdi = (NMLVDISPINFO*)lParam;
    entry = Get(&list, plvdi->item.iItem);

    switch (plvdi->item.iSubItem)
    {
    case 0:
        plvdi->item.pszText = entry->data.Name;
        break;
    case 1:     
        _itow(entry->data.phone_number, wStr, 10);
        plvdi->item.pszText = wStr;
        break;
    case 2:
        plvdi->item.pszText = entry->data.Street;
        break;
    case 3:
        _itow(entry->data.house, wStr, 10);
        plvdi->item.pszText = wStr;
        break;
    case 4:
        _itow(entry->data.appartment, wStr, 10);
        plvdi->item.pszText = wStr;
        break;
    case 5:
        plvdi->item.pszText = entry->data.date;
        break;
    default:
        break;
    }

    break;
}

以及它在我的列表视图中的外观:

我用于编辑表单的相同转换,在文本框中正确显示。

【问题讨论】:

  • 每次调用 _itow 时都在使用相同的缓冲区 - wStr。所以它被覆盖了。您甚至可能在其他地方也重写了它。
  • 但调试器显示正确的字符串。我尝试在使用之前刷新缓冲区,没有任何改变。
  • TCHAR wStr[16]; 是全局变量还是在处理WM_NOTIFY 的函数中定义?如果是后者,则一旦该函数返回,它就无效。
  • @JonathanPotter 谢谢! wStr 变量是在 WM_NOTIFY 句柄中定义的,现在它可以正常工作了!请发布答案,以便我确认。
  • 没问题,已经这样做了。

标签: c++ c winapi listview


【解决方案1】:

如果在处理WM_NOTIFY 的函数中定义了TCHAR wStr[16];,那么它在函数返回时将无效。将其更改为全局变量或将其设为 static 即可解决问题。

请注意,当您收到LVN_GETDISPINFO 通知时,控件会为您提供一个可以使用的缓冲区,因此您可以更改代码来执行此操作:

case 4:
    _itow_s(entry->data.appartment, plvdi->item.pszText, plvdi->item.cchTextMax, 10);
    break;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2013-02-06
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多