关联图标图像控件

分享于 

9分钟阅读

Web开发

  繁體

介绍

这里自定义服务器控件显示当前与给定文件扩展名关联的icon。 文件 icon 关联由操作系统保存,并且可以通过单个 WIN32 API调用进行检索。

如果只需要显示已知文件 icon,或者希望显示任何文件列表以显示相应的图标,那么就使用这个控件。

使用代码

本文下载包含一个示例 ASP.NET 应用程序的VS.NET 2003项目。 这个应用程序包含两个保存代码重要部分的文件。 这些文件是 AssociatedIcon.cs 和 IconExtractor.cs.

我想建议你使用自己的Visual Studio. NET 来创建一个名为AssociatedIcons的C# ASP.NET 项目,而不是从压缩文件提取整个项目。 将两个文件夹添加到应用程序。控件和IconStubs中。 Delete 默认的Webform1.aspx 文件并添加一个名为TestPage的新的WebForm。

要保存一些主要的输入时间,只需获取文件 IconExtractor.cs 并将它的放在项目的控制文件夹中。 在同一控件文件夹中添加名为 AssociatedIcon的新类。 此类将成为我们的自定义控件。

毕竟,你的项目应该像下面的图片:

将下面的代码添加到你刚创建的AssociatedIcon.cs 文件中:

using System;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.ComponentModel;namespace AssociatedIcons.Controls
{
 [ToolboxData("<{0}:AssociatedIcon 
 runat="server"></{0}:AssociatedIcon>")]
 publicclass AssociatedIcon : Image
 {
 /*****
 * This control accepts a file name or file extension,
 * determines the associated icon, and displays it on the page
 * ***////<summary>/// Gets or sets a file name or extension (including the dot)/// to display the associated icon///</summary>publicstring ExtensionOrFile
 {
 get {
 string s = (string)ViewState["ExtensionOrFile"];
 if(s == null) return"";
 return s;
 } 
 set{ ViewState["ExtensionOrFile"] = value; } 
 }
 ///<summary>/// Determines if the icon size will be 16x16 or 32x32 pixels///</summary>publicbool LargeIcon
 {
 get {
 object obj = ViewState["LargeIcon"];
 if(obj == null) returnfalse;
 return (bool)obj;
 } 
 set {
 ViewState["LargeIcon"] = value;
 }
 }
 publicoverridestring ImageUrl
 {
 get{ returnbase.ImageUrl;}
 set{ thrownew 
 InvalidOperationException("The ImageUrl cannot be set.");}
 }
 protectedoverridevoid OnLoad(EventArgs e)
 {
 if(!Page.IsPostBack)
 base.ImageUrl = 
 IconExtractor.GetUrlToIcon(ExtensionOrFile, LargeIcon);
 }
 }
}

因为我们将在IconStubs文件夹中写入文件,所以你需要向该文件夹中的tftp用户提供写权限。 如果你以前从未这么做过这个过程很简单。 在任何 Windows Explorer 窗口中,找到IconStubs文件夹,右键单击它并选择。 转到安全选项卡。 如果选中允许继承的权限 [...] 复选框,则取消选中它。 使用添加按钮将ASPNET用户添加到 List ( 如果还不在那里的话)。 在 List 中的ASPNET用户中,选择它并只选择权限 List 中的Write写 checkbox。 查看下面的图片之后,单击 ok and然后你就可以完成。

这里控件的工作方式

正如你从上面的代码中看到的,我们的控件是 System.Web.UI.WebControls.Image 服务器控件的简单扩展。 为了保存想要的文件扩展名,另外还添加了一个属性来指定所需的文件扩展名是否为小的( 16 x 16像素) 或者大的( 32 x 32像素) 版本。 我们也直接禁止 ImageUrl 属性的设置,这样就不会在无意中改变它。

你也可以注意到,这个控制代码中没有太多的内容。 流程真正的肉是由 IconExtractor 类实现的。

IconExtractor类

icon 提取过程的核心部分是对 SHGetFileInfo Shell32 Windows API的调用。 这个API除了其他东西外,还提供了有关给定文件的相关 icon ( 小型或者大型)的句柄。 之后,代码将 icon 保存为PNG图像,并在IconStubs文件夹中具有透明背景。 下次请求相同扩展 icon 时,将返回已经存在映像文件的URL,而不会创建任何新文件。 一段时间后,你应该得到你的IconStubs文件夹满足所有图标所使用的图标,如下所示:

注:IE ( 至少是我拥有的版本: 6.0.280 0.110 6在透明PNG渲染中存在缺陷,导致透明区域呈现灰色。 这些代码包含一些注释,帮助你将实现从PNG更改为 GIF,从而丢失透明背景。

注意:GIF图像中透明背景的实现太复杂了。 因为我决定不包含不安全的代码块,所以我决定不把它包含在这个示例中,因为简单的( 如果你想让我这么诚实的话)。

测试驱动程序

为了了解控件的工作原理,让我们首先在 TestPage.aspx. 中放置一些内容,让我们在 Controls 命名空间中 register。 将以下内容添加到页的ASPX顶部:

<%@RegisterTagprefix="SP"Namespace="AssociatedIcons.Controls"Assembly="AssociatedIcons"%>

现在,让我们在页面中添加控件的一些实例,如下所示:

<formid="TestPage"method="post"runat="server"><br><SP:AssociatedIconid="file1"runat="server"ExtensionOrFile=".doc"largeIcon="True"/> MyDocument.doc
 <br><SP:AssociatedIconid="file2"runat="server"ExtensionOrFile="file.bmp"largeIcon="false"/> MyIcon.bmp
 <br><SP:AssociatedIconid="Associatedicon1"runat="server"ExtensionOrFile="file.jpg"largeIcon="true"/> MyIcon.jpg
 <br><SP:AssociatedIconid="Associatedicon2"runat="server"ExtensionOrFile="file.gif"largeIcon="false"/> MyIcon.gif
 <br><SP:AssociatedIconid="Associatedicon3"runat="server"ExtensionOrFile="file.mp3"largeIcon="true"/> MyIcon.mp3
 <br><asp:ButtonID=test Runat="server"Text=test /></form>

保存。编译和运行这里页面时,你应该看到类似下面的图片。 图标可能因你与文件扩展名相关联的程序而不同。

增强建议

任何示例一样,本文中的代码远远不适合新的或者增强的特性( 也许这里也有几个 Bug )的机会。 对此代码的增强所想到的一些想法是:

  • 使用配置值确定 icon 映像文件的物理路径和虚拟路径。 这样,你可以在多个应用程序中使用该控件,并共享相同的图标集,从同一个文件夹。
  • 在GIF中实现背景透明。 更改代码以生成gif而不是 PNG ( 虽然 IE 没有得到透明的PNG Bug 固定),使背景颜色透明。 下面是两个可以帮助你使用的不错的参考: 使用 GDI+的透明背景,由 powell ( 新闻组帖子) 和 powell GDI+ FAQ的Bob提供。

引用

历史记录

  • 29th 2005 - 代码已经提交。

控制  图像  ICO  icon  图标  associate  
相关文章