用CreateWindow创建的ListBox控件,类型为LBS_HASSTRINGS|LBS_SORT|LBS_NOTIFY|WS_VSCROLL|WS_BORDER加入列表子项后发送LB_SETITEMDATA消息绑定数据,是分配的内存指针,退出时需要释放,原以为程序关闭时能收到WM_DELETEITEM消息,可以通过发送LB_GETITEMDATA消息得到该数据后释放,结果截不到WM_DELETEITEM消息,必须在程序关闭时把列表中的选项一个个删除才会有WM_DELETEITEM消息,如果是这样也就罢了,麻烦一点而已,结果发现当删除最后一个列表选项,又收不到WM_DELETEITEM消息了。这是ListBox的特性吗?删除最后一个列表选项不发送WM_DELETEITEM消息?各位有没有碰到过这种情况?

解决方案 »

  1.   

    应该是
    LB_DELETESTRING 消息
    只有
    listbox 有owner_draw 且没有HASSTRING STYLE ,才会发送WM_DELETEITEM消息
      

  2.   

    to hdt(倦怠) :
    LB_DELETESTRING 是发给ListBox要求删除子项的,WM_DELETEITEM才是删除时通知父窗口的。
    属性设成非owner_draw,HASSTRING STYLE ,你试试看有没有WM_DELETEITEM消息。to linchunfu(林雨):
    ID没有问题,正确删除了,一个循环,从最后一个ITEM删起,每删一个收到一个WM_DELETEITEM消息,删到最后一个,没有消息了。
      

  3.   

    大家可以试一下,标准对话框程序,界面上放一个LISTBOX,什么都不要改。
    然后在OnInitDialog里面加上:
    HWND hwnd = ::GetDlgItem(m_hWnd,IDC_LIST1);
    char s[20];
    int index;for(int i=1;i<11;i++)
    {
    wsprintf(s,"item%02d",i);
    index = ::SendMessage(hwnd,LB_ADDSTRING,0,(LONG)s);
    ::SendMessage(hwnd,LB_SETITEMDATA,index,i);  //设置数据
    }在OK按钮的OnOK里加上:HWND hwnd = ::GetDlgItem(m_hWnd,IDC_LIST1);
    int n = ::SendMessage(hwnd,LB_GETCOUNT,0,0);
    ::SendMessage(hwnd,LB_DELETESTRING,n-1,0);
    //CDialog::OnOK();   //取消默认处理然后加入WM_DELETEITEM的消息处理:
    void CMyAppDlg::OnDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct) 
    {
    // TODO: Add your message handler code here and/or call default
    char s[20];
    wsprintf(s,"id:%d,data:%d",lpDeleteItemStruct->itemID,lpDeleteItemStruct->itemData);
    AfxMessageBox(s);
    CDialog::OnDeleteItem(nIDCtl, lpDeleteItemStruct);
    }编译运行,每按一次OK键会弹出一个消息框,就是删除最后一个选项时没有。
      

  4.   

    你用spy++监视一下wm_deleteitem ,看看到底有多少,