ListCtrl 中 item 的创建: LVM_INSERTITEM
LVITEM stItem ;
stItem.iItem = i ; // 第几列
stItem.iSubItem = 0 ; //必须置0, 否则,无效
stItem.iImage = stShellFileInfo.iIcon;
stItem.pszText = L"1st SubItem" ;
::SendMessageW( hList , LVM_INSERTITEM , 0 , (LPARAM)&stItem ) ;
设置SubItem值: LVM_SETITEMTEXT
stItem.iSubItem = 1 ;
stItem.pszText = L"sUBiTEM";
::SendMessageW( hList, LVM_SETITEMTEXT , i , (LPARAM)&stItem ) ;
设置ListCtrl某一行被选择:
LVITEM stItem;
stItem.stateMask = LVIS_SELECTED;
stItem.state = LVIS_SELECTED;
::SendMessageW(hList, LVM_SETITEMSTATE, 0, (LPARAM)& stItem) ;
有时候你把这些代码放在OnInitDialog中,会发现3种情况:
1.完全没有选择.
2.被正确选择,但是是灰色(无焦点)
3.被正确选择,蓝色(有焦点)
原因是:
如果ListCtrl没有得到焦点则会不显示,或者显示灰色. ( 当 style 有: LVS_SHOWSELALWAYS 风格是总是显示,也可以直接在模板中选择 Always Show Slection. )
以上讲了1,2的情况.
要做到3,只需要设置当前焦点为ListCtrl, 比较方便的方法是在选中对话框,Ctrl+D, 双击ListCtrl,使之显示1,表示ListCtrl将获取第一焦点.
设置ListCtrl图标:
以系统文件图标为例:
SHFILEINFO stShellFileInfo = {0};
SHFILEINFOA sfia = {0};
HIMAGELIST hImageList = (HIMAGELIST)::SHGetFileInfoW(
L"",
0,
&stShellFileInfo,
sizeof(stShellFileInfo),
0X4001);//SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_ICON);
::SendMessageW( hList , LVM_SETIMAGELIST , LVSIL_SMALL , (LPARAM)hImageList ) ;
这里有一个问题, 如果你使用 ::SHGetFileInfoA 这个版本的函数,你的第一个参数可以设置为 NULL , 仍然可以得到ImageList,但是宽字符版本必须要求你为: L"" .
MSDN 社区:
你好,做两处更改应该就可以了
1、LVSIL_SMALL改成LVSIL_NORMAL;
2、把SHGetFileInfo()中的第一个参数NULL改成(LPCTSTR)_T("")
代码如下:
HRESULT hresut=CoInitialize(NULL);
HIMAGELIST hSystemSmallImageList;
SHFILEINFO shfi;
hSystemSmallImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T(""), 0, &shfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON |SHGFI_ICON);
m_ImageList.Attach(hSystemSmallImageList);
m_fileTree.SetImageList(&m_ImageList,LVSIL_NORMAL);
SHFILEINFO sfi;
SHGetFileInfo((LPCTSTR)_T(".dll"),FILE_ATTRIBUTE_NORMAL,&sfi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX|SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_DISPLAYNAME |SHGFI_TYPENAME |SHGFI_ICON );
HTREEITEM hFirst=m_fileTree.InsertItem((LPCTSTR)_T("aaa"),sfi.iIcon,sfi.iIcon);
m_fileTree.InsertItem((LPCTSTR)_T("bbb"),sfi.iIcon,sfi.iIcon,hFirst);
m_fileTree.InsertItem((LPCTSTR)_T("ccc"),sfi.iIcon,sfi.iIcon,hFirst);
m_ImageList.Detach();