「<C#> マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」のコード No.7
<h2>*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*</h2>
<C#>
「マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」のコード No.7
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
.
元のページ
元ページ「<C#> マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」
http://note.chiebukuro.yahoo.co.jp/detail/n165465
記述量上限の制限で、ページを分けて記述しています。
本ページの前のページ
「マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」のコード No.6
http://note.chiebukuro.yahoo.co.jp/detail/n170414
記述量上限の制限で、ページを分けて記述しています。
はじめに
元ページの「<C#> マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」におけるコードをここに記述します。
Formクラスのコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう。
namespace DragThreadSimple1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// スレッドからテキストボックスをアクセスすることを指定
Control.CheckForIllegalCrossThreadCalls = false;
}
//============
// メンバー変数
// 要求電文処理受付クラス
private GraphicsAcceptanceThread GraphicsAcceptanceObj;
// 画像指定
private Image CharacterImg;
private void Form1_Load(object sender, EventArgs e)
{
// 画像指定
CharacterImg = new Bitmap("C:\キャラクター.bmp"); // キャラクター画像
// 要求電文処理受付クラスオブジェクトを生成
GraphicsAcceptanceObj = new GraphicsAcceptanceThread();
// 画像処理完了時イベントプロシージャとするメソッドの登録
GraphicsAcceptanceObj.MoveImageEvent += new GraphicsAcceptanceThread.MoveImageDelegate(Arithmetic1_FinishArithmetic);
// ログ関連情報伝達時のイベントプロシージャとするメソッドの登録
GraphicsAcceptanceObj.LogMessageEvent += new GraphicsAcceptanceThread.LogMessageMethodDelegate(Arithmetic1_LogMessage);
// コントロールの初期化
button1.Text = "受付開始";
button2.Text = "受付終了";
button3.Text = "一時中断";
button4.Text = "再開始";
label1.Text = "開始時は、「受付開始」ボタンをクリックして下さい。";
// ボタンの有効/無効の設定
button1.Enabled = true;
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
}
//============
// フォームクローズ時イベント
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// フォームを非表示にする。
// --- この後のアプリケーションソフトの終了処理(すなわち、本フ
// ォームの終了処理)では、少し時間がかかります。よって、ユ
// ーザーは、終了操作(「閉じる」ボタンのクリック)を既に行
// なっているのに、本フォームがなかなか閉じないことになりま
// す(終了処理に、時間がかかるので)。そして、そのようにフ
// ォームが閉じないと、ユーザーは、誤動作をしたのかと勘違い
// をしてしまいます。よって、そのような誤解を招かないように、
// 本フォームを非表示にしてから、終了関係の処理を行なうこと
// にします。
this.Visible = false;
// 要求電文処理受付クラスオブジェクトのリソース解放
// (受け付け用スレッドの終了などを行なう)
GraphicsAcceptanceObj.Dispose();
// 短時間だけ待機
// --- スレッドがメソッドを呼び出したタイミングでアプリケーショ
// ンソフトを終了すると、そのメソッドが処理し切れないで実行
// 時エラーになることがあります。すなわち、もう既に、該当メ
// ソッドの処理を実行し始めているのに、そのメソッドがアクセ
// スするコントロール等が破棄されている場合は、実行時エラー
// になります(なお、ここで言っているメソッドとは、イベント
// プロシージャ等のプログラミング上定義したメソッドだけでは
// なく、WindowsAPI等のシステム側が内部的に呼び出している機
// 能も含みます)。よって、上方の Dispose()メソッドでスレッ
// ドの終了をして、その後、下方の処理で短時間だけ待機します。
// そうすれば、既に実行を始めてしまったメソッドが終了してか
// ら、その後にアプリケーションソフトの終了処理(コントロー
// ル等の破棄)が行なわれます。その結果、前述の実行時エラー
// は発生しません。
System.Threading.Thread.Sleep(7000); // 短時間だけ待機
}
//============
// スレッド開始用ボタン
private void button1_Click(object sender, EventArgs e)
{
GraphicsAcceptanceObj.AcceptanceStart();
// ボタンの有効/無効の設定
button1.Enabled = false;
button2.Enabled = true;
button3.Enabled = true;
button4.Enabled = false;
}
//============
// スレッド終了用ボタン
private void button2_Click(object sender, EventArgs e)
{
GraphicsAcceptanceObj.AcceptanceEnd();
// ボタンの有効/無効の設定
button1.Enabled = true;
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
}
//============
// スレッド一時中断用ボタン
private void button3_Click(object sender, EventArgs e)
{
GraphicsAcceptanceObj.AcceptanceSuspend();
// ボタンの有効/無効の設定
button1.Enabled = false;
button2.Enabled = true;
button3.Enabled = false;
button4.Enabled = true;
}
//============
// スレッド再開始用ボタン
private void button4_Click(object sender, EventArgs e)
{
GraphicsAcceptanceObj.AcceptanceRestart();
// ボタンの有効/無効の設定
button1.Enabled = false;
button2.Enabled = true;
button3.Enabled = true;
button4.Enabled = false;
}
// ==============
// マウス移動時に実行されるイベントプロシージャ
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
// 左ボタン押下の場合
if (e.Button == MouseButtons.Left)
{
// 要求電文の生成
RequiredCall Required_Call = new RequiredCall();
// 要求電文のパラメーターを設定
Required_Call.ImageData = CharacterImg;
Required_Call.PositionX = e.X;
Required_Call.PositionY = e.Y;
Required_Call.BackgroundColor = Brushes.White;
Required_Call.BackgroundWidth = pictureBox1.ClientSize.Width;
Required_Call.BackgroundHeight = pictureBox1.ClientSize.Height;
// 画像処理機能の非同期呼び出し用メソッドを実行して、スレッドを開始。
// --- なお、処理結果は、イベントと言う形で返却されます。
GraphicsAcceptanceObj.InvokeRequest(Required_Call);
}
}
//============
// 画像処理終了時に起動するイベントプロシージャ
public void Arithmetic1_FinishArithmetic(object sender, RequiredCall Required_Call, System.Drawing.Image ans)
{
// ピクチャボックスに処理結果の画像を設定。
pictureBox1.Image = ans;
}
//============
// ログメッセージ発生時のイベントプロシージャ
public void Arithmetic1_LogMessage(object sender, string Log_Message)
{
// 結果表示
label1.Text = Log_Message;
}
}
}
さいごに
本ページの内容説明については、元ページを参照して下さい。