- PR -

C# pictureBoxを使わずにOnPaintで描画した画像にMouseUpなどを使いたい

投稿者投稿内容
AKIR
常連さん
会議室デビュー日: 2005/11/08
投稿数: 34
投稿日時: 2005-12-06 08:41
while(true)は無限ループさせる方法だったのですね。
gotoじゃなくてbreakでもよかったんですね。
AKIR
常連さん
会議室デビュー日: 2005/11/08
投稿数: 34
投稿日時: 2005-12-06 15:53
コード:
		private void Form1_Load(object sender, System.EventArgs e)
		{
			this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
			
		}
		Point MouseUpLocation = new Point();
		private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			Form1 form1 = new Form1();
			MouseUpLocation.X = e.X;
			MouseUpLocation.Y = e.Y;

			
			form1.Focus();
			form1.Invalidate();
		}
		private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
		{
			Graphics g = e.Graphics;
			Image image = Image.FromFile(@"C:\1.bmp");
			if(image!=null) g.DrawImage(image,0,1);
			Region region1 = new Region(new Rectangle(0,1,20,30));
			while(true)
			{
				if(region1.IsVisible(MouseUpLocation, e.Graphics))
				{
					if(image!=null) g.DrawImage(image,50,0);
					
					break;
				}
				Application.DoEvents();
			}
			
			if(image!=null) g.DrawImage(image,0,50);
		}


これでも、できました。ありがとうございました。
AKIR
常連さん
会議室デビュー日: 2005/11/08
投稿数: 34
投稿日時: 2005-12-06 15:57
while(true)無しでできたと思ったんですが、やっぱり無しじゃできなくて、Focus();も働きませんでした。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-12-06 20:02
推考してから上げて欲しいです(-.-; 都度都度、ポンポン上げられると、理解しにくいです。
参考:
「質問」をされる方へ
C# インデックスが配列の境界外です

 長いから読んでもらえないんだろうな、と思いながら、削れなかった。。。


何が聞きたいのか、わからないんですね。
引用:

ヘルプで領域を使用したヒット テストというがヒットしたんですが、MouseUpなどを使いたいのですが、よくわかってないのですが、できますか?


これって、こうですよね?
引用:

マウスイベントを使用したい

 pictureBox を使わずに、Form.OnPaint で、Form に直接描画した画像に対して、MouseUp などのマウスイベントを使いたいと思っています。
 (どの様な検索条件で、)MSDN の「領域を使用したヒットテスト」という項目を参照しました。(どういうことを実現するために)MouseUp などを使いたいのですが、(なにが)よく解りません。
 どの様にすれば、出来るのでしょうか。


 タイトルは“題”であって、文の一部ではありません。タイトルは、本文の内容を表すものを付けるために最後に考えるようにするべきであって、タイトルから書き始めると、内容と不一致を起こしがちです。

 句読点や、カッコを適切に使ってください。私は最初、「『ヘルプで領域を使用したヒットテスト』って、なに?そんな項目があるの?」と思ってしまいました。

 句点で文をつなげず、読点で切ってください。そうすることで、後で読み直したとき、言葉の係り受けがはっきりして、何か抜けていないか、他人に通じるかどうか、わかるでしょう。実際、丸カッコの部分が抜けています。
# 『火垂るの墓』を読んでみてください。読みにくいと思います。


 一度「名前空間」を俯瞰したり、概要を見るときに「継承関係」を把握するようにしてください。MSDN に「日本語が書かれているように思えない」のは、自分がどんな情報が欲しいのかはっきりさせておらず、いらない情報も取り込んでいるからです。いる情報だけ切り取れば、すっきり理解しやすくなります。
 PaintBox も Form も、Control クラスを継承しているので、Control クラスが発生させる Paint イベントを処理できます。


 「Onイベント名」のメソッドは、イベントを発生させるためだけに使用するのが望ましく、ここに、イベントが発生することによる処理を書くことは、控えましょう(Kazukiさんが 2005-12-05 23:28 に指摘)。
 加えて、OnPaint がどのような時に実行されるか、以前のスレッドで説明していますよね(渋木宏明(ひどり)さんの 2005-12-04 12:13)?
引用:

しかし、OnPaint は、コントロールを描画しようとするときに実行されるので、プログラムの実行中に何度も実行されます。




 プログラム全体的に、

  • どのオブジェクトが
  • どんなときに
  • 何をしなければならないのか

を、見直した方がいいと思います。それが出来ていないから、
引用:

このウィンドウがほかのウィンドウの後ろになってしまうと、またアクティブにして前にしたとき、int[] xを使って表示した牌が変わってしまうのです。

マルチスレッドをやめてランダムシャッフルに変えたら、なおりました。


別に、14秒間だけ反応してくれて問題ないのですが、マージャンで牌をきって移すという動作がやりたかっただけです。

でも、14秒たつと、regionで判定して描画した牌が消えてしまいます。

TickCountをやめてform.Created==falseとやったら直りました。


このようなことになるのだと思います。さっぱりわかんないんですよね。

わからない点:
 1.マルチスレッドと、ランダムシャッフルの関係
  前者は複数の処理を、どの様に実行するか。後者は整列の方法。どう関係するの?
  OnPaint でシャッフルすることと、マルチスレッドがどう関係しているの?

 2.「int[] x」の謎
  何を表すのか、わからない。
  引用されているコードには表れていないんだけど?

 3.14秒の怪
  どこから「14秒」が出てきたのか。
  最初、「14秒だけ反応で問題ない」といっていながら、なぜ問題になったのか。
  どこから「form.Created == false」が出てきたのか。
  (「while (true)」の為なら、あまりにもお粗末)

 4.「切って移す」の謎
  捨てパイを、手持ちのパイからドラッグして、場にドロップする、ってこと?
  私も色々な麻雀ゲームをしましたが、捨てパイ選びは、どれもクリックして選択なのに?

 5.なぜ「OnPaint」なのか
  このメソッドは「Paint イベントの励起」だけを行うべき。
  処理の内容は「コントロールをユーザが見えるようにする」こととは思えない。
  この中で MouseUp を拾う(待つ)目的はなんなのか。


お勧めの勉強ポイント:
 1.各コントロールのイベント、メソッドの目的
 2.オブジェクトの生存期間について
 3.変数のスコープについて
 4.コントロールの継承関係について
 5.C# の予約語について
 6.プログラムフローの制御について
 7.IDisposable インターフェイスについて
___________________________________________________________________
□ written by Jitta on 2005/12/06
□ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006

_________________
検索のコツ質問のコツ

BBコードミスを修正

[ メッセージ編集済み 編集者: Jitta 編集日時 2005-12-06 20:04 ]
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2005-12-06 22:56
私なら「Formに全てベタにコード書け!」っていう制約があるとしたら下のように書きます。
参考までに。

フォームのフィールド(メンバ変数)
Image 表示用の画像
Point 画像表示位置(複数箇所に表示したいならArrayListあたりで)

Form_Load
・画像の読み込み
・画像の位置の初期化

Form_Paint
・画像の表示位置に画像を表示する

Form_MouseUp
・クリックした場所が,画像にかぶってるか判定
・画面に被ってるなら表示位置を更新
・InvalidateとRefleshメソッドでフォームを再描画

# 後,確認してみたのですが,やっぱりimageのnullチェックいらないと
# 思いますよ。
# うちは,VC#2005Express(英語版)でやってみたのですが
# ファイルが無い場合はFileNotFoundExceptionが出てました。

# 連続でちょっとずつ情報を小出しにするくらいなら,直前の記事を
# 編集したほうが幸せになれると思います。

[ メッセージ編集済み 編集者: Kazuki 編集日時 2005-12-06 22:58 ]

スキルアップ/キャリアアップ(JOB@IT)