• ベストアンサー

UpdateData( FALSE); による文字列データの表示更新(VC++6.0)

VC++の超初心者です. UpdateData( FALSE ); を用いてエディットボックスの文字列の表示の更新を 試みているのですが,たとえば,以下のコードのようにボタンをクリックした際に文字列表示の更新を複数回行おうとするとうまくいきません. 具体的には一回目のUpdateData( FALSE );が反映されず二回目のUpdateData( FALSE );のみ反映されるという症状です. なおm_mojiretsuはCstring型でエディットボックスのDDX用の変数です. void CMyDlg::OnButton1() { DWORD p; m_mojiretsu=_T("mojirstu1"); UpdateData( FALSE ); /*5秒の待ち*/ p=timeGetTime(); while(1){if((timeGetTime()-p)>5000) break;} m_mojiretsu=_T("mojirstu1\r\nmojirstu2"); UpdateData( FALSE ); } 何か別の処理を行わなければいけないのでしょうか. どこかに根本的なミスがあるのでしょうか. VC歴3日程度で,右も左も分からず大変困っております.よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • e_watt
  • ベストアンサー率71% (25/35)
回答No.2

m_mojiretsu=_T("mojiretsu1"); UpdateData(FALSE); UpdateWindow(); // <- これを追加 /*5秒の待ち*/ ... とすれば、ひとまず期待どおりの動作になると思います。 # こうするよりは、OnButton1() では変数を書き換えるべしと言う # 自前のコマンドメッセージを投げるだけで、すぐに戻った方が # お行儀は良いのですが... # そこいらへんは追々調べたり試したりしてみて下さい。

accyon__accyon
質問者

お礼

ありがとうございます! 文字の表示更新がきちんと行われました. >そこいらへんは追々調べたり試したりしてみて下さい。 これから少しずつ勉強していこうと思います.

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

何故反映されないように見えるか。 描画ルーチンを通らなくなるからです。 恐らくUpdateData( FALSE );をした時にビデオメモリ(表示上)にも 反映されると思っているのでしょうが そうではありません。 例えばこの5秒待ってる間に他のウインドウを重ねてみてください。 再描画されていないことがわかります。 Windowsプログラムというのはウインドウメッセージと呼ばれるものを処理をして いるメッセージループという箇所があり、そこにWM_PAINT(描画する)メッセージ を処理しているから画像として表示されるのです。 単にMFCはそれをラップ(見せないように)しているクラスですので、当然 WM_PAINT(描画する)メッセージを処理しなければ、 そこが表示されません。 CMyDlgはCDialog(MFCのクラス)を継承したクラスだと思いますが、 マウスカーソルをそのウインドウの上を動かすだけで 一見何の処理もしてないように見えても内部では処理が動いているのです。 つまりやろうとしていることは void CMyDlg::OnButton1()内部だけでは解決できない。 (※無理矢理やれなくはないが、普通はしない) 方法は色々ありますが 1つはOnTimer()を使う方法です。SetTimer()で0.1秒毎ぐらいに OnTimer()を通るようにして、そこで毎回5秒たっているかチェックする 方法、 他にはスレッドを作る方法、 OnButton1() の中で m_mojiretsu=_T("mojirstu1"); 5秒待つスレッドを作成しスレッド終了時にCMyDlgに通知する仕組みです。 一度MFCを使わないプログラムをする事をお勧めします。(MFCが理解しやすくなります) http://www.kumei.ne.jp/c_lang/index_sdk.html

accyon__accyon
質問者

お礼

>恐らくUpdateData( FALSE );をした時にビデオメモリ(表示上)にも 反映されると思っているのでしょうが おっしゃるとおり,UpdateData( FALSE );をすることで内部的な処理をすべてMFCがやってくれるものと期待しておりました. タイマー割り込みやマルチスレッド処理など自在に操れるように勉強していこうと思います. ありがとうございました!

すると、全ての回答が全文表示されます。

関連するQ&A