みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;

一度無効にしてフォーカスがあたらない状態で位置だけ変更しようと思いましたが同じ結果でした。
どうやって以前の位置のカーソルを消せば良いのでしょうか

投稿日時 - 2012-12-04 22:21:44

QNo.7830092

困ってます

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

>本来の位置のカーソル以外のオブジェクトのある場所が描画されずウィンドウの裏が見えています。

碁盤の描画が正しく行われていない…のでしょう。


フォーム上に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);
 }

投稿日時 - 2012-12-06 10:14:11

お礼

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

投稿日時 - 2012-12-06 17:39:03

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

Wr5

>しかし盤上でマウスを動かすと画像のように二重にカーソルが表示される現象が起きました。

その状態になったときに、Alt+TABキーの操作などで非アクティブにして別のウィンドウを表示させてから再度Alt+TABキーでアクティブに戻したらどうなりますか?

投稿日時 - 2012-12-04 23:36:51

補足

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

投稿日時 - 2012-12-05 01:07:37

あなたにオススメの質問