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

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

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

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

Q&A

解決済

2回答

774閲覧

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

Alyn

総合スコア50

MFC

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

0グッド

0クリップ

投稿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}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2022/11/15 09:02

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alyn

2022/11/17 06:09

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

0

ベストアンサー

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

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

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

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

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

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

を行うような.

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

投稿2022/11/16 01:42

fana

総合スコア11654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/11/16 01:48

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

2022/11/17 06:31

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問