EnableWindow

解決


もめ  2006-04-07 10:31:10  No: 61151  IP: 192.*.*.*

ボタンが押されたら、ボタンのEnableWindowをFALSEにして
操作不可に設定した後、ある処理を実行して、
処理が完了したら、EnableWindowをTRUEにして
ボタンを操作可能に設定しているのですが、

ある処理を実行中にボタンが押されたら、
操作不可にしているのに、ある処理が完了した後に
またある処理が実行されてしまいます。

これを回避するにはどうしたらいいのでしょうか・・・

初歩的な質問で申し訳ありませんが、どなたかご教授ください。
環境はVC2003/MFCです。

編集 削除
Yuki  2006-04-07 11:40:26  No: 61152  IP: 192.*.*.*

処理中にEnableWindowが効いていればボタンを押しても
反応しないと思うのだけけれど・・・。

GUI的にできないのであればフラグでも立てるしか
ないのかと。

編集 削除
RAPT  2006-04-07 12:24:21  No: 61153  IP: 192.*.*.*

単にメッセージが残っているだけでしょう。

ボタンクリック時のメッセージ(WM_LBUTTONDOWN)を、ボタンが操作不可と
なっている間は破棄するようにすれば良いのでは?

編集 削除
dairygoods  2006-04-07 13:06:48  No: 61154  IP: 192.*.*.*

void CMyDlg::Onボタン()
{
  ボタン.EnableWindow(FALSE);
  ある処理;
  ボタン.EnableWindow(TRUE);
}

もしかして、こうなっていますか?
だとすると、関数から抜けるまでは、
クリックを含む全てのメッセージが処理されないので、
EnableWindow の意味がありません。

時間のかかる処理を行うための手法を、
スレッド、タイマー、メッセージループなどの
キーワードで調べてみてください。

編集 削除
もめ  2006-04-07 16:49:51  No: 61155  IP: 192.*.*.*

dairygoodsのご指摘どおりでした・・・
ある処理をワーカースレッドとして実行することで
解決しました。

みなさんありがとうございました。

編集 削除
もめ  2006-04-07 16:50:21  No: 61156  IP: 192.*.*.*

dairygoods様のご指摘どおりでした・・・
ある処理をワーカースレッドとして実行することで
解決しました。

みなさんありがとうございました。

編集 削除