アプリ版:「スタンプのみでお礼する」機能のリリースについて

VisualStudio(Standard)でC#の勉強をしている者です。よろしくお願いします。
エクスプローラでファイルをコピーすると、ファイルが飛ぶ絵が表示されて、そこのキャンセルボタンをクリックするとコピーが中断しますが、それと同じ事を行うにはどうしたらよいか、以下のようなコードで試してみました。

Form form = new Form();
form.Show();

for (int i = 0 ; i < 1000 ; ++i)
  if (form.Stop)
    break;

//====================
class Form {
  public bool Stop = false;

  private void Cancel_Click() {
    Stop = true;
  }
}

ループに入る前にキャンセルボタンを配置したフォームをShow()しておいて、ループ中にキャンセルがおされてStop=trueになったらループを中断する、というようなことを考えました(上記コードは概要だけを表していて、実際には別のコードで試しました)。ただ、このコードではフォームのキャンセルボタンをクリックしても、クリックのイベント自体が発生していないのか、ループを止めることはできませんでした。
上記のような事をするにはどのようにすれば良いのでしょうか。ご存じの方がいらっしゃったらご教授をお願いいたします。

A 回答 (1件)

★ループの中でメッセージ処理を行えばよい。


・キャンセルボタンを押してもループを止める事が出来なかった理由は、ループ中に
 メッセージを処理していないためです。このため、キャンセルボタンを押した信号が
 出てもループ処理中なのでメインのプロシージャで Cancel_Click 関数が呼ばれなかった
 のです。
・私は C# は名前程度しか知らないため実装例を紹介できません。
 参考になればと思い C言語での処理をサンプルとして載せます。

サンプル:
MSG msg;

while ( PeekMessage(&msg,hWnd,0,0,PM_REMOVE) ){
 if ( !IsDialogMessage(hWnd,&msg) ){
  TranslateMessage( &msg );
  DispatchMessage( &msg );
 }
}

その他:
・C# でもメッセージを処理する関数(メソッド)などがあると思いますので調べてみて下さい。
 検索キーワードは『DoEvents』で探すと見つかると思います。
 下に1つだけ紹介します。→おそらく DoEvents() メソッドを使えば Cancel_Click 関数が
 呼ばれるようになってキャンセルできるようになると思います。
・以上。参考に。

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/136 …
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございます。教えていただきましたDoEvents()をループの中に入れることでキャンセルすることができました。非常に勉強になりました。ありがとうございました。

お礼日時:2007/04/25 05:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!