C#でピクチャボックスをクリックしたら・・・という動作ができない

このQ&Aのポイント
  • ピクチャボックスをクリックしたら・・・という動作ができません。C#でピクチャボックスをクリックしたらそのピクチャボックスの背景色を緑色に変える方法について教えてください。
  • C#でピクチャボックスをクリックした時に背景色を変える方法について教えてください。
  • C#のプログラムでピクチャボックスをクリックしたら背景色が変わるようにしたいです。どのように書けば良いでしょうか?
回答を見る
  • ベストアンサー

ピクチャボックスをクリックしたら・・・という動作

C#です ピクチャボックスをクリックしたら・・・という動作ができません・・・ 宣言等はこのようにしました for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko); map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; map[i, j].Click += new EventHandler(map_click);//マップをクリックした } } map_clickというメソッドにはどのようにかけばいいのでしょうか? そのピクチャボックスをクリックしたらそのピクチャボックスの背景色を緑色に変える という風に書きたいのですが・・・・

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

 こんばんは。参考程度に。   private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko);//用意する map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; //(2)を使用する為に必要 //http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.tag(v=VS.100).aspx map[i, j].Tag = Color.Green; map[i, j].Click += new EventHandler(map_click);//マップをクリックした this.Controls.Add(map[i, j]);//絶対に必要 } } }  以下3つのうちのどれか。  (1)緑色になるだけ。 private void map_click(object sender, EventArgs e) { ((Control)sender).BackColor = Color.Green; }  (2)緑色の状態で、もう一回押すと黒色に戻る。 private void map_click(object sender, EventArgs e) { Control ctl = sender as Control; Color cPrev = ctl.BackColor; ctl.BackColor = (Color)ctl.Tag; ctl.Tag = cPrev; } (3)最後に押されたものだけが緑色になる。 private void map_click(object sender, EventArgs e) { Control ctl = sender as Control; Control ctlPrev = this.Tag as Control; if (ctlPrev != ctl) { this.Tag = ctl; ctl.BackColor = Color.Green; if (ctlPrev != null) { ctlPrev.BackColor = Color.Black; } } }

その他の回答 (4)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

一つだけ#1の内容に誤りがあるので訂正しておきます。 > 「フォーカスが離れたら背景色を元に戻す」というイベント PictureBoxではフォーカス関連のイベントが使えない(=おそらくフォーカス移動そのものが発生しない)ので、「別のところがクリックされたら前回クリックされたところの背景色を戻す」という処理はmap_click内で実施する必要があります。 こちらは「まず全てのPictureBoxの背景色を戻して、クリックされたところだけ改めて緑にする」とすればよいでしょう。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

> 質問している意味を分かっていらっしゃいますか? もちろん。 ですから#1では必要な情報をきちんと出してますよ? 「ハンドラとして登録したメソッドの引数に、イベントを飛ばした(=今回の質問ではクリックされた)オブジェクトがobject型で渡されるからPictureBoxにダウンキャストして背景色をいじればよい」と。 もとの質問が > map_clickというメソッドにはどのようにかけばいいのでしょうか? だったのでmap_clickのプロトタイプはわかっているものとして書いてますが、そちらがわかっていないという事でしたらフォームデザイナの機能で適当なフォームにClickイベントを割り当ててみましょう。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

もとの質問のコードであれば2行で書ける程度のものですから「初心者」であることはコードを出すに足る理由ではないと判断します。 つーかたかが2行で済むコードなのですからまずは自力で頑張ってください。 「初心者」を脱却するには絶対に必要なことですので。

hisukoha117117
質問者

補足

質問している意味を分かっていらっしゃいますか? やってみてわからないから質問をしているのです

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

イベントハンドラの引数sender(Object型)にはそのイベントを投げた直接のオブジェクトが格納されています。 ですからsenderをPictureBox型にダウンキャストしてBackColorを変更すればOK。 ただし、おそらく「フォーカスが離れたら背景色を元に戻す」というイベントも追加しないとダメなんでは?

hisukoha117117
質問者

補足

C#初心者なんでソースをいただけると幸いです・・・

関連するQ&A

  • ラベルをピクチャボックスの上に表示させたい

    PictureBox[,] map = new PictureBox[27, 27]; private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko);//用意する map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; this.Controls.Add(map[i, j]);//設置 bom_map[i, j] = 0; } } } ピクチャボックスの場合↑のように記述すると25×25のマップができあがりました。 それぞれのピクチャボックスの上に数字を表示させたいのですがうまくできません ちなみに、この様にソースを書いてみました private System.Windows.Forms.Label[,] label; private void Form1_Load(object sender, EventArgs e) { this.label = new System.Windows.Forms.Label[27, 27]; for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { this.label[i, j] = new System.Windows.Forms.Label(); this.label[i, j].Size = new Size(tate, yoko); this.label[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5); this.label[i, j].Text = Convert.ToString(i * j); this.label[i, j].BackColor = Color.BlanchedAlmond; this.Controls.Add(this.label[i, j]); } } } ピクチャボックスと同じようにかぶせるのかな?と思い書いてみたんですが 何も表示されなくて困っています。 C#初心者なのでよろしくおねがいします。 }

  • 数字をピクチャボックスの上に表示させたい

    質問の内容を書いてくださいPictureBox[,] map = new PictureBox[27, 27]; private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko);//用意する map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; this.Controls.Add(map[i, j]);//設置 bom_map[i, j] = 0; } } } ピクチャボックスの場合↑のように記述すると25×25のマップができあがりました。 それぞれのピクチャボックスの上に数字を表示させたいのですがうまくできません ちなみに、この様にソースを書いてみました private System.Windows.Forms.Label[,] label; private void Form1_Load(object sender, EventArgs e) { this.label = new System.Windows.Forms.Label[27, 27]; for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { this.label[i, j] = new System.Windows.Forms.Label(); this.label[i, j].Size = new Size(tate, yoko); this.label[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5); this.label[i, j].Text = Convert.ToString(i * j); this.label[i, j].BackColor = Color.BlanchedAlmond; this.Controls.Add(this.label[i, j]); } } } ピクチャボックスと同じようにかぶせるのかな?と思い書いてみたんですが 何も表示されなくて困っています。 C#初心者なのでよろしくおねがいします。

  • Picture box の サイズを変更

    お世話になります。 VB6 でform1 上に Picture1 を貼付け ボタンを押すとPicture Boxのサイズを変更したいのですが 上手くサイズが変更されません。何か根本的な間違いでしょうか よろしくお願いします。 例: Yoko = 600 Tate = 480 Private Sub Command1_Click() With Picture1 .ScaleMode = 3 ' .Width = Yoko .Height = Tate End With End Sub

  • ピクチャボックスのクリックイベント

    ピクチャボックスのクリックイベント Visual C#でトランプゲームを作っているのですが this.PB = new System.Windows.Forms.PictureBox[54]; ↑のようにピクチャボックスの配列作ったのですが それぞれのクリックイベントを作りたいのですが、それがどうしても分かりません たとえばPB[30]がクリックされたらPB[30]の画像を他のピクチャボックスに移すなど このようなことをするにはどうすればいいですか?

  • 九九のプログラム

    public class kuku{ public static void main(String[] args){ int[][] hyou=new int[10][10]; System.out.print(" "); int i; int yoko; for(i=1;i<hyou.length;i++){ yoko=(int)(Math.random()*10); hyou[i][0]=yoko; System.out.print(" "+hyou[i][0]); } System.out.println(); int j; int tate; for(j=1;j<hyou[0].length;j++){ tate=(int)(Math.random()*10); masu[0][j]=tate; System.out.println(hyou[0][j]); }}} これを実行すると乱数がダブって表示されてしまうのですが、ダブらないようにし、appletで実行できるようにしたいのですがどのように直したらいいのでしょうか。どなたかアドバイスください。

  • C#でピクチャーボックスに文字を描画、出力する方法

    以下のことをやりたいのですが、できなくて困っています。 Microsoft Visual Studio 2010 Expressを使っています。 1、ピクチャーボックスに色画像を表示 2、ピクチャーボックスに文字(説明)も表示 3、その画像を出力 2まではできたのですが、2までできたあとに、プログラムのウインドウ上に他のウインドウ(マイコンピュータやマイドキュメントなど)が表示されたり、プログラムのウインドウを最小化したりして、一度隠れてしまうと文字が消えてしまうようで、画像のみの出力になってしまいました。(画像のみの出力には成功しています) なんとかして出力する方法はないでしょうか。 以下がソースです。よろしくお願いします。 ボタン1 Bitmap bmp6 = new Bitmap(800, 600); int sr, sg, sb, i, j; sr = 100; sg = 100; sb = 100; for (i = 0; i < 40; i++) { for (j = 0; j < 40; j++) { bmp6.SetPixel(i, j, Color.FromArgb(sr, sg, sb)); } pictureBox1.Image = bmp6; } ボタン2 string s1 = "文字"; Font newfont = new Font("MS明朝", 10); pictureBox1.CreateGraphics().DrawString(s1, newfont, Brushes.Blue, 50, 200); ボタン3 pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, 800, 600)); bmp.Save(c:\\a.png);

  • javaの配列部分ででエラーがでます。

    javaの配列部分ででエラーがでます。 マインスイーパを作っており爆弾の位置を決めるところでエラーの原因がわからず困っています。 9×9で、 ランダムでかぶらないように10個の爆弾を置くプログラムを作りたいです。 Random rnd=new Random(); int[][] mine=new int[8][8]; for(int i=0;i<=9;i++){ int yoko=(rnd.nextInt()>>>1)%9; int tate=(rnd.nextInt()>>>1)%9; if(mine[yoko][tate]!=10)mine[yoko][tate]=10; //爆弾があるところは10 else i--; } よろしくお願いします。

    • ベストアンサー
    • Java
  • 迷路作成のプログラミング

    迷路作成のプログラミングをC++で作ったのですが、エラーが出ます。 どのように直せば良いか教えてください。 エラー内容は 'randoomize': 識別子が見つかりませんでした。 16 進型定数には、少なくとも 1 桁の 16 進数が必要です。 'kbhit': 識別子が見つかりませんでした 'getch': 識別子が見つかりませんでした です、、お願いします。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define YOKO_MAX 200 #define ESC '\xlb' int n; int map[YOKO_MAX],count[YOKO_MAX]; int rr() { return rand() % 10>3; } void tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) if(map[i]!=map[i+1] && rr()) { k=map[i+1]; count[k]=0; for(j=0; j<n; j++) if(map[j]==k) { map[j]=map[i]; count[map[i]]++; } printf(" "); } else printf("■"); printf("■\n"); } void last_tate() { int i,j,k; printf("■"); for (i=0; i<n-1;i++) { if(map[i]==map[i+1]) printf("■"); else { k=map[i+1]; for (j=0; j<n; j++) if (map[j]==k) map[j]=map[i]; printf(" ",map[i]); } } printf("■\n"); } void yoko() { int i,j; for (i=0; i<n; i++) if (count[i]>1 && rr()) { printf("■■"); for(i=0; i<n; i++) { if (count[j]==0) { count[j]=1; count[map[i]]--; map[i]=j;break; } } } else { printf("■"); } printf("■\n"); } void enter() { int i,k; k=rand() % n; for (i=0; i<n; i++) if(i==k) { printf("■"); } else { printf("■■"); } printf("■\n"); } void initialize() { int i; for (i=0; i<n; i++) { map[i]=i; count[i]=1; } randoomize(); } int main() { printf("無限に大きな迷路\n"); do { printf("\n迷路の横幅(2~200)?"); scanf("%d",&n); } while (n<2||n>=YOKO_MAX); printf("\n ESCキーを押すと止まる。\n"); initialize(); enter(); do { tate(); yoko(); } while (!kbhit()||getch()!=ESC); last_tate(); enter(); }

  • javaの配列でエラーが出ます。

    javaの配列でエラーが出ます。 先ほどもjavaの配列で質問させていただいたんですが、 また同じようなところでエラーが出ました。。。 マインスイーパーを作ろうとしているんですが、 周りにある爆弾の数を数えるところでエラーが出ます。 たびたび頼ってばかりで申し訳ありません。 一応自分なりに考えたのを以下に。。 爆弾があるというのはmine[][]==10であらわしています。 //フィールド int[][] mine=new int[9][9]; Random rnd=new Random(); //スレッド public void run(){ //爆弾生成 int yoko,tate; for(int i=0;i<=9;i++){ yoko=(rnd.nextInt()>>>1)%9; tate=(rnd.nextInt()>>>1)%9; if(mine[yoko][tate]!=10)mine[yoko][tate]=10; else i-- } kazugime(); }//本当はこの後に描画のループが続きます。 //数を代入するメソッド public void kazugime(){ int kazu=0; for(int i=0;i<=8;i++){ for(int j=0;j<=8;j++){ kazu=0; if(mine[i][j]!=10){ //上の段 if(i>=1&&j>=1){if(mine[i-1][j-1]==10)kazu++;} if(i>=1){if(mine[i-1][j]==10)kazu++;} if(i>=1&&j<=7){if(mine[i-1][j+1]==10)kazu++;} //真ん中の段 if(j>=1){if(mine[i][j-1]==10)kazu++;} if(j<=7){if(mine[i][j+1]==10)kazu++;} //下の段 if(i<=7&&j>=1){if(mine[i+1][j+1]==10)kazu++;} if(i<=7){if(mine[i+1][j]==10)kazu++;} if(i<=7&&j<=7){if(mine[i+1][j+1]==10)kazu++;} mine[i][j]=kazu; } } } エラーは Uncaught exception java/lang/ArrayIndexOutOfBoundsException です。 足らない部分があればご指摘お願いします。 どうかよろしくお願いします。

    • ベストアンサー
    • Java
  • UNIXのCでのことなのですが

    #include <stdio.h> #define gyou 5 #define retsu 5 main(){ int sort[gyou][retsu]; int tate[retsu]; int yoko[gyou]; int i,j; FILE* fp; for(j=0;j<tate;j++) tate[j]=0; fp=open("sort.txt","r"); for(i=0;i<gyou;i++) { for(j=0;j<retsu;j++) fscanf(fp,"%d",&seiseki[i][j]); } fclose(fp); return 0; } この文にどのようなプログラムを書き足せば、sort.txtの中に書かれている数字20個(4行×5列)を昇順に並び替えさせることができるのでしょうか?したい形は 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 です。 ヒントだけでもいいのでご教授お願いいたします。

専門家に質問してみよう