
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日程度で,右も左も分からず大変困っております.よろしくお願いします.
No.2ベストアンサー
- 回答日時:
m_mojiretsu=_T("mojiretsu1");
UpdateData(FALSE);
UpdateWindow(); // <- これを追加
/*5秒の待ち*/
...
とすれば、ひとまず期待どおりの動作になると思います。
# こうするよりは、OnButton1() では変数を書き換えるべしと言う
# 自前のコマンドメッセージを投げるだけで、すぐに戻った方が
# お行儀は良いのですが...
# そこいらへんは追々調べたり試したりしてみて下さい。
ありがとうございます!
文字の表示更新がきちんと行われました.
>そこいらへんは追々調べたり試したりしてみて下さい。
これから少しずつ勉強していこうと思います.
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
>恐らくUpdateData( FALSE );をした時にビデオメモリ(表示上)にも
反映されると思っているのでしょうが
おっしゃるとおり,UpdateData( FALSE );をすることで内部的な処理をすべてMFCがやってくれるものと期待しておりました.
タイマー割り込みやマルチスレッド処理など自在に操れるように勉強していこうと思います.
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
-
4
ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・
C言語・C++・C#
-
5
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
6
CString から LPCTSTRの型に変換
C言語・C++・C#
-
7
エディットコントロールでEnter押した時の動作
C言語・C++・C#
-
8
エディットボックスのフォントを変えたい
C言語・C++・C#
-
9
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
10
エディットボックスの入力制限について
C言語・C++・C#
-
11
ラジオボタンの値の取得について(C++)
C言語・C++・C#
-
12
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
13
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
14
SetWindowText関数について
C言語・C++・C#
-
15
エディットボックスの数値を他の変数に代入するには??
C言語・C++・C#
-
16
コンボボックス表示文字列を取得する場合
C言語・C++・C#
-
17
【C++/CLI.NET】コンボボックスの値の設定・取得
C言語・C++・C#
-
18
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
19
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
20
コンボボックスのドロップダウンリストが表示されない
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
MFCタブコントロールのグラデー...
-
pset関数について
-
Form1 Load で実行されない。
-
VB6,リストボックスの特定行の...
-
ウインドウサイズを変更しても...
-
DirectXとGDIの違い
-
MFCでOnPaintのタイミング
-
word
-
逐次的なグラフ表示の方法
-
WM_PAINTとBitBlt
-
GDI+で高速な描画
-
Minecraft 統合版(PC)の描画距...
-
.net の ImageList について
-
文字の行間
-
ワードの図形で重なり部分の色...
-
ダイアログベースの再描画について
-
CStaticコントロールの静的イメ...
-
win32api 画面のちらつき
-
「アイテムは収集されました」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
google Colabでmatplotlibの描...
-
panelのスクロール表示について
-
VB.netでのライン描画方法がわ...
-
VB6,リストボックスの特定行の...
-
UpdateData( FALSE); による文...
-
TextBoxに文字を書いても表示さ...
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
MFCでOnPaintのタイミング
-
InvalidateRectの使い方について
-
VC++プログラムをつかったBMP画...
-
GetGlyphOutline() ご利用経験...
-
NVIDIAのシェーダーキャッシュ
-
Form1 Load で実行されない。
-
FlexGridの一部のみ表示を更新...
-
C#のタブコントロールについて...
-
WM_SIZEとWM_SIZINGの違い (Win...
おすすめ情報