2017-09-26 9 views
0

フォームの右下に小さいロゴを設定して、フェードイン/フェードアウトするプリセット速度で、フェードあたり約6秒。私はいくつかの異なる方法を試しましたが、最初のタイマーが終了したら再びフェードインすることはできません。ここでは、2つのタイマーとそれぞれのティックメソッドのための私のコードです。2番目のtimer.Start()は最初のタイマーの目盛りによって起動されていません

EDIT今すぐ含まれているタイマの宣言。

 Timer fade = new Timer(); 
     Timer fade2 = new Timer(); 


       fade.Interval = (200); 
       fade.Tick += new EventHandler(fade_Tick); 


       fade2.Interval = (200); 
       fade2.Tick += new EventHandler(fade_Tick_Two); 

       fade.Start(); 

private void fade_Tick(object sender, EventArgs e) 
     { 
      if (alpha < 255) 
      { 
       image = picboxPic.Image; 
       using (Graphics g = Graphics.FromImage(image)) 
       { 
        Pen pen = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width); 
        g.DrawLine(pen, -1, -1, image.Width, image.Height); 
        g.Save(); 
       } 
       picboxPic.Image = image; 
       this.Invalidate(); 
       alpha++; 
      } 
      else 
      { 
       fade.Stop(); 
       fade2.Start(); 
      } 


     } 
private void fade_Tick_Two(object sender, EventArgs e) 
     { 

      if (alpha > 0) 
      { 
       image = picboxPic.Image; 
       using (Graphics g = Graphics.FromImage(image)) 
       { 
        Pen pen = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width); 
        g.DrawLine(pen, -1, -1, image.Width, image.Height); 
        g.Save(); 
       } 
       picboxPic.Image = image; 
       this.Invalidate(); 
       alpha--; 
      } 
      else 
      { 
       fade2.Stop(); 
       fade.Start(); 
      } 

     } 

2番目のタイマーが開始されない理由は何ですか?ブレークポイントを使用しましたが、アルファレベルは255に達しましたが、2回目のTickイベントはトリガーされません。

+0

fade2とfade2の宣言を含めることができますか? – Marisa

+0

編集済み@Marisa :) –

+1

コードを新しいプロジェクトフォームにコピーして、すべての画像操作をコメントアウトして実行しました。アルファ値が255に達した後、完全にfade_Tick_Twoをヒットします。 – rs232

答えて

1

私は私のために作品を引用し、リンクに記載された方法:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     test(); 
    } 
    System.Timers.Timer fade = new System.Timers.Timer(50); 
    System.Timers.Timer fade2 = new System.Timers.Timer(50); 
    Image originalImage = Image.FromFile(@"D:\kevin\Pictures\odds&Sods\kitchener.jpg"); 

    int alpha = 100; 

    void test() 
    { 
     fade.Elapsed +=new System.Timers.ElapsedEventHandler(fade_Tick); 
     fade2.Elapsed+=new System.Timers.ElapsedEventHandler(fade_Tick_Two); 
     fade.Start(); 

    } 
    delegate void timerDelegate(object sender, EventArgs e); 
    private void fade_Tick(object sender, EventArgs e) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new timerDelegate(fade_Tick), sender, e); 
      return; 
     } 
     if (alpha >= 0) 
     { 
      picboxPic.Image = SetImgOpacity(originalImage, alphaToOpacity(alpha)); 
      picboxPic.Invalidate(); 
      alpha--; 
     } 
     if (alpha < 0) 
     { 
      alpha = 0; 
      fade.Stop(); 
      fade2.Start(); 
     } 
    } 
    private void fade_Tick_Two(object sender, EventArgs e) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new timerDelegate(fade_Tick_Two), sender, e); 
      return; 
     } 
     if (alpha <= 100) 
     { 
      picboxPic.Image = SetImgOpacity(originalImage, alphaToOpacity(alpha)); 
      picboxPic.Invalidate(); 
      alpha++; 
     } 
     if (alpha > 100) 
     { 
      alpha = 100; 
      fade2.Stop(); 
      fade.Start(); 
     } 
    } 

    float alphaToOpacity(int alpha) 
    { 
     if (alpha == 0) 
      return 0.0f; 

     return (float)alpha/100.0f; 
    } 

    //Setting the opacity of the image 
    public static Image SetImgOpacity(Image imgPic, float imgOpac) 
    { 
     Bitmap bmpPic = new Bitmap(imgPic.Width, imgPic.Height); 
     Graphics gfxPic = Graphics.FromImage(bmpPic); 

     ColorMatrix cmxPic = new ColorMatrix(); 
     cmxPic.Matrix33 = imgOpac; 
     ImageAttributes iaPic = new ImageAttributes(); 
     iaPic.SetColorMatrix(cmxPic, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 
     gfxPic.DrawImage(imgPic, new Rectangle(0, 0, bmpPic.Width, bmpPic.Height), 0, 0, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, iaPic); 
     gfxPic.Dispose(); 

     return bmpPic; 
    } 
} 

コードは少し、粗であり、あなたは、フォームを閉じるときにdisposeの世話をする必要がありますが、それはアップフェードと残りの部分を簡単に処理することができます。私は、余分なものを短時間でテストすることができました.-

+0

これは素晴らしい@KevinFord、100万人のおかげです。 –

+1

私の解決策ではありませんが、あなたは大歓迎です! @Venkatesh Appalaと[@ RaviRanjanKr over Codeproject]にお礼を言います(http://www.codeproject.com/Tips/201129/Change-Opacity-of-Image-in-C) –

+1

[あなたは参照はアップアップに答える](https://stackoverflow.com/questions/4779027/changing-the-opacity-of-a-bitmap-image) - 私はすでにそうしています。 –

関連する問題