クリックイベントが取れません

[戻る]
クリリン 2002/03/04(月) 10:24:08
どうも、クリリンです。
開発環境は、Win2000 Pro + VC6(SP5) + MFCです。
現在、ある処理で進行状況を確認してもらう為に、
「プロジェクト」->「Visual C++ Components」->「プログレス ダイアログ」を使って挿入したダイア
ログを用意し、このダイアログを別のところから操作をして進行状況が目で解るようにしており
ます。
動作ははっきり言って問題ありません。しかし、実行処理のところに、Sleep等のウェイトをか
けると、進行状況の「キャンセル」のマウスクリックが出来るのですが、ウェイト取ると、マウ
スクリックしても「OnCancel」イベントが発生(デバッグモードで確認しました)しません。
ただし、「Space or Enter」キーを押した場合は「OnCancel」イベントが発生します。
このような場合、どうやって解決をしたら宜しいのでしょうか?
みなさん、良きアドバイスをお願いします。

不良PG 2002/03/04(月) 11:04:25
Sleep等のウェイトがどんなものか解りませんが・・、
Sleep処理を使うとその間メッセージループが止まってしまうので、
Sleepを分割して、間にメッセージ処理を追加すれば、よいと思います。

while(1)
{
  MSG msg;
  if( ::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  {
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
  ::Sleep(?)
  
 if(処理が終わったら)
  {
    break;
  }
}

クリリン 2002/03/04(月) 11:22:12
不良PG さん・・・回答ありがとうございます。
私の解釈がおかしかったら指摘してください。
私が行いたい処理は現在、for文内に記述しております。
実際、「プログレス ダイアログ」のサンプルにもそう記述していたもので・・・
で、不良PG さんのコードを確認しますと、
>if( ::PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
>  ::TranslateMessage(&msg);
>  ::DispatchMessage(&msg);
>}
を追加して、メッセージを処理しなさい・・・という事でしょうか?
そうでなければ、説明不足だったので追記します。
実際にはウェイト処理を行いたいのではなく、ただ、テスト段階で、マウスクリックイベントが
取得できなかったので、わざとウェイトを付けただけに過ぎません・・・

申し訳ありませんが、引き続きお願いします。

不良PG 2002/03/04(月) 11:46:57
実行処理の負荷が大きい場合には、その他の処理が遅くなるので、
実行処理の途中で、その他の処理を行っておけば、
問題なく動作するのではと思った訳です。

いままで、普通にプログレスダイアログを使ってみても、
確実にOnCancelに飛んで来なかったことは無いので、
実行処理の負荷が気になったのです。

クリリン 2002/03/04(月) 15:12:31
やはり、多少のウェイトをかけるしかないのでしょうか?

不良PG 2002/03/04(月) 15:23:56
>やはり、多少のウェイトをかけるしかないのでしょうか?
あの・・、何をどうやっているのか解らないので
答えようがありません。m(_ _)m

クリリン 2002/03/04(月) 16:09:33
いつも、不良PG さんにはお世話になっております。

えっと、では、ソースを記述しますね・・・内容はヘルプのサンプルをそのまま使用しておりま
す。
  n = 500;
  // 進行状況画面を呼び出し
  CProgressDlg myDL;
  myDL.Create();      
  myDL.SetRange(0,n); // 範囲
  myDL.SetStep(1);    // ステップサイズ
  AfxGetApp()->BeginWaitCursor();       // 砂時計表示
  WorkStr.LoadString(IDS_ANIMATE_FILE); // ストリングテーブルからファイル名を取得
  // 処理
  for(int Index = 0; Index <= MaxIndex; Index++){
    if(myDL.CheckCancelButton()){ // キャンセル
      // メッセージ表示
      if( AfxGetMainWnd()->MessageBox(_T("中断しますか?, "テスト",
                 MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES )
        // 中断メッセージで「YES」を選択しました。または終了
        // 中断する処理
        break;
    }
    // 実行処理をここに記述
    <この中に処理を入れております。>
    myDL.StepIt();  // プログレスバーカウントアップ
  }
  // 処理終了
  AfxGetApp()->EndWaitCursor(); // 砂時計消去
以上です。

クリリン 2002/03/04(月) 16:10:55
>WorkStr.LoadString(IDS_ANIMATE_FILE); // ストリングテーブルからファイル名を取得
は余計です。
>[MaxIndex]は[n]です。
すいません m(__)m

不良PG 2002/03/04(月) 16:22:08
あの・・、実行処理がわからなければ答えられないです(;;)

クリリン 2002/03/04(月) 17:33:05
すいません、もう少し、ちゃんとした質問の説明が出来るようになってから、
再び質問させていただきます。

クリリン 2002/03/07(木) 11:51:23
すいません、お騒がせしました。
全然、問題は無かったです。
不良PGさん…いつも、迷惑をお掛けしましてすいません。

原因は、処理の中に、別のダイアログをCreateしていた事でした。
その別のダイアログとは、ある画像を処理する事ができるOCXを貼り付けていたのですが、
プログレスダイアログにそのOCXを貼り付けて解決しました。
しかし、今回は、この方法で解決しましたが、
もし、別のダイアログを処理するのに、プログレスダイアログを使用したい場合は
どうしたら良いのでしょうか?(別のスレッドに記述すべきですか?)

不良PG 2002/03/07(木) 15:39:47
一般的すぎてどう答えたら良いかわかりませんが・・

プログレスダイアログの親と別ダイアログの親を同じにして
親が管理すれば済むのではないですか?

そういう事ではなくて?

クリリン 2002/03/07(木) 16:12:10
[[解決]]
説明しようと思って、よくよく考えてみたら必要で無い事に気づきました。
すいません。
とりあえず、解決にしておきます。
ありがとうございました。

古いスレッドには追加発言できません。