C#でPictureBoxが二重に表示される

このQ&Aのポイント
  • C#でPictureBoxが二重に表示される現象が起きる場合、フォーカスが移動する作業が中断されている可能性があります。
  • フォーカスをあたらない状態で位置だけ変更する方法を試してみましたが、同じ結果でした。
  • 以前の位置のカーソルを消す方法をご教示いただきたいです。
回答を見る
  • ベストアンサー

C#でPictureBoxが二重に表示される

碁盤を描画し、その上にマウスを合わせたとき付近の交点にPictureBox(サイズは21x21)でカーソルを表示しようと考え、次のように書きました。 int sx = (int)Math.Floor((double)(e.X - 12) / 25) + 1; int sy = (int)Math.Floor((double)(e.Y - 12) / 25) + 1; imgCsObj.Location = new Point(sx*25-21, sy*25); しかし盤上でマウスを動かすと画像のように二重にカーソルが表示される現象が起きました。 おそらく内部的にはカーソルを表示した途端にフォーカスが盤から離れPictureBoxを移動する作業が中断されたせいでは、と思い imgCsObj.Enabled = false; imgCsObj.Location = new Point(sx*25-21, sy*25); imgCsObj.Enabled = true; 一度無効にしてフォーカスがあたらない状態で位置だけ変更しようと思いましたが同じ結果でした。 どうやって以前の位置のカーソルを消せば良いのでしょうか

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>本来の位置のカーソル以外のオブジェクトのある場所が描画されずウィンドウの裏が見えています。 碁盤の描画が正しく行われていない…のでしょう。 フォーム上にpictureBox1とimgCsObjでpictureBoxをそれぞれ配置。 pictureBox1は碁盤としてマス目(1マスのサイズは20x20)を描画したBMPを、imgCsObjはカーソルとして適当な画像(20x20)をプロパティで設定しておき、 pictureBox1のMouseMove()ハンドラを下記の要に記述してみました。 # 算出適当なんで…あんまし正しい位置に表示はされていませんが…まぁ、今回の件とは無関係でしょう。 とくにおかしな状態にはならない…ように見えます。 # マウスカーソルが碁盤の上にある状態でalt+TABキーでアクティブを切り替え、マウスカーソルを少し移動させてからアクティブに戻すと…以前の位置に表示されていたものは新しい位置に表示されます。  private void pictureBox1_MouseMove(object sender, MouseEventArgs e)  {   int sx = (int)Math.Floor((double)(e.X - 10) / 20) + 1;   int sy = (int)Math.Floor((double)(e.Y - 10) / 20) + 1;   imgCsObj.Location = new Point(sx * 20 + pictureBox1.Location.X, sy * 20 + pictureBox1.Location.Y);  }

bara-s
質問者

お礼

解決しました。 原因は、碁盤の外ではカーソル画像を隠そうとMouseLeaveイベントで imgCsObj.Visible = false; としていたことでした。カーソル画像の上にマウス移動したときにもイベントが発生するので意図しない動作になったようです。 勘違いで余計な手間をかけさせてしまい申し訳ありません。

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>しかし盤上でマウスを動かすと画像のように二重にカーソルが表示される現象が起きました。 その状態になったときに、Alt+TABキーの操作などで非アクティブにして別のウィンドウを表示させてから再度Alt+TABキーでアクティブに戻したらどうなりますか?

bara-s
質問者

補足

回答ありがとうございます。 Alt+TABキーでアクティブに戻したとき、本来の位置のカーソル以外のオブジェクトのある場所が描画されずウィンドウの裏が見えています。

関連するQ&A

  • pictureboxの表示について

    いつもお世話になります。 C#について質問です。VisualC#2008を使っています。 private PictureBox[] pictArray = new PictureBox[100]; private void Box_Load() { PictureBox pict; int nIdx = 0; while (nIdx < pictArray.Length) { pict = new PictureBox(); pictArray[nIdx] = pict; pict.Click += new EventHandler(pict_Click); nIdx++; } } のように、あるメソッドで配列にpictureboxの画像を代入(?)していく処理をしています。このメソッドを別のメソッドで呼び出し、 pictArray[1]に格納されているpicturebox pictArray[2]に格納されているpicturebox  …といった具合に、次々と表示させていきたいと考えています。しかし1つしかpictureboxが表示されません。具体的には以下のようなプログラムを組んでいるところです。 private void pict_Click(object sender, EventArgs e) { Box_Load(); kihon_pict.Location = new Point(10, yy); this.panel1.Controls.Add(pict); yy += 40; } 誰か解決策を教えていただけないでしょうか? よろしくお願いします。

  • 画像をランダムな座標に一定の時間で表示する方法

    javascript勉強中の65歳の初心者です 画像を乱数で得た座標に一定の時間で表示したいと次の通り試行錯誤していますが、どうも最初の1個は表示されますが配列の2番目以降表示されません。 初歩的な質問で恐縮ですがご指導お願いします。 <html> <head> <title>テスト表示</title> </head> <body onload= "set()"> <script language="JavaScript"><!-- sx = new Array(); sy = new Array(); num = 20; var timer; var n; var i; var m; n = 0; function set(){ for (m=0; m<num; m++) { sx[m] = Math.floor(Math.random()*800); sy[m] = Math.floor(Math.random()*600); } setInterval("uncohyouji()", 2000); } function uncohyouji(){ styl = "<img src='unco1.gif'style='position:absolute;"; document.write(styl+sx[n]+"px;left:"+sy[n]+"px;' name='unco1"+n+"'>"); n++; }

  • C#についてです

    複数のグラフを作成しようと思い、2つのクラスを作りました。 1つ目のクラスで、下のように書き、 public class clsWave { public const int count = 1024; public int[] data = new int[count];     public byte range; public double[] realValue = new double[count]; public PictureBox pcb;     public Pen myPen; ; public void Draw(Graphics g, int v) { int h = pcb.Height; int w = pcb.Width; int stpW = w / count; // X座標       Point[] lp = new Point[count]; for (int i = 0; i < data.Length; i++) { lp[i] = new Point(i * stpW, h - (int)(realValue[i] / (v * 8) * h)); } g.DrawLines(myPen, lp); } } もう一つのクラスで、グラフを下のように作りました。      clsWave BI = new clsWave(); clsWave BV = new clsWave(); clsWave CI = new clsWave(); clsWave CV = new clsWave(); clsWave EI = new clsWave(); clsWave EV = new clsWave(); clsWave SI = new clsWave(); clsWave SV = new clsWave(); この、グラフを配列にしたいのですが、私の力では、まだわかりません。 どのように作ればよいのでしょうか?教えてください。よろしくお願いいたします。

  • C# マウスオーバーの記述方法

    クリックの場合は var アイコン = new PictureBox(); アイコン.Location = new System.Drawing.Point(10, 10); アイコン.Name = "アイコン"; アイコン.Size = new System.Drawing.Size(10, 10); アイコン.Click += (f, g) => {                //クリックされた時の処理 }; このように書いているのですが、 マウスオーバー(マウスをアイコンの上に持ってきたときにおこる処理)のかきかたがわかりません。 どのように書けばよいでしょうか?

  • Listの<Label>と<PictureBox>

    C# リスト型作成 List<Label> labesetl; List<PictureBox> pictureboxset; リストの中に10個のLabelとPictureBoxを作る for(int lblcount=0 ; lblcount<10; lblcount++) { labelset.Add(new Label()); } for(int ptbcount=0 ; ptbcount<10; ptbcount++) { pictureboxset.Add(new PictureBox()); } 先にlabelsetを2段にして5行表示にし、表示させます 次にpictureboxsetを半透過(100,255,255,255)で2段にして5行表示にし、表示させます ここからが質問です。 セットしたlabelsetの好きなとこをクリックした時、 そのクリックしたlabelset[]とpictureboxset[]の番号を取るにはどうすればできますか?

  • 兄弟のpictureboxは透過処理をするには?

    度々質問して申し訳ありません。 Controls.Addで親子にしたpicturebox はちゃんと透過処理してくれるのですが、 同じ親pictureboxの子供たち(兄弟)同士の透過処理が行われません。 違う設定が必要なのでしょうか? 教えていただけますか?よろしくお願いします。 文字数多くて載せられないので、重要であろう箇所のみです。スミマセン。 image = New Bitmap("c:\image.png")'透過部有 iconGraphics = Graphics.FromImage(image) Icon1 = New System.Windows.Forms.PictureBox iconGraphics.DrawImage(image, 0, 0, iconSize, iconSize) PictureBox1.Image = image Icon1.Location = New Point(8, 8) Icon1.Width = iconSize Icon1.Height = iconSize Icon1.BackColor = Color.Transparent PictureBox1.Controls.Add(Me.Icon1) Icon1.BringToFront() Icon1.Image = image

  • C# PictureBoxへの描画を行うとメッセージボックスが表示されません。

    いつもお世話になっております。 ふと、PictureBoxに描画をしてみようかと思い Paintイベントに以下のようにして描画を行いました。   myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);   Graphics g = Graphics.FromImage(myBitmap);   pictureBox1.Image = myBitmap;      ・      ・(g.FillRectangle(・・・);など)      ・ (myBitmapはBitmap型のグローバル変数です。) PictureBoxは、自由にサイズ変更可能なフォームに貼り付け、四方をanchorで固めています。 そのためサイズが変更されるたびに、描画するときBitmapのサイズも変更しないといけないので この処理を毎回通っています。 (その部分が何だか無駄な気がするのですが、他にいい方法が思いつきませんでした。) ところが、描画はうまくいったのですが、メッセージボックスを出すと そのメッセージボックスが一度Altキーを押さないと表示されません。 色々調べて、ダブルバッファリングというものがあると知りました。 そこでPaintイベントで最初にこの処理をし   Image image = new Bitmap(pictureBox1.Width, pictureBox1.Height);   g = Graphics.FromImage(image); gに描画し終わってから   e.Graphics.DrawImage(image, 0, 0); としてみると、今度はフォームを移動するのにも一瞬フリーズするようになってしまいました。 (あまり深くプログラミングをしたことがないので、理解しきれなくてやり方が悪いのかも知れません・・・) メッセージボックスが表示されないのは、PictureBoxの描画のため 他のコントロールの描画ができていなためだと推測しているのですが どう直していいかわかりません。 どなたか、わかる方がいましたらよろしくお願いします。 <補足> OS:Vista VisualStudio2008 .NET Framework3.5

  • 特定のものにだけスクリプトを有効にする

    今晩は。JavaScript初心者です。 今、雪を降らせるスクリプトを作っています。 外部のjsファイルに記述したスクリプトを、特定のidを付けたdivにだけ有効にしたいです。 -----html------------------------------ <html> <head> <script type="text/javascript" src="js/snow.js"></script> </head> <body> <div id="snow"> </div> </body> </html> -----JavaScript(snow.js)------------------------------ sx = new Array(); sy = new Array(); sp = new Array(); num = 50; scrnx = 100; scrny = 500; function snowWrite() { styl = "<img src='snow.gif' style='position:relative;width:6px;height:6px;z-index:3;top:"; for (i=0; i<num; i++) { sx[i] = Math.floor(Math.random()*100); sy[i] = Math.floor(Math.random()*500); sp[i] = Math.floor(Math.random()*5) + 1; document.write(styl+sy[i]+"px;left:"+sx[i]+"px;' name='snow"+i+"'>"); } } function moveSnow() { for (i=0; i<num; i++) { sy[i] += sp[i]; if (sy[i] > scrny) sy[i] = -10; document.images["snow"+i].style.top = sy[i]; } } snowWrite(); 「document.getElementById」あたりかなと思ったのですが、それだとして(まったく見当違いかもしれませんが)、どこにどう記述してよいのかわかりません。 ご存知の方がいらっしゃいましたら、ご教授いただきたいです。 よろしくお願い致します。

  • [続編] pictureBoxそのものの位置を移動させたい -- 残像取り除きたい

    以前、『pictureBoxそのものの位置を移動させたい』というタイトルで質問させていただきました。変数iを用意して、iの値が変わるたびにpictureBoxそのものが動いているように見せかけるというもの。これに関しては、zhaojieさまから教えていただき、 Me.PictureBox1.Location = New System.Drawing.Point(i, j) で実現できました。しかしながら、実際に描画させると残像が残ってしまうようです。これをどうにかしたい。添付資料上部は初期状態で、右下に動かしたいピクチャーボックスがあります。これにある処理(グラフをかかせる)をさせながらピクチャーボックスを移動させたのが下部になります。ピクチャーボックスが左に移動しているのがわかると思います。ただ、軌跡が残像として残ってしまいます。これをなくす対処方法があれば教えてください。

  • C言語のプログラムについてです。

    円を描くプログラムを作りたいのですが、条件としてpointを使わないでつくらなければなりません。あとそのプログラムについての説明もいるので、合わせて回答お願いします。pointを使うと↓のプログラムです。 #include<stdio.h> #include<math.h> int main(void); int main(void) { double point[2][2]; double r; double pi=3.14159; int i; onenpl(); space(-100.0,-100.0,100.0,100.0); printf("円を描きます\n"); printf("半径を入力してください\n"); scanf("%lf",&r); point[0][0]=r*cos(0.0); point[0][1]=r*sin(0.0); for (i=1;i<360;i=i+1) { point[1][0]=r*cos(pi/180.0*i); point[1][1]=r*sin(pi/180.0*i); line(point[0][0],point[0][1],point[1][0],point[1][1]); point[0][0]=point[1][0]; point[0][1]=point[1][1]; } closepl(); return(0); }

専門家に質問してみよう