void CDialogModalless::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
InsertListItem();
UpdateData(FALSE);
*pResult = 0;
}
void CDialogModalless::InsertListItem()
{
//获取当前被选择的tree view项
HTREEITEM CurItem=m_Tree.GetSelectedItem();
//获得当前选中项的文本
CString str=m_Tree.GetItemText(CurItem);
CFileFind file;
int number=0;
str=str+"\\"+"*.*"; //设置路径
//由于List插入两列的方法是:第一列用InsertItem(),第二、三列用SetItemText()
//但是由于在查找时可能先找出的是满足第二列的功能,所以采用先找完第一列再找第二列的方法
BOOL bfind=file.FindFile(str);
while(bfind)
{
bfind=file.FindNextFile(); //一定要紧随FindFile()其后,因为bfind是作为改变while循环的条件,否则会陷入死循环
if(!file.IsHidden() && file.IsDirectory())
{
CString DirectoryName=file.GetFileName();
m_List.InsertItem(number,DirectoryName);
number++;
}
}
number=0;
bfind=file.FindFile(str);
NM_LISTVIEW ListView;
while(bfind)
{
bfind=file.FindNextFile();
if(!file.IsHidden() && !file.IsDirectory())
{
CString FileName=file.GetFileName();
ListView.lParam=(LPARAM)number;
m_List.SetItemText(number,1,_T(FileName)); //BOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText);可以设置每列的显示字符。nItem为设置的项的位置,nSubItem为列位置,lpszText为显示字符。
m_List.SetItemData(number,number); 
number++;
}
}
SortListItem(number);
}void CDialogModalless::SortListItem(int total)
{
for(int i=1;i<=total-1;i++)
{
for(int j=1;j<=total-i;j++)
{
//当我调试到下面这一句时出错,说m_List没有创建窗口,那我想对上面已经插好的文件名排序,我该怎么调用这个函数了?
m_List.SortItems(CompareFunc,(DWORD)&m_List);
}
}
}int CALLBACK CDialogModalless::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CDialogModalless *pDialogModalless=(CDialogModalless*)lParamSort;
CString strItem1=pDialogModalless->m_List.GetItemText(lParam1,0);
CString strItem2=pDialogModalless->m_List.GetItemText(lParam2,0);
return strcmp(strItem2,strItem1);
}

解决方案 »

  1.   

    if(!m_List.IsWindow()){
       return;
    }
      

  2.   

    楼上的,按照你的提示,我加了
    void CDialogModalless::SortListItem(int total)
    {
    if(!m_List.IsWindowEnabled())
       return;
    for(int i=1;i<=total-1;i++)//调试时能执行到这步,是否说明m_List窗口存在?如果存在,为什么一到下面,又出现同样的错误了?
    {
    for(int j=1;j<=total-i;j++)
    {
    m_List.SortItems(CompareFunc,(DWORD)&m_List);
    }
    }
    }