Переключение изображений в Windows Forms - PullRequest
1 голос
/ 27 июля 2011

У меня есть 3 картинки, каждая из которых имеет цветной круг. 3 изображения - красный, зеленый и желтый.

Я помещаю это в PictureBox в форме окон. Я хочу переключить эти изображения с зеленого на желтый или красный или иным образом.

Могу ли я заставить их исчезать друг с другом, вместо того, чтобы переключать их обычным способом?

Я знаю, что это можно легко сделать с помощью flash / j-запроса, но мне было интересно, как далеко я могу достичь.

Нечто подобное в формах Windows, использующих обычную функциональность форм Windows.

Примечание: я использую .net framework 4 и формы Windows.

Ответы [ 3 ]

5 голосов
/ 27 июля 2011

См. Переход изображений в Windows Forms Picture box .Существует решение, которое перемещает изображения с помощью таймера на этой странице.

Код с сайта:

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 голос
/ 27 июля 2011

Как и то, что предложил @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;
    }

}
1 голос
/ 27 июля 2011

Я не знаю, хорошая ли это идея, но я бы выбрал 2 блока изображений: один для постепенного увеличения, другой для постепенного исчезновения и изменения альфа, когда пройдет время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...