合計 昨日 今日

C#でテトリス作成中です。Application.Runとは一体?

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: Cubest
[URL]
Date: 2017年8月03日(木) 06:51
No: 1
(OFFLINE)

 C#でテトリス作成中です。Application.Runとは一体?

件名の通りC#にてテトリスを作成中です。【はじめてのぷろぐらみんぐ】 です。
Microsoft Visual Studio Express 2012 を使用しています。

知識はクラスとメソッド・変数・条件分岐程度です。
タイマーを実装してテトリスブロックの落下処理を行いたいのですが、
こいつをどこに書き込めばいいのかイマイチ分かりません。

と言いますのも、Application.Run と言う行が何をどう動かしているのか分からないからです。
他の人の動画を見て、おお、こういうアプリの形で出来るのか格好いいなー。
と、ノリでそこだけはコピったのですが、調べてもさっぱり分かりません。

というか、下のコードで初期化が最初に呼ばれるのは理解できますが、
その他のメソッドの呼ばれる順番が分からないのです。
OnPaint OnKeyDown の両メソッドについてもこうすれば使える程度の知識なのも問題なのかもしれません。

おそらく、初期化 → Application.Run という順で動いているはずなのですが。
その後は一体どうなっているのでしょうか?
下のような感じで書いて貰えると助かります。よろしくお願いします。

初期化 → Application.Run →   →   →   →


補足としまして、
Application.Run がループ処理を行う、という程度は理解しています。(合ってるかは分かりません)
ですが、下のコードでなんでループできるのかは分かっていません。何をループさせているのかも分かりません。
while文とかで無限ループとかなら理解できるのですが。

class Byouga : Form
{
   public Byouga()
   {
     ClientSize = new Size(620, 1000);
     //初期化
   }

//↓ Formを表示させる
   protected override void OnPaint(PaintEventArgs e)
   {
     各所に 【テトリスブロックの場所】 を送って、壁等と重ならないか調べ、OKならば背景に合成し表示。
     最初に背景のリセットも行っています。
   }

//↓ Keyが押されたかの判定
   protected override void OnKeyDown(KeyEventArgs e)
   {
     【キー入力】 を読み取って、【位置情報】 や 【ブロックの回転】 を 変化させています。

      Invalidate();
      //Onpaint の呼び出し
   }

//↓ これを別クラスのMain関数から呼び出して実行しています。
   public void Zentai()
   {
     Application.Run(new Byouga());
   }
}

Name: YuO
[URL]
ハッカー(153,404 ポイント)
Date: 2017年8月03日(木) 10:06
No: 2
(OFFLINE)

 Re: C#でテトリス作成中です。Application.Runとは一体?

普通,Application.Runはデフォルトで作られるProgram.csの中に置いたまま使います。
今回のように,Form派生クラスの,それもインスタンスメソッドに書くことはまず行いません。

で,Application.Runは実質的にはメッセージループを回します。
コード[C]: 全て選択
1
2
3
4
5
6
7
MSG msg;
BOOL result;
while ((result = GetMessage(&msg, NULL, 0, 0)) != FALSE && result != -1)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
に相当する物です。
実際には,メッセージフィルターなどがあるため,もっとややこしくなりますが。
ref) Application.Run, Application+ThreadContext.RunMessageLoopInner, Application+ThreadContext.LocalModalMessageLoop from Reference Source

Application.RunやControl.Showでフォームを表示させたときのイベント発生順は,Order of Events in Windows Forms (古いドキュメント:Windows フォームのイベントの順序) にあります。

Name: Cubest
[URL]
Date: 2017年8月04日(金) 00:14
No: 3
(OFFLINE)

 Re: C#でテトリス作成中です。Application.Runとは一体?

返信ありがとうございます。メッセージループというのを理解していませんでしたので返答が遅れました。申し訳ありません。
貼っていただいたリンクの Windows フォームのイベントの順序 は、今後役に立ちそうなのでお気に入りに突っ込んでおきました。

ただ個人的には、OnPaint やら、 OnkeyDown などがどういう順番で読み込まれるのか、
と質問した感じだったのですが、メッセージループ、とやらを調べてみた結果。

ユーザーのアクションがなければ、反応しないメソッドなので順序は関係ない。みたいな認識で良いのでしょうか?
ただそうすると OnPaint は起動した際に一度勝手に読み込まれて表示され続けているようですが、
OnPaintは特殊な例といった感じなのでしょうか?

Name: へにっくす
[URL]
熟練のプログラマー(61,211 ポイント)
Date: 2017年8月04日(金) 05:18
No: 4
(OFFLINE)

 Re: C#でテトリス作成中です。Application.Runとは一体?

OnKeyDown
はキーを押したときのイベントです。
キーを離したときのイベントもOnKeyUpでありますよ。

OnPaint
はウィンドウが描画するタイミングで必ず呼ばれるイベントです。
最初に表示するとき、ウィンドウの重なりが変わったとき、最小化、最大化、元に戻すなどウィンドウ内の状態が変わるすべてです。
これがなければウィンドウの中は真っ白なままです(笑)

それぞれのイベントにはどんな意味があるか分かれば納得できるはずです。
written by へにっくす

Name: Cubest
[URL]
Date: 2017年8月04日(金) 06:56
No: 5
(OFFLINE)

 Re: C#でテトリス作成中です。Application.Runとは一体?

[解決!]

返信ありがとうございます。なるほど納得致しました。
OnPaint についてはウィンドウを作った、動かした。事がユーザーのアクションに当たる事だったんですね。

YuOさん、へにっくすさん、本当にありがとうございました。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[27人]