zjh2785 发表于 2018-8-24 14:51:45

求助:有什么方法直接获取CAD自带的图标呢?

CAD自带的图标有很多,有的时候可以用的上,有没有什么方法可以根据图像的名字直接获取指定的图标呢?

一直找不到CAD自带图标是放在哪个文件夹。



红黑墨水 发表于 2018-9-16 20:20:32

楼主找到方法了吗?

j15tty 发表于 2018-9-17 21:51:17

直接编辑,然后输出就可以了

zjh2785 发表于 2018-9-26 16:32:11

j15tty 发表于 2018-9-17 21:51
直接编辑,然后输出就可以了

谢谢 ,不过我是想要在程序运行的过程中直接获取图标, 目前已经找到一个方法。可以获取部分图标。其他图标不知道存在于哪个DLL文件里面

zjh2785 发表于 2018-9-26 16:40:23

本帖最后由 zjh2785 于 2018-9-26 16:41 编辑

红黑墨水 发表于 2018-9-16 20:20
楼主找到方法了吗?
找到了 只是只可以找出部分 ,在CAD安装目录下有一些文件名包含“res”特定名称的dll存在图标, 比如:xxxxres.dll有很多 ,可以一一尝试, 以下代码仅供参考:
      /// <summary>
      /// 获取文件中的图标
      /// </summary>
      /// <param name="fileName">dll或者exe文件名,如果在CAD安装目录、系统目录或是其他支持的目录</param>
      /// <param name="iconIndex">图标索引 起始值为0</param>
      /// <param name="size">图标尺寸 64x64 32x32 16x16 都可以 int型64代表64x64,也可以在函数内自己设定不等边尺寸</param>
      /// <returns></returns>
      public System.Drawing.Icon GetIcon(string fileName, int iconIndex, Size size)
      {
            try
            {
                var iconTotalCount = PrivateExtractIcons(fileName, 0, 0, 0, null, null, 0, 0);
                if (iconTotalCount > 0 && iconIndex <= iconTotalCount)
                {
                  IntPtr[] hIcons = new IntPtr;
                  int[] ids = new int;
                  var successCount = PrivateExtractIcons(fileName, iconIndex, size.Width, size.Height, hIcons, ids, 1, 0);
                  if (successCount > 0 && hIcons != IntPtr.Zero)
                  {
                        System.Drawing.Icon result = System.Drawing.Icon.FromHandle(hIcons);
                        return result;
                  }
                }
                return null;
            }
            catch
            {
                return null;
            }
      }
      
      public static extern int PrivateExtractIcons(
            string lpszFile, //file name
            int nIconIndex,//The zero-based index of the first icon to extract.
            int cxIcon,      //The horizontal icon size wanted.
            int cyIcon,      //The vertical icon size wanted.
            IntPtr[] phicon, //(out) A pointer to the returned array of icon handles.
            int[] piconid,   //(out) A pointer to a returned resource identifier.
            int nIcons,      //The number of icons to extract from the file. Only valid when *.exe and *.dll
            int flags      //Specifies flags that control this function.
      );

测试代码:
      private void button1_Click(object sender, EventArgs e)
      {
            try
            {
                System.Drawing.Size size = new Size();
                size.Width = Convert.ToInt32(numericUpDown1.Value);
                size.Height = size.Width;
                pictureBox1.Image = GetIcon(this.textBox1.Text, int.Parse(textBox2.Text), size).ToBitmap();
            }
            catch
            { }
      }

j15tty 发表于 2018-9-26 20:38:25

楼主研究的真深

ps122hb 发表于 2018-9-27 10:54:44

zjh2785 发表于 2018-9-26 16:40
找到了 只是只可以找出部分 ,在CAD安装目录下有一些文件名包含“res”特定名称的dll存在图标, 比如: ...

好厉害,试着保存了一下,图标比较模糊,有什么解决办法吗

zjh2785 发表于 2018-9-27 11:17:41

ps122hb 发表于 2018-9-27 10:54
好厉害,试着保存了一下,图标比较模糊,有什么解决办法吗

有些dll立面的文件本身就是16x16的你用64x64的输出肯定会模糊

ps122hb 发表于 2018-9-28 08:24:56

zjh2785 发表于 2018-9-27 11:17
有些dll立面的文件本身就是16x16的你用64x64的输出肯定会模糊

就是选的16X16也模糊,找了个工具导出效果还不错
页: [1]
查看完整版本: 求助:有什么方法直接获取CAD自带的图标呢?