ying32/govcl

fileshelltree例子中怎么按文件类型获取系统原生的图标

278333422 opened this issue · 4 comments

请问能获取系统原生自带的图标吗 让fileshelltree中的文件列表看起来就跟系统自带的资源管理器一样 谢谢

ying32 commented

没研究过,不过windows下可以通过注册表获取扩展名的图标,这种百度找找应该有的

能帮忙看一下最后那几行关于 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
		}
	}
}

@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