Mobile 上的文件选择对话框

先前的一个项目中需要从mobile中选择相片,使用的Microsoft.WindowsMobile.Forms.SelectPictureDialog组件,前面没发现什么问题,可是后来越来越多用户反映按“选择”按钮没反应,自己测试又重现不了。实地去看了下,才明白,使用了一段时间以后,客户端的数据量增大,程序运行时,缓存的数据越来越多,所占系统内存越大,导致选择相片的对话框无法显示,一闪而过。而CF里面的OpenFileDialog因为mobile的安全限制,只能访问my Document下的文件。于是想寻找一个mobile上的文件选择对话框组件。在codeproject上发现一个不错,可惜是老外用c++写的,并没有COM组件化,CF无法使用。干脆自己写一个。效果如下图

 

考虑mobile上的性能,初始化树的时候采用了逐层加载,当展开某个节点时才加载下一层次的结构。

取文件夹图标和文件图标用到了GetFileInfo api,在http://pinvoke.net/上有该函数的C#调用示例。

        #region GetIconByFileName
        [DllImport("coredll.dll", EntryPoint = "SHGetFileInfo")]
        public static extern int GetFileInfo(string pszPath, int dwFileAttributes, ref  FileInfoStruct psfi, int cbFileInfo, int uFlags);

        [StructLayout(LayoutKind.Sequential)]
        public struct FileInfoStruct
        {
            public IntPtr hIcon;
            public int iIcon;
            public int dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        }

        public enum FileInfoFlags : int
        {
            SHGFI_ICON = 0x000000100,  //  get icon
            SHGFI_DISPLAYNAME = 0x000000200,  //  get display name
            SHGFI_TYPENAME = 0x000000400,  //  get type name
            SHGFI_ATTRIBUTES = 0x000000800,  //  get attributes
            SHGFI_ICONLOCATION = 0x000001000,  //  get icon location
            SHGFI_EXETYPE = 0x000002000,  //  return exe type
            SHGFI_SYSICONINDEX = 0x000004000,  //  get system icon index
            SHGFI_LINKOVERLAY = 0x000008000,  //  put a link overlay on icon  SHGFI_SELECTED  = 0x000010000 ,  //  show icon in selected state
            SHGFI_ATTR_SPECIFIED = 0x000020000,  //  get only specified attributes
            SHGFI_LARGEICON = 0x000000000,  //  get large icon
            SHGFI_SMALLICON = 0x000000001,  //  get small icon
            SHGFI_OPENICON = 0x000000002,  //  get open icon
            SHGFI_SHELLICONSIZE = 0x000000004,  //  get shell size icon
            SHGFI_PIDL = 0x000000008,  //  pszPath is a pidl
            SHGFI_USEFILEATTRIBUTES = 0x000000010,  //  use passed dwFileAttribute
            SHGFI_ADDOVERLAYS = 0x000000020,  //  apply the appropriate overlays
            SHGFI_OVERLAYINDEX = 0x000000040   //  Get the index of the overlay
        }

        private Icon GetIconByFileName(string path)
        {
            FileInfoStruct _info = new FileInfoStruct();
            GetFileInfo(path, 0, ref  _info, Marshal.SizeOf(_info),
            (int)(FileInfoFlags.SHGFI_ICON | FileInfoFlags.SHGFI_SMALLICON));
            return Icon.FromHandle(_info.hIcon);
        }

        #endregion

节点展开的时候,特殊处理了windows文件夹,在mobile上打开这个系统文件夹很慢,如果没有特殊要求,可以将

SystemEnabled 属性设置为false.

   private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            if (SystemEnabled == false && e.Node.Text.ToLower() == "windows")
            {
                e.Cancel = true;
                return;
            }
           
            if (e.Action == TreeViewAction.Expand)
            {
                e.Node.Nodes.Clear();
                listView1.Items.Clear();
                imageList2.Images.Clear();
                string path = e.Node.FullPath.Replace("\\\\", @"\");
                AddNode(e.Node, new DirectoryInfo(path));
            }
        }

源码下载

posted on 2009-11-05 17:01  wangxm  阅读(630)  评论(4)    收藏  举报

导航