質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

解決済

ボタンの有効無効の表示を即座に反映させたい

Alyn
Alyn

総合スコア49

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

2回答

0グッド

0クリップ

258閲覧

投稿2022/11/15 08:41

編集2022/11/28 00:10

前提

MFCでダイアログのあるプログラムを作っています

実現したいこと

OKボタンを押した際に、すべてのボタンを無効にしてから時間がかかるファイル読み書き処理を行います。
そのファイル読み書き処理中にすべてのボタンが無効表示にならず不自然なプログラムになっています。
これを改善するために挿入するコードを教えてください。

該当のソースコード

mfc

1void CabcDlg::OnBnClickedOk() 2{ 3 cbOK.EnabledWindow(FALSE); 4 cbCancel.EnabledWindow(FALSE); 5 cbSelect.EnabledWindow(FALSE); 6 7 //時間がかかるファイル読み書き処理 8 9 MessageBox(_T("ファイル読み書き完了"), _T("SUCCESS"), MB_OK); 10 cbOK.EnabledWindow(TRUE); 11 cbCancel.EnabledWindow(TRUE); 12 cbSelect.EnabledWindow(TRUE); 13}

解決後のソースコード

mfc

1void CabcDlg::OnBnClickedOk() 2{ 3 cbOK.EnabledWindow(FALSE); 4 cbCancel.EnabledWindow(FALSE); 5 cbSelect.EnabledWindow(FALSE); 6 7 SetTimer(TIMER_INTERVAL, 200, NULL); 8} 9 10void CabcDlg::OnTimer(UINT_PTR nIDEvent) 11{ 12 if(nIDEvent == TIMER_INTERVAL) 13 { 14 KillTimer(nIDEvent); 15 16 //時間がかかるファイル読み書き処理 17 18 MessageBox(_T("ファイル読み書き完了"), _T("SUCCESS"), MB_OK); 19 cbOK.EnabledWindow(TRUE); 20 cbCancel.EnabledWindow(TRUE); 21 cbSelect.EnabledWindow(TRUE); 22 } 23 CDialogEx::OnTimer(nIDEvent); 24}

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

ファイルの読み書きを別スレッドでやればいいんじゃないかしら。

投稿2022/11/15 09:02

episteme

総合スコア16005

fanaを押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Alyn

2022/11/17 06:09

スレッド化すると色々直すのが大変で、画面更新だけしてくれる方法があれば知りたいなと

0

ベストアンサー

ボタンが無効表示にならず

だけをとりあえず何とかしたい,という話なのであれば……
ボタン類の再描画が成されるように一度メッセージループまで処理が戻るようにすれば良いのではないでしょうか.

例えば,そのボタン押下時のハンドラの処理は

  • ボタン類の無効化
  • 適当なユーザ定義メッセージをポストする(※1)

という形にして,そのメッセージのハンドラの側で

  • ファイル操作
  • ボタン類の有効化

を行うような.

(※1)実際,これでいけるかどうかは不明(試してないです).再描画メッセージは優先度が低いのでユーザ定義メッセージ側が優先されてしまってダメかもしれない.その場合はユーザ定義メッセージをポストするんじゃなくて適当にタイマーでも起動すれば良いのかな.

投稿2022/11/16 01:42

fana

総合スコア10645

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

fana

2022/11/16 01:48

こんなことをせずとも UpdateWindow() とかを使えば即座に再描画させることができるのかもしれないけど,自信無い.
Alyn

2022/11/17 06:31

UpdateWindow()はダメでした。タイマーは200msくらいで表示が変わりましたので、他に良い方法がなければタイマーで解決にしようと思います

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。