用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消息?各位有没有碰到过这种情况?
解决方案 »
- vc++6.0和DirectX SDK什么关系?我菜鸟刚学习
- 大概我不给分的时候很多人都看不到,我给分提问
- 更改内存读写属性
- 我做了个测试用的ActiveX控件,怎么用VS2005的CAB项目打包?
- 地图的显示
- 我想做一个类似qq的程序,但界面上有没有好的美化处理方式
- 求思路!用VC实现调用无窗口IE登录Yahoo邮件服务器!
- 如何下载并提取html文件中的一部分数据?
- 在vc中不能将const int *所定义的变量返回给int *类型的变量吗?
- 怎样从一个win2K的服务程序(service)中生成一个可见的console窗口?
- 哪里有windows程序调试这本书的下载?
- 如何调出操作系统的"日期时间 属性"对话框
LB_DELETESTRING 消息
只有
listbox 有owner_draw 且没有HASSTRING STYLE ,才会发送WM_DELETEITEM消息
LB_DELETESTRING 是发给ListBox要求删除子项的,WM_DELETEITEM才是删除时通知父窗口的。
属性设成非owner_draw,HASSTRING STYLE ,你试试看有没有WM_DELETEITEM消息。to linchunfu(林雨):
ID没有问题,正确删除了,一个循环,从最后一个ITEM删起,每删一个收到一个WM_DELETEITEM消息,删到最后一个,没有消息了。
然后在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键会弹出一个消息框,就是删除最后一个选项时没有。