• ベストアンサー

ダイアログへ文字列を表示させる方法(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

  • ダイアログリソース内でボタンコントロールの表示を改行させたいんですけど

    VC++2005 win32アプリケーションにて ダイアログリソース内でボタンコントロールの表示を改行させたいんですけど、どうすれば出来ますか? いくらキャプションをイジッても出来ないので***.rcを色々イジってるんですが・・・ ・PUSHBUTTON "文字列1"\r\n"文字列2",IDC_BUTTON3,7,36,74,27 ・PUSHBUTTON "文字列1"+\r\n+"文字列2",IDC_BUTTON3,7,36,74,27 ・PUSHBUTTON "文字列1"&\r\n&"文字列2",IDC_BUTTON3,7,36,74,27 本当に初心者でアホなんで誰か教えてください。m__m

  • ダイアログを非表示にしたい

    VBAのAccessを使っているのですが、クエリを作成してパラメータに変数を入れると、実行したときに「パラメータの入力」というダイアログが出てきてしまいます。 パラメータはソースの中で指定して、このダイアログを非表示(出て来ない)にするためにはどうしたらいいいのでしょうか。

  • ダイアログなどの文字列が文字化けする

    VS2005でWindowsプログラムをし始めたばかりの初心者です。 タイトルのことで質問があります。 参考書として「猫でもわかるwindowsプログラミング」 というのを使っているのですがそのとおりにやっても文字化けするところか エラーでテストランできないです。 たとえば、デバッグ用にダイアログを表示させる方法として { char szBuf[256] wsprintf(szBuf, "x= %d",x); MessageBox(hWnd,szBuf,"Debug",MB_OK); } というものがのっているのですがとりあえず 「空のプロジェクト」を選択しないで普通に動く状態で実行させてみても「型が違うのでキャストしろ」というメッセージが出ます。 それでキャストするとエラーは出ないのですが文字化けします。 もっと簡単に { MessageBox(hWnd,"文字","Debug",MB_OK); } とかしてもやっぱり文字化けします。 しかしなぜか文字列に1から9を指定したときはそのまま表示されます。 10以上は容赦なく文字化けします。 参考書のほうはVS C++.NETを対象としているそうなのですがそのせいかもしれません。 どなたかわかる方よろしくお願いします。

  • ダイアログ内の文字列取得

    開発環境  Xp Home Edtion Microsoft Visual C++ 2008 Express Edition ダイアログのテキストボックスに入力された文字列を取得し、それをデバッグに表示するプログラムを作ろうとしています。 ですが、デバッグに表示されないのです。どのようにしたら良いでしょうか? リソースファイル IDM_SETTING DIALOG DISCARDABLE 0, 0, 154, 115 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 16 , "MS Shell Dlg" STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU CAPTION "設定画面" BEGIN EDITTEXT IDC_XS,35,15,40,14,ES_AUTOHSCROLL PUSHBUTTON "OK", IDOK,10,0,50,14,WS_GROUP END cppファイル HWND hnd; LPTSTR Lptdtr10; LPCSTR dsLPCSTR10; Lptdtr10 = (char*)malloc(32768); GetDlgItemText(hnd, IDC_XS , Lptdtr10, sizeof(Lptdtr10)); dsLPCSTR10 = (LPCSTR) Lptdtr10; char *ree; ree=(char*)dsLPCSTR10; String^ data=gcnew String(ree); System::Diagnostics::Debug::WriteLine(data); //ここで表示する

  • 自分の関数名を文字列で受け取る方法

    プログラムを作成している時につけた関数名をその関数の中で文字列として受け取る方法はあるのでしょうか。 (あるとしたらデバッグ文を作成する時にかなり生産性が上がると思われますので) 例 void xxxx() { printf("%s\n",???); } 画面に関数名を表示させたい(関数名の文字列を関数内でセットしない方法で) 可能かどうかも含めて、よろしくお願いします。

  • MessageBoxで表示される文字列の色を変えたい

    MS-VC++6.0を使っています。 MessageBoxで表示される文字列の一部を赤くしたいのですが、 このようなことは可能ですか?

  • プリンタへ文字列の出力方法について

    1、改行コード「\r\n」を含む文字列を取得 2、「印刷」コモンダイアログを呼出す。 3、TextOut()関数で出力する。 すると、改行されずに「・・」と文字化けされて出力される。 どうやらTextOut()関数では、改行コードがサポートされていない様でした。 そこで、質問です。 改行コードを含む文字列を、改行して出力する方法はないでしょうか? TextOut()関数で出力するには、 改行を含む文字列を、改行を含まない文字列に分けるしかないですよね? 良い方法がないかな?と思い質問させて頂きました。 #Win98、VC++、SDKで作成しています。

  • 任意の文字列で置換するダイアログ

    シート内の関数に記載されている「item」という文字列を 任意に置換するダイアログの作り方で困っております。 シート内には 「='C:\sales\[item.xls]id'!$F$48=0,"",'C:\sales\[item.xls]id'!$F$48))] という関数が入っており、 この「item」を「1200」や「1800」など任意の文字列をインプットボックスに入力し (itemから任意の文字列に)『すべて置換』したいと思っております。 どなたかご存知の方がおいででしたら、ご教示くださいますようお願いいたします。

  • 文字列とWriteFile関数について

    char* に格納した文字列をWriteFile関数でテキストファイルにそのまま書き込もうとすると MessageBoxで表示したときは改行されていたのに、Notepadで見ると改行されていませんでした。 どうすればこの問題は解決しますか?

  • 文字列ファイル表示プログラム

    Cプログラムの問題なのですが、 「複数の文字からなるファイルを読み込み、全て読み込んだ後に表示するプログラムを作成したいと思います。あらかじめ文字列を配列として宣言するのではなく、文字列の長さを確認した上で、malloc()標準関数でメモリを割り当て、表示しなさい」 文字列を宣言せずに、どうやったらファイルの中の文字列を読み込むことができるのでしょうか?その上、文字列の長さを確認したあとmalloc関数を使うにはどうすればいいのでしょうか。 どなたか教えてください。お願い致します。

専門家に質問してみよう