65.9K
CodeProject 正在变化。 阅读更多。
Home

Iconits

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (72投票s)

2006年4月12日

2分钟阅读

viewsIcon

221780

downloadIcon

3568

一个图标控件,当鼠标悬停在其上时会缩放和淡入,如果您的应用程序使用图标而不是按钮,这将创建有趣的视觉效果。

Sample Image

引言

对于使用图标而不是按钮的应用程序,可能需要添加一些花哨的效果,而不仅仅是显示一个上升的图标(当悬停时)。此控件为您提供了一个有趣的视觉效果,使图标在鼠标悬停在其上时放大。此外,还有一个 Blur 属性,它会导致图标被渲染为透明(无需一行代码!);当然,您可以关闭它。

用法

您可以通过以下两个简单的步骤开始使用此控件

  1. 将控件添加到工具箱(如果您不知道如何操作,请右键单击工具箱,选择添加/删除项,找到Iconits.dll,然后按确定)。
  2. 现在您已经在工具箱中看到了该控件 (Iconits),您可以开始使用它了。但是,这些属性至关重要
    属性名 类型 描述
    失去焦点 布尔值 如果您想要透明效果,设置为 true,否则设置为 false
    图标 Bitmap 从任何可用的图像设置图标。
    IconSize 大小 图标的初始大小。
    大小 大小 鼠标悬停在其上时,图标的实际大小。
    TooltipText 字符串 鼠标悬停在其上几秒钟时弹出的图标的工具提示文本。

Alpha 类

图像变得稍微透明的技巧是通过创建三个额外的位图而不是原始图像来完成的。这些额外的位图具有不同的不透明度(0.25、0.5、0.75),将使图标稍微淡化。

生成位图而不是直接渲染的想法当然是速度。 另一个原因是,只需要三个图像,这并不多。 因此,我们开发了一个类,该类从可用的图像生成具有不同不透明度级别的新位图

public static Bitmap returnAlpha(Bitmap bmp, int alpha)
{
    Color col; 
    Bitmap bmp2=new Bitmap(bmp);
    
    for (int i=0;i<bmp.Width;i++)
          for (int j=0;j<bmp.Height;j++) 
          {
            col=bmp.GetPixel(i,j); 
            if (col.A>0)
                bmp2.SetPixel(i,j,Color.FromArgb(min(
                       col.A-alpha),col.R,col.G,col.B)); 
          } 
      return bmp2;
}

它只是遍历图像并以新的透明度级别重绘图像,当然,您不需要重绘已经透明的像素 (Alpha=0)。

优化问题

当您开发此类采用大量计算的控件时,优化是一个关键问题。 在这种情况下,问题是速度和图像闪烁,因为使用了 GDI+ 的 DrawImage。 实现了双缓冲,以便平滑地显示动画。 另一个问题,速度慢,只有在您直接渲染透明图像时才会发生。 我们为此构建额外的位图,这会导致另一个缺点,即使用额外的内存。

历史

  • v0.1(2006 年 4 月 9 日):初始版本。

    实现了 Alpha 透明度,以及鼠标悬停时的缩放。

© . All rights reserved.