「<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;

        }

 

    }
}


さいごに


本ページの内容説明については、元ページを参照して下さい。