fileshelltree例子中怎么按文件类型获取系统原生的图标
278333422 opened this issue · 4 comments
278333422 commented
请问能获取系统原生自带的图标吗 让fileshelltree中的文件列表看起来就跟系统自带的资源管理器一样 谢谢
ying32 commented
没研究过,不过windows下可以通过注册表获取扩展名的图标,这种百度找找应该有的
278333422 commented
能帮忙看一下最后那几行关于 win.SHGetFileInfo和win.TSHFileInfo 哪里有问题吗 谢谢 研究一天了没有搞定
func (f *TForm1) walkFile(node *vcl.TTreeNode, path string, recurse bool) {
fd, err := os.Open(path)
if err != nil {
if os.IsNotExist(err) {
return
}
return
}
defer fd.Close()
// 添加当前目录
if recurse && (node == nil) {
subNode := f.TreeView1.Items().Add(nil, ".")
f.paths[subNode.Instance()] = path
subNode.SetSelectedIndex(1)
subNode.SetStateIndex(0)
}
//imgList := vcl.NewImageList(f)
ico := vcl.NewIcon()
ico.SetTransparent(true)
ImageList1 := vcl.NewImageList(f)
ImageList1.SetHeight(16)
ImageList1.SetWidth(16)
f.ListView1.SetSmallImages(ImageList1)
defer ico.Free()
for {
files, err := fd.Readdir(100)
for _, file := range files {
if recurse {
if file.IsDir() {
curPath := path + string(os.PathSeparator) + file.Name()
var subNode *vcl.TTreeNode
if node == nil {
subNode = f.TreeView1.Items().Add(nil, file.Name())
} else {
subNode = f.TreeView1.Items().AddChild(node, file.Name())
}
//subNode.SetImageIndex(0)
subNode.SetSelectedIndex(1)
subNode.SetStateIndex(0)
//subNode.SetData(unsafe.Pointer(uintptr(index)))
f.paths[subNode.Instance()] = curPath
f.walkFile(subNode, curPath, recurse)
subNode.Expand(false)
}
} else {
var shfi win.TSHFileInfo
win.SHGetFileInfo(path+ string(os.PathSeparator) + file.Name(),0,&shfi,win.SHGFI_SYSICONINDEX|win.SHGFI_SMALLICON|win.SHGFI_PIDL)
ico.SetHandle(shfi.HIcon)
index := ImageList1.AddIcon(ico)
item := f.ListView1.Items().Add()
item.SetImageIndex(index)
item.SetCaption(file.Name())
item.SubItems().Add(fmt.Sprintf("%d byte", file.Size()))
item.SubItems().Add(filepath.Ext(file.Name()))
}
}
if err == io.EOF {
break
}
if len(files) == 0 {
break
}
}
}
278333422 commented
@ying32
shell32dll.go
这个文件的 79行是不是少一个参数?
r, _, _ := _SHGetFileInfo.Call(CStr(pszPath), uintptr(dwFileAttributes), uintptr(unsafe.Pointer(psfi)), uintptr(uFlags))
应该为
r, _, _ := _SHGetFileInfo.Call(CStr(pszPath), uintptr(dwFileAttributes), uintptr(unsafe.Pointer(psfi)),uintptr(unsafe.Sizeof(*psfi)), uintptr(uFlags))
ying32 commented
确实是少个 cbFileInfo