zoukankan      html  css  js  c++  java
  • Windows mobile下获取系统图标

    这个问题其实是由pocket pc的CFileDialog问题引发来的。

    CFileDialog打开后,只能选择My Documents下的目录和文件,功能超弱的说(其实应该叫CDocumentFileDialog才对)。

    好想自己做一个Dialog啊,就跟PC上一样,可以选择任务目录和文件......

    枝节不叙,捡点重要的来啰嗦。

    用到一个CListCtrl控件,来显示目录下的文件,当然图标最好跟系统的一样,这样才美观。

    这里假设m_ListFile就是list控件,m_ImlSys为CImageList对象,都为对话框的成员变量。代码如下:

    HIMAGELIST    hImlSys;
    SHFILEINFO    ssfi;

    memset(&ssfi,0,sizeof(ssfi));
    hImlSys = (HIMAGELIST)SHGetFileInfo(

                                       _T("hello"), 
                                        0,
                                        &ssfi,
                                        sizeof(SHFILEINFO),
                                        SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

    m_ImlSys.Attach(hImlSys);
    m_ListFile.SetImageList(&m_ImlSys, LVSIL_SMALL);

    这样把系统的小图标(SHGFI_SMALLICON)都载入到了m_ImlSys。这些代码在Dialog的OnInitDialog中实现。"hello"也可以写成任何值,因为使用了SHGFI_USEFILEATTRIBUTES参数,会忽略第一个参数。还有一个很重要的问题是,在对话框退出时,要调用m_ImlSys.Detach()来销毁资源。不然,很可能退出对话框后,连系统"开始"的的图标都看不到了。

    CListCtrl的InsertItem可以指定显示图标的索引(即图标在CImageList中的位置)。那么,怎么得到这个索引值呢?

    还是使用SHGetFileInfo函数,如下:

    SHFILEINFO ssfi;
    SHGetFileInfo(pszFileName, 0, &ssfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

    ssfi.iIcon就是我们要的值。在这里,pszFileName请指定文件的整个路径(包括后缀名)。

  • 相关阅读:
    Maven安装
    Linux登录欢迎图案
    GC的性能指标和内存容量配置原则
    java堆结构和垃圾回收
    框架设计知识点纵览(笔记)
    .net core在Linux本地化Localization的一次填坑
    .Net Identity OAuth 2.0 SecurityStamp 使用
    CentOS 7 安装. Net Core SDK 2.0
    Docker基本命令与使用 —— Docker容器的网络连接(四)
    Docker基本命令与使用 —— Dockerfile指令与构建(三)
  • 原文地址:https://www.cnblogs.com/fengju/p/6173556.html
Copyright © 2011-2022 走看看