プロが教えるわが家の防犯対策術!

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日程度で,右も左も分からず大変困っております.よろしくお願いします.

A 回答 (2件)

m_mojiretsu=_T("mojiretsu1");


UpdateData(FALSE);
UpdateWindow(); // <- これを追加

/*5秒の待ち*/
...

とすれば、ひとまず期待どおりの動作になると思います。

# こうするよりは、OnButton1() では変数を書き換えるべしと言う
# 自前のコマンドメッセージを投げるだけで、すぐに戻った方が
# お行儀は良いのですが...
# そこいらへんは追々調べたり試したりしてみて下さい。
    • good
    • 1
この回答へのお礼

ありがとうございます!
文字の表示更新がきちんと行われました.

>そこいらへんは追々調べたり試したりしてみて下さい。

これから少しずつ勉強していこうと思います.

お礼日時:2005/10/20 20:38

何故反映されないように見えるか。


描画ルーチンを通らなくなるからです。
恐らく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
    • good
    • 0
この回答へのお礼

>恐らくUpdateData( FALSE );をした時にビデオメモリ(表示上)にも
反映されると思っているのでしょうが

おっしゃるとおり,UpdateData( FALSE );をすることで内部的な処理をすべてMFCがやってくれるものと期待しておりました.

タイマー割り込みやマルチスレッド処理など自在に操れるように勉強していこうと思います.

ありがとうございました!

お礼日時:2005/10/20 20:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A