MFC VS2005 ダイアログベースで開発しています。
ダイアログにグループボックスがありそのCaptionを動的に変更したいと考えています。
初期値として OnInitDialog()でそのグループボックスのCaptionを
CString a;
a.Format(%d %s, i,str); // strは文字列
mddxBox.SetWindowTextA(a); // mddxBoxはコントロール変数
としています。
実行すると Captionが %sの部分しか描画されていません。
1 hogehoge <-- ○
hogehoge <-- 現状
同じロジックをinit以外でも使うのですが、その時は
1 hogehoge と描画されます。
これだけの処理ですがどこが問題なのでしょうか?
再現しませんなぁ。
テストしたコード:
int i = 1;
LPCTSTR str = hogehoge;
CString a;
a.Format(%d %s, i,str); // strは文字列
mddxBox.SetWindowTextA(a); // mddxBoxはコントロール変数
プロジェクトの設定の文字セットはマルチバイトに変更済み。
> 同じロジックをinit以外でも使うのですが、その時は
> 1 hogehoge と描画されます。
デバッガでinit時にCString a;の値を調べて、Formatの問題か、SetWindowTextAの問題
かを切り分けた方がよいでしょう。
CDialog::OnInitDialogが動作する前にやってませんか?
そのタイミングだと多分コントロールが出来ていないのではないかと思うのですが。
元々のリソース上でhogehogeと設定しているなら、
コードで指定している部分が単に失敗してリソースの方が出ていると言う
事も考えられると思いますけれど。
OnInitDialog()内であると本人が記述しているのを信じると
1.まだ、mddxBoxのm_hWndが無効な状態だった
が考えられます。
DoDataExchange()を疑ってみるか、使ってなければ
mddxBoxのウインドウ構築又は、HWNDの取得&初期化
部分を確認するのが吉かもしれません。
OnInitDialog内で
デフォルトで呼び出すようになってるCDialog::OnInitDialog()前に
SetWindowTextするとウィンドウがないのでエラーでとまるはず
皆様 ご協力ありがとうございます。
・CDialog::OnInitDialog()を呼んだあとに処理しています。
・init時、デバッガで値を見ましたが、CString, SetWindowTextとも
どちらも値は正しく設定されていました。
init時以外の使用時も値は同じでした (←こちらの場合は正しく表示される)
・リソースの方は デフォルトの ”スタティック”から変更していません。
となっています。
よくわかりません・・・
そのコントロールに文字列をセットしている箇所に全てブレークポイント
をセットして動かしてみてはいかがでしょうか。
[ちなみに以前同僚が同じような現象に陥っていた時のオチ]
アクティブだったかフォーカスだったかのイベントから呼ばれる関数内で
SetDlgItemTextやってた(SetWindowTextで探してたから見つからなかった。
何故かそこだけSetDlgItemText使ってた)
ほかの方法として
OnInitDialog内の、SetTextWindowをコメントアウトして
リソースのままの「スタティック」が表示されるかどうかを試すのはどうでしょうか
コメントアウトしてるのにhogehogeに変われば、
OnInitDialog以外の場所に原因がいるはず
変わらないなら、やっぱり原因はOnInitDialog内ということになるが・・・
#あとついでに、中間ファイルを消して、完全にリビルドも試す価値あるかも
他に書き込みをしている箇所がありました・・・。
「スタティック」が表示されるか確認したところ出てこない・・
そこで、調べると、他にもhogehogeを書いているところがありました。
そこの処理をなくすと普通に動作しました。
ありがとうございました。