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

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

新規登録して質問してみよう
ただいま回答率
87.20%
C#

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

解決済

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

Gluek731
Gluek731

総合スコア0

C#

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

2回答

0評価

0クリップ

2478閲覧

投稿2016/02/09 10:18

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

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

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

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

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

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

###ソースコード

C#

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

C#

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