C#のGraphicsクラスについてです。
C#のGraphicsクラスを用いて画像をフェードインで表示させよとしています。
まず以下のコードをごらんください。
ただ、フェードインで画像は表示されるものの、フォームの操作が一切できなくなってしまいます。
そのためマルチスレッドにしようとしたのですが
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;
using System.Web;
using System.Net;
using System.Text;
using System.Threading;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Diagnostics;
public class MainClass{
public static void Main(string [] args){
NewForm formObj = new NewForm();
Application .Run(formObj);
}
}
public class NewForm : Form {
//インスタンス変数の宣言
public Graphics g ;
public Bitmap mapObj ;
public Image imageObj;
public ImageAttributes ia;
public ColorMatrix cm;
public Thread th ;
public ParameterizedThreadStart ts;
public PaintEventArgs e;
public Rectangle rec;
public int flag = 0;
public delegate void TestDelegate();
public TestDelegate deleObj;
public NewForm(){
Button buttonObj = new Button();
buttonObj.Width=100;
buttonObj.Height = 30;
//フェードさせるためのイベント発行用ボタンの設置
buttonObj.Click += new EventHandler(this.SetMethod);
this.Controls.Add(buttonObj);
}
public void SetMethod(object sender , EventArgs e){
this.Paint += new PaintEventHandler(this.ThreadMethod);
//フォームコントロールの再描画を促す
this.Invalidate();
}
public void ThreadMethod(object sender ,PaintEventArgs eventObj){
this.ts = new ParameterizedThreadStart(this.ThreadRenderMethod);
this.th = new Thread(this.ts);
this.th.Start(eventObj);
MessageBox.Show("ThreadMethod実行後");
MessageBox.Show(InvokeRequired.ToString());
this.th.Join();
}
public void ThreadRenderMethod(object paintObj){
MessageBox.Show(InvokeRequired.ToString());
this.deleObj =delegate(){
//無現ループしてしまうので、再描画イベント後イベントハンドラーを削除
this.Paint -= new PaintEventHandler(this.ThreadMethod);
PaintEventArgs e = (PaintEventArgs)paintObj;
try{
Console.WriteLine("paint メソッド発生");
this. g = e.Graphics;
this.mapObj = new Bitmap(this.Width,this.Height);
this.imageObj = Image.FromFile("C:\\c#\\test.jpg");
//this.g = Graphics.FromImage(this.mapObj);
this.cm = new ColorMatrix();
this.cm.Matrix00 = 1;
this.cm.Matrix11 = 1;
this.cm.Matrix22 = 1;
this.cm.Matrix33 = 0.0F;
this.cm.Matrix44 = 1;
this.ia = new ImageAttributes();
this.ia.SetColorMatrix(this.cm);
this.rec = new Rectangle(0, 0, this.Width, this.Height);
this.g.DrawImage(this.imageObj,rec,0,0,this.imageObj.Width,imageObj.Height,GraphicsUnit.Pixel,this.ia);
this.BackgroundImage = mapObj;
for(double i = 0.0; i <= 1.0; i = i + 0.001){
this.cm.Matrix33 = (float) i;
this.ia.SetColorMatrix(this.cm);
this.g.DrawImage(this.imageObj,rec,0,0,this.imageObj.Width,imageObj.Height,GraphicsUnit.Pixel,this.ia);
this.BackgroundImage = this.mapObj;
Thread.Sleep(100);
}
//this.imageObj.Dispose();
//this.g.Dispose();
}catch(Exception ex){
Console.WriteLine(ex.ToString());
}
Console.WriteLine("paint end");
};
this.deleObj();
//this.Invoke(this.deleObj);
this.BackgroundImage = Image.FromFile("C:\\c#\\test.jpg");
}
}
上記コードでも、フェードは動作するものの、やはりフォームの操作ができなくなります。
どう対処したらよいでしょうか?
識者の方、よろしくご教授ください
お願いいたします