• ベストアンサー

ダイアログへ文字列を表示させる方法(API)

TCHAR s[80] = "Test"; MessageBox(NULL, s, "題名", MB_YESNO); としてダイアログを表示させるのと同じように、 ダイアログボックスをリソースエディタで作成し 作成したダイアログ内に、文字列を表示させるには どのようにしたら良いでしょうか? 作成したダイアログは、MessageBox関数で作成されるものと同じ。 表示させたい文字列は、MessageBox関数の第2パラメータのTCHAR型変数sと同じ。 ダイアログ内の表示させたい所の識別子は、IDC_STATIC。 MS VC++ & Win98 の環境で作成してます。

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

  • ベストアンサー
  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.4

エラー情報を取得してみてください。 HWND handle = GetDlgItem(hWnd, IDC_STATIC); DWORD errorInf = 0; if (handle == NULL) { errorInf = GetLastError(); } として、これらの処理を通った後のerrorInfの値をデバッガ等で見てください。 数値に対応するエラーは参考URLにあります。 (FormatMessage()を使用してもかまいませんが) ここまででハンドルが正常に取得できている場合には、SetWindowText()について同様にエラー情報を取得してみてください。

参考URL:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/errlist_7oz7.asp
rewind
質問者

お礼

いつも回答を頂きありがとうございます。 HWND handle = GetDlgItem(hWnd, IDC_STATIC); DWORD errorInf = 0; if (handle == NULL) { errorInf = GetLastError(); } は、Dialog作成処理後で良いですよね? 0x00000が格納されていたので、ERROR_SUCCESS よって、異常なし。 今度は、SetWindowText(GetDlgItem(hWnd, IDC_STATIC), StrDat1); の後に試したら、 0x00057が格納されていたので、ERROR_INVALID_PARAMETER よって、パラメータがおかしい? という解釈で良いでしょうか? 0x00057は16進なので、10進に変換して87のエラー詳細をみましたが。

その他の回答 (3)

  • itohh
  • ベストアンサー率45% (210/459)
回答No.3

こんにちは。itohhといいます。 以下のような感じでよいのでしょうか? 例えば、以下のようなダイアログをイメージした場合で説明します。 +---------------------+ |                     | +---------------------+ |                     | |                     | |   メッセージエリア          | |                     | |  +------+ +------+  | |  | ボタン1 | | ボタン2 |  | |  +------+ +------+  | |                     | +---------------------+ (1)「メッセージエリア」のところは、スタティックコントロールでIDC_STATIC_MSGとします。    IDC_STATICのままだとクラスウィザードでメンバ変数に割り当てられません。    (IDC_STATIC_MSGは、適当な名前に変えてください。) (2)IDC_STATIC_MSGにクラスウィザードでメンバ変数をCStirngでm_Stat_Msgとします。    CStirngの変数に値を設定するように扱えます。 (3)あとは、このメンバ変数に値を設定するタイミングを工夫すればよいでしょう。    例えば。    a.DoModal関数で表示する前に値を設定しておく。    b.MessageBox関数みたいなラッパー関数を自作し、その中で値を設定する。    c.Etc...

rewind
質問者

お礼

回答ありがとうございます。 せっかくご丁寧な回答をいただけたのですが、 クラスウィザードを使わない方法で コントロール内のスタティックテキスト(IDC_STATIC) へ文字列を表示したいのです。 また、現在の自分のLEVELでは説明を理解するのは困難である為 上記方法での追求は、困難を招くと考えられることから LevelUpしてから同じ仕様を上記方法で試したいと思います。 その時、カベにぶつかるような事がありましたら、 参考にさせていただきます。 ありがとうございました。

  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.2

> SetWindowText(hWnd, StrDat1); ここで親windowを指定しているからではないですか? SetWindowText(GetDlgItem(hWnd, IDC_STATIC), StrDat1); ではどうでしょう。 エラー処理無視ですが。

rewind
質問者

お礼

2度目の回答ありがとうございます。 試したところ、 親ウィンドウのタイトルバーに表示されなくなりました。 が、ダイアログ内のスタティックテキスト(IDC_STATIC) には、表示されませんでした。。。 StrDat1の中身をデバッガでも見たんですけど、 きちんと格納されていました。 必ずどこか間違っているはずなんですけど。 コントロールへアクセス出来ていないのでしょうか?

  • zzzzzz
  • ベストアンサー率61% (70/113)
回答No.1

GetDlgItem()でIDC_STATICに対応するコントロールのハンドルを取得し、 SetWindowText()を実行すればできませんか? windowsx.hのマクロStatic_SetText()を使った方がいいのかもしれませんが。

参考URL:
http://www.microsoft.com/japan/developer/library/jpuipf/_win32_setwindowtext.htm
rewind
質問者

お礼

回答ありがとうございます。 やっと試すことができました。 が、 GetDlgItem(hWnd, IDC_STATIC); SetWindowText(hWnd, StrDat1); とすると、親ウィンドウのタイトルバーが書き換えられちゃいます。 これは、ウィンドウハンドルの取得の仕方が間違っているのでしょうか?

関連するQ&A