在Windows窗体中切换图像

时间:2011-07-27 11:20:48

标签: c# winforms .net-4.0

我有3张照片,每张照片都有一个彩色圆圈。这3张照片是红色,绿色和黄色。

我将它放在Windows窗体中的PictureBox中。我想将这些图像从绿色切换到黄色到红色或其他。

有什么我可以让它们相互淡化而不是以正常方式切换它们吗?

我知道这可以很容易地使用flash / j-query完成,但我想知道我能达到多远。

使用普通Windows窗体功能的Windows窗体中的类似内容。

注意:我正在使用.net框架4和Windows窗体。

3 个答案:

答案 0 :(得分:5)

Transition of images in Windows Forms Picture box。有一种解决方案可以使用this页面上的计时器转换图像。

网站代码:

public class BlendPanel : Panel 
{
   private Image mImg1;
   private Image mImg2;
   private float mBlend;
   public BlendPanel()
   {
      SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint |
        ControlStyles.OptimizedDoubleBuffer, true);
   }

   public Image Image1 
   {
      get { return mImg1; }
      set { mImg1 = value; Invalidate(); }
   }

   public Image Image2 
   {
      get { return mImg2; }
      set { mImg2 = value; Invalidate(); }
   }

   public float Blend 
   {
      get { return mBlend; }
      set { mBlend = value; Invalidate(); }
   }

   protected override void OnPaint(PaintEventArgs e)
   {
      if (mImg1 == null || mImg2 == null)
      {
         e.Graphics.FillRectangle(new SolidBrush(this.BackColor), 
            new Rectangle(0, 0, this.Width, this.Height));
      }
      else
      {
         Rectangle rc = new Rectangle(0, 0, this.Width, this.Height);
         ColorMatrix cm = new ColorMatrix();
         ImageAttributes ia = new ImageAttributes();
         cm.Matrix33 = mBlend;
         ia.SetColorMatrix(cm);
         e.Graphics.DrawImage(mImg2, rc, 0, 0, mImg2.Width, 
            mImg2.Height, GraphicsUnit.Pixel, ia);
         cm.Matrix33 = 1F - mBlend;
         ia.SetColorMatrix(cm);
         e.Graphics.DrawImage(mImg1, rc, 0, 0, mImg1.Width, 
            mImg1.Height, GraphicsUnit.Pixel, ia);
      }
      base.OnPaint(e);
   }
}

构建您的项目。您现在可以从工具箱顶部将BlendPanel放到表单上。这是一个使用它的示例程序:

namespace WindowsApplication1 
{
   public partial class Form1 : Form
   {
      private float mBlend;
      private int mDir = 1;
      public Form1()
      {
         InitializeComponent();
         timer1.Interval = 30;
         timer1.Tick += BlendTick;
         blendPanel1.Image1 = Bitmap.FromFile(@"c:\temp\test1.bmp");
         blendPanel1.Image2 = Bitmap.FromFile(@"c:\temp\test2.bmp");
         timer1.Enabled = true;
      }

      private void BlendTick(object sender, EventArgs e)
      {
         mBlend += mDir * 0.02F;
         if (mBlend < 0) { mBlend = 0; mDir = 1; }
         if (mBlend > 1) { mBlend = 1; mDir = -1; }
         blendPanel1.Blend = mBlend;
      }
   }
}

您需要修改Bitmap.FromFile()来电。建立并运行。您应该看到显示的图像从第一张图像平滑变换到第二张图像,没有任何闪烁。很多调整代码的方法都很有趣。

答案 1 :(得分:1)

我不知道这是不是一个好主意,但我会选择2个图像框,一个淡入,另一个淡出,并在时间流逝时更改alpha。

答案 2 :(得分:1)

就像@Igoris建议的那样,你需要使用两个相互重叠的控件,并且你应该定义一个计时器,这样当你想淡入或淡出时,启动计时器并在其刻度中减少透明度首先控制并在第二个上增加它...... ,问题是普通控件默认情况下不支持透明。所以你必须继承它并在这里应用透明是从TransparentPictureBox继承的自定义PictureBox

public class TransparentPictureBox : System.Windows.Forms.PictureBox
{
    /// <summary>
    /// Initialize new instance of this class.
    /// </summary>
    public TransparentPictureBox()
        : base()
    {
        DoubleBuffered = true;
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.UserPaint, true);

        this.BackColor = Color.Transparent;
    }

}