zoukankan      html  css  js  c++  java
  • 个人对于实现资源管理器功能的看法

    使用exptreelib.dll 控件,实现资源管理器左侧功能。
    private ExpTreeLib.ExpTree expTree1;

    关于资源管理器的实现,研究了一通,最后还是用了System.Windows.Forms.:FolderBrowserDialog,
    有句话说FolderBrowserDialog 够用,就直接用。
    至于放弃资源管理器代码实现的原因是,在treeview 双击树接点,打开一个文件夹的时候,如果该文件夹下有很多.doc文件(2544个,共36.6 MB)的时候抛异常。这个异常,我当时没能解决掉。 。为了赶时间,最后放弃了资源管理器模式。
     protected virtual void SetIcon(ImageList imageList,string FileName,bool tf)
      {
       SHFILEINFO fi=new SHFILEINFO();
       if(tf==true)
       {
        int iTotal=(int)SHGetFileInfo(FileName,0,ref fi,100,  16640);//SHGFI_ICON|SHGFI_SMALLICON
        try
        {
         if(iTotal >0)
         {
          Icon ic=Icon.FromHandle(fi.hIcon);
          imageList.Images.Add(ic);
          //return ic;
         }
        }
        catch(Exception ex)
        { MessageBox.Show(ex.Message,"2错误提示",0,MessageBoxIcon.Error);}
       }
       else
       {
        int iTotal=(int)SHGetFileInfo(FileName,0,ref fi,100,  257);
        try
        {
         if(iTotal >0)
         {
          Icon ic=Icon.FromHandle(fi.hIcon);
          imageList.Images.Add(ic);
          //return ic;
         }
        }
        catch(Exception ex)
        { MessageBox.Show(ex.Message,"3错误提示",0,MessageBoxIcon.Error);}
       }
       // return null;
      }

    异常信息:
    传递到icon的win32句柄无效或者类型错误。

    按一个同仁的相同的异常开帖问题解决方法:
     protected virtual Icon myExtractIcon(string FileName,int iIndex)
      {
       try
       {
        IntPtr hIcon=(IntPtr)ExtractIcon(this.Handle,FileName,iIndex);
       if(! hIcon.Equals(null))
        {
         Icon icon=Icon.FromHandle(hIcon);
         return icon;
        }
       }
       catch(Exception ex)
       { MessageBox.Show(ex.Message,"1错误提示",0,MessageBoxIcon.Error);}
       return null;
      }

    用if(hIcon != System.IntPtr.Zero) 替换 if(! hIcon.Equals(null))  无作用。

    2007年4月4日16时,忙了一天总算是把异常给处理掉了。辛苦,迷茫,以及解决问题后的兴奋,这或许就是程序员可生活吧,也是我们的追求与职业快乐吧。好了。闲话少说了,我最近越来越唠叨了。
    在项目中添加如下代码:

     //we need this function to release the unmanaged resource,
      //the unmanaged resource will be
      //copies to a managed one and it will be returned.
      [DllImport("user32.dll", CharSet = CharSet.Auto)]
       public extern static bool DestroyIcon(IntPtr handle); 

    /// <summary>
      /// 设置图标,把得到的图标放入一个ImageList
      /// </summary>
      /// <param name="imageList">ImageList,可以new一个</param>
      /// <param name="FileName">文件名</param>
      /// <param name="tf"></param>
      protected virtual void SetIcon(ImageList imageList,string FileName,bool tf)
      {
            ……
           Icon ic=Icon.FromHandle(fi.hIcon);
          imageList.Images.Add(ic);  //添加到ImageList,可放图标和图片,只做一个转换用
          DestroyIcon(fi.hIcon); // Cleanup
       
        else
       {
           ……
          Icon ic=Icon.FromHandle(fi.hIcon);
          imageList.Images.Add(ic);  
          DestroyIcon(fi.hIcon); // Cleanup
        }
        }
        ……  
    }

    因使用ExtractIcon(),You must destroy the icon handle returned by ExtractIcon by calling the DestroyIcon function.
    故添加了一个DestroyIcon 函数,它以前一般用于“销毁一个图标,释放这个图标占用的内存”。我觉得在一个图标被获得以后就立即这样做(销毁图标)真是个好主意(因为这个类将以各种各样不同地方式使用)。一旦需要GC就清理掉这个图标,或者被存于一个ImageList

    参考资料:
    ExtractIcon
    http://msdn2.microsoft.com/en-us/library/ms648068.aspx
    BOOL DestroyIcon(HICON hIcon); 
    http://msdn2.microsoft.com/en-us/library/ms648063.aspx

    http://www.codeproject.com/上的
    Obtaining (and managing) file and folder icons using SHGetFileInfo in C#  

  • 相关阅读:
    Redis的高级应用——数据安全
    [转]C#多线程和线程池
    详解从面向接口编程到依赖注入
    Java Servlet 配置
    Java Servlet 3.0 新特性
    [转]C#中的委托和事件
    iReport5.6.0使用说明
    Visual Studio 2015 官方下载及密钥
    Java Swing 托盘闪烁Demo实例
    Win7 利用批处理文件结束进程
  • 原文地址:https://www.cnblogs.com/flashicp/p/696692.html
Copyright © 2011-2022 走看看