質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • C#

    9008questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

【C# Wiimote】電子黒板プログラム作成、デリケードについて

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 916

Gluek731

score 18

前回に電子黒板システムの実装を試み、取れないバグがあったので質問させてもらった者です。
今回はコーディングについて悩みがあったので質問させていただきます。

キャリブレーションをフォーム内のボタンを押した際に処理を行うようにしたいのですが、関数の引数の欄に専用のライブラリ(WiimoteState)を追加してビルドすると「デリゲート 'System.EventHandler' に一致する 'button4_Click' のオーバーロードはありません。」と言うメッセージを吐いてきます。

キャリブレーションの仕組みとしては以下の通りです

  1. 左上に照準を描画する
  2. 赤外線を感知した際にその位置を記録する
  3. 描画した照準を消し、今度は右上に描画
  4. 2と同じ
  5. 3と同じく、今度は左下に描画 
  6. 2と同じ
  7. 3と同じく、今度は右下に描画
  8. 2と同じ

この処理は赤外線を感知し、その値を格納する関数を持つ専用のライブラリが必要です。そのライブラリを何とかそのボタンの関数に渡したいのですが、何かいい方法は無いでしょうか。

分かる方が居ましたらご回答お願いします。

ソースコード

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;
using WiimoteLib;       //ライブラリの使用を宣言

namespace WiimoteLib01
{
    public partial class Form1 : Form
    {
        Wiimote wm = new Wiimote();         //クラスを作成
        System.Drawing.Point ScreenSize;    //画面サイズ格納
        Boolean isConnected = false;        //Wiimoteの接続判定
        public Form1()
        {

            InitializeComponent();
            //他スレッドからコントロールの許可
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        //WiiRemoteの状態が変化した時に呼ばれる関数
        #region
        void wm_WiimoteChanged(object sender, WiimoteChangedEventArgs args)
        {
            if (isConnected == true)
            {
                WiimoteState ws = args.WiimoteState;
                Calibration(ws);
                DrawForms(ws);
                IR_Cursor(ws);
                Events(ws);
                EffectsOut(ws);
            }
            else
            {
                this.wm.SetLEDs(0);
                this.wm.SetRumble(false);
                this.wm.Disconnect();
                this.wm.Dispose();
            }
        }//wm_WiimoteChanged
        #endregion
        //ボタンイベント
        #region
        public void Events(WiimoteState ws)
        {

        }//Events
        #endregion
        //赤外線マウス移動
        #region
        public void IR_Cursor(WiimoteState ws)
        {
            //スクリーンの大きさ
            ScreenSize.X = Screen.PrimaryScreen.Bounds.Width;
            ScreenSize.Y = Screen.PrimaryScreen.Bounds.Height;
            float Ix1 = 0.5f, Iy1 = 0.5f, Ix0 = 0.5f, Iy0 = 0.5f;
            float Ix, Iy;
            int px, py;
            if (ws.IRState.IRSensors[0].Found)
            {
                Ix1 = ws.IRState.IRSensors[1].Position.X;
                Iy1 = ws.IRState.IRSensors[1].Position.Y;
                Ix0 = ws.IRState.IRSensors[0].Position.X;
                Iy0 = ws.IRState.IRSensors[0].Position.Y;
                if (Ix1 < Ix0)
                {
                    Ix0 = Ix1; Iy0 = Iy1;
                    Ix1 = ws.IRState.IRSensors[0].Position.X;
                    Iy1 = ws.IRState.IRSensors[0].Position.Y;
                }
                Ix = Ix0; Iy = Iy0;
                px = (int)(ScreenSize.X * (1 - Ix));
                py = (int)(Iy * ScreenSize.Y);
                System.Windows.Forms.Cursor.Position = new System.Drawing.Point(px, py);
            }
        }//IR_Cursor
        #endregion
        //接続が押されたら
        #region
        private void button1_Click(object sender, EventArgs e)
        {
            if (this.isConnected == false)
            {
                this.wm = new Wiimote();
                this.wm.Connect();
                this.wm.SetReportType(InputReport.IRAccel, true);
                this.wm.SetLEDs(0);
                this.wm.SetRumble(false);
                this.button1.Enabled = false;
                this.button2.Enabled = true;
                this.wm.WiimoteChanged += wm_WiimoteChanged;
                this.isConnected = true;

            }
        }//button1_Click
        #endregion
        //切断が押されたら
        #region
        private void button2_Click(object sender, EventArgs e)
        {
            if (this.isConnected == true)
            {
                this.wm.WiimoteChanged -= wm_WiimoteChanged;
                this.button1.Enabled = true;
                this.button2.Enabled = false;
                this.isConnected = false;
            }
        }//button2_Click
        #endregion
        //装飾
        #region
        public void EffectsOut(WiimoteState ws)
        {

        }//EffectsOut
        #endregion
        //フォーム描画関数
        #region
        private void DrawForms(WiimoteState ws)
        {
            //グラフィックス取得
            Graphics g = this.pictureBox1.CreateGraphics();
            g.Clear(Color.Black);
            //赤外線を発見したら
            if (ws.IRState.IRSensors[0].Found)
            {
                g.FillEllipse(Brushes.Red,
                    ws.IRState.IRSensors[0].Position.X * 256,
                    ws.IRState.IRSensors[0].Position.Y * 128, 5, 5);
                g.FillEllipse(Brushes.Blue,
                    ws.IRState.IRSensors[1].Position.X * 256,
                    ws.IRState.IRSensors[1].Position.Y * 128, 5, 5);
            }
            g.Dispose();//グラフィックスの解放
            label1.Text = "IR[0] " + ws.IRState.IRSensors[0].RawPosition.ToString()
                + "/nIR[1] " + ws.IRState.IRSensors[1].RawPosition.ToString();
        }//DrawForms
        #endregion

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {

        }

        //フルスクリーン表示にする処理
        #region
        private void button3_Click(object sender, EventArgs e)
        {
            //ウィンドウサイズが普通ならば
            if (this.WindowState == FormWindowState.Normal)
            {
                //大きくする
                this.FormBorderStyle = FormBorderStyle.None;
                this.WindowState = FormWindowState.Maximized;
            }
            else
            {
                //小さくする
                this.FormBorderStyle = FormBorderStyle.None;
                this.WindowState = FormWindowState.Normal;
            }

        }//button3_Click
        #endregion
        //キャリブレーションを行う処理
        #region
        public void Calibration(WiimoteState ws)
        {

            int i=1;
            //ウィンドウのサイズを格納する変数
            float X_Screen = 0;
            float Y_Screen = 0;

            //Imageオブジェクトの生成
            Bitmap canvas = new Bitmap(pictureBox2.Width, pictureBox2.Height);
            Bitmap canvas2 = new Bitmap(pictureBox3.Width, pictureBox3.Height);
            Bitmap canvas3 = new Bitmap(pictureBox4.Width, pictureBox4.Height);
            Bitmap canvas4 = new Bitmap(pictureBox5.Width, pictureBox5.Height);
            //ImageオブジェクトのGraphicオブジェクトを作成
            Graphics g = Graphics.FromImage(canvas);
            Graphics g2 = Graphics.FromImage(canvas2);
            Graphics g3 = Graphics.FromImage(canvas3);
            Graphics g4 = Graphics.FromImage(canvas4);
            //画像の読み込み
            Image img = Image.FromFile(@"C:\Users\Gluek\Documents\Visual Studio 2010\Projects\WiimoteLib01\WiimoteLib01\img\rticle.png");
            //cavasの座標に描画する
            g.DrawImage(img, 0, 0, 50, 50);
            g2.DrawImage(img, 0, 0, 50, 50);
            g3.DrawImage(img, 0, 0, 50, 50);
            g4.DrawImage(img, 0, 0, 50, 50);
            //gとimgのリソース解放
            //img.Dispose();
            g.Dispose();
            g2.Dispose();
            g3.Dispose();
            g4.Dispose();
            //キャリブレーションの処理(未完)
            pictureBox2.Image = canvas;
            while (i < 2)
            {
                if (ws.IRState.IRSensors[0].Found)
                {
                    pictureBox2.Image.Dispose();
                    pictureBox2.Image = null;
                    i = 2;
                }
            }
            i = 1;
            while (i < 2)
            {
                pictureBox5.Image = canvas4;
                if (ws.IRState.IRSensors[0].Found)
                {
                    pictureBox5.Image.Dispose();
                    pictureBox5.Image = null;
                    i = 2;
                }
            }
        }//Calibration
        #endregion
        //キャリブレーションを実行する処理
        #region
        private void button4_Click(object sender, EventArgs e, WiimoteState ws)//ここでエラーが出る
        {
            Calibration(ws);
        }
        #endregion
    }
}

回答よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

こんにちは。

sho_csさんの言う通り、イベントハンドラの宣言を変更しては行けません。
C#のフレームワークはprivate void button4_Click(object sender, EventArgs e)をリンクしようとするのですが、Gluek731さんが、private void button4_Click(object sender, EventArgs e, WiimoteState ws)と変更したため、見失ってます。

ところで、Form1の頭で定義しているWiimote wm = new Wiimote();の中にWiimoteStateが入っていませんか? もし、入っているなら、button4_Click()がCalibration()を呼び出す時、それを渡せばよい可能性があります。ドキュメントで確認してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

イベントを受けるメソッドの引数は定義されたものから変更することができません。
以下のブログの解説がわかりやすいかと思います。
[C#]イベントハンドラとはなんぞや – gomokulog

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    9008questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。