mfc下的listbox添加字符串的函数为AddString(LPCTSTR)
在自会的时候,如果使用GetText(),似乎得到的某一项的文本是乱码,
MSDN上的例子用的是
LPCTSTR szText = (LPCTSTR)lpDrawItemStruct->itemData;
这样可以得到正确的字符,但后来如果使用AddString来添加项目,显示的时候会是乱码,
经过调试,除非AddString的参数是个字符串常量(如_T(“”)),或者是个静态(局部的不行)的CString。
估计可能需要全局的数据。
而且GetText得到的将会是乱码,除非使用(LPCTSTR)GetItemData()才能得到正确的字符。
标准的LISTBOX却不会有这样的情况。listbox的内容经常需要根据需要而变,所以使用太多静态的很麻烦

解决方案 »

  1.   

    new出来就行了  反正不能放在栈里面  
      

  2.   

    用太多new,如果删的不是时候,会不会导致什么问题?哦,你是说放弃listbox本来的addstring和gettext方法,自己定义存和取的函数?
      

  3.   

    new出来不删就是内存泄漏  
    new一个足够大的内存  根本就不用删除  直接在里面改写内容就行了  
    最后退出再删除 
      

  4.   

    其实不想用这样的方法,主要想知道Listbox是否自己用错了。
    AddString后要用lpDrawItemStruct->itemData来取得,又不是SetItemData,GetText()却不可以。
    是不是哪里搞错了呢?
      

  5.   

    CString sText;
    CListBox::GetText(lpDrawItemStruct->itemID, sText);我是这么用的,没发现有什么错误  给出你的代码看看
      

  6.   

    同上,用GetText获取。你的代码是怎么写的?
      

  7.   


    void XXXXX::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        int nCount = GetCount();
        if(nCount == 0)
    return ;
        CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
        CString szText;
        GetText(lpDrawItemStruct->itemID,szText);
        CRect rc = lpDrawItemStruct->rcItem; 
        //....
    }
    DLg:
    m_listBox2.AddString(L"mp4");
    m_listBox2.SetItemHeight(0,20);这样只插了一项,但调试进去,发现szText是乱码。itemID确实还是0.
      

  8.   

    CString str;
    int n = GetTextLen( lpDrawItemStruct->itemID );
    GetText( lpDrawItemStruct->itemID, str.GetBuffer(n) );
    str.ReleaseBuffer();
      

  9.   

    晕,自己解决了。
    就是觉得奇怪,怎么AddString的数据到了data里去了?
    查了下控件的属性,HAS STRING为false,置true就可以用gettext取得了
      

  10.   

    没有HAS STRING类型,字符串就会作为itemdata保存,方便修改。