• ベストアンサー

GetDlgItemTextについて

現在、VisualStudio201にて(ダイアログベースの)プログラムを作っていますが、 GetDlgItemText()が期待通りにならず行き詰ってしまいました。 char wordx[256]; GetDlgItemText(IDC_EDIT_NO1, (LPTSTR)wordx, 256); 上記のような記述をしていて、エディトボックスには"ABC"を入力しているので、 wordxには、"ABC"が入ることを期待しています。 結果は、16進で表すと、0x41, 0, 0x42, 0, 0x43, 0 となってしまいます。もし、原因がわかればお教えください。

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

  • ベストアンサー
  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.2

とりあえずその場凌ぎの方法をお教えします。 プロジェクトのプロパティから「全般」ページの中の「文字セット」を、「Unicode文字セット」から「マルチバイト文字セット」に変更してください。 しかし問題の本質を理解していないと、またすぐに似たような問題にぶち当たるでしょう。 とりあえず「LPTSTR」で検索して勉強してください。

f16falcon2011
質問者

お礼

早速のご回答ありがとうございます。 文字セットの変更で文字列が正しく設定されることを確認しました。 ご指摘通り、勉強不足で、お手数をおかけしました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

なぜキャストしているんですか?

f16falcon2011
質問者

補足

初心者で申し訳ありません。 よく解らずキャストしていました。 そうしないとコンパイルが通らなかったので・・・ なお、以前は機能していたのですが、 おそらくWindows7にしてからのように思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VS2017を使った簡単なプログラムについて

    現在、VS2017(Visual Studio 2017 Professional)を使って、下のプログラムに示す簡単な計算をするダイアログベースのプログラムを作っています。 プログラムの流れとしては (1):[ + ]ボタンを押して2つの数値(エディトボックス1と2の値)の和を求めバッファに代入する。 (2):[ = ]ボタンを押してバッファの値をエディトボックス3に表示する。 という流れです。 (1)は動作したのですが、(2)のところでうまく表示されません。どうしたらよいでしょうか。教えてください。 以下に示すプログラムが和を求める部分とエディトボックスに表示させる部分です 変数zは外部で定義してあります。 ========▼以下プログラム============ void CMFCApplication2Dlg::OnBnClickedPlus() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 double x, y; //IDC_EDIT1に入力された値を変数m_strXに代入 GetDlgItemText(IDC_EDIT1, m_strX); //IDC_EDIT2に入力された値を変数m_strYに代入 GetDlgItemText(IDC_EDIT2, m_strY); //それぞれ文字列をdouble型に変換 x = _ttof(m_strX); y = _ttof(m_strY); //和を求めて、変数zに代入 z = x + y; } void CMFCApplication2Dlg::OnBnClickedEqual() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 WCHAR strAns[256]; //zを文字列に変換 wsprintf(strAns,_T("%4.3f"),z); //文字列をIDC_EDIT3に代入 SetDlgItemText(IDC_EDIT3,strAns); }

  • リソースのコントロールについて

    プログラム初心者です。 よろしくお願いします! 現在私は、visualstudio6.0のソフトで、リソース機能を持ちいてある機能の実現に向けてプログラムを書いています。 そこで質問なのですが、 たとえばリソース機能を用いてダイアログボックスにエディットボックスを20つ設けますと、それぞれIDC_EDIT1~IDC_EDIT20と計20個IDができますよね? その20個を私の書いているソースの中にそれぞれ違う値をいれたいので、 イメージでは for(i=1;i<21;i++){ IDC_EDIT[i] } というようにしたいのですが、IDC_EDIT[i]ではやはりコンパイルエラーが出てしまいます。ソースをずらずら長く書けばできないこともないのですが、大変な量になるので簡単にできないだろうかと検討中です。 この場合、ソースをコンパクトにすることは可能でしょうか?ご教授よろしくお願い致します。

  • クラスの扱いについて

    VCで簡単なプログラムを造っています。 ダイアログベースです。 エディットボックスへのアクセス方法がわかりません。 識者の方、ご教授願います。 簡単にソースを載せます。 以下は、ボタンを押した時に動作するルーチンです。 void CTestDialog::OnButton1() { CreateThread(, , Sub, , ,); } Sub() が作成されたスレッドで動作する関数です。 void Sub() { CString csText; csText.Format("てすと"); SetDlgItemText(IDC_EDIT1, csText); } IDC_EDIT1 が CTestDialogクラスのエディットボックスです。 Sub() の中でこのエディットボックスに書きたい。 Sub() を CTestDialogクラスとして定義するのか、または SetDlgItemText関数で IDC_EDIT1 が CTestDialogクラスであると 指定するのか、などわかりません。 どこに、どういう記述をすればいいか教えてください。

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

    開発環境  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); //ここで表示する

  • LineTo,MoveToについて

    MFCのダイアログベースで 変化を表すグラフを作成したのですが 線を描くときに原点復帰してしまいます。 左上のエディットに数値をいれ 実行を押すと座標(200,200)から横にエディットで入力した数値分線を引いていくというものです。 Timerを使い1秒ごとに書かせています。 void CsinDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。 static int count=0; static double i,x=0; char buf[100]; CString str; /*------描写設定----*/ CWnd* h = GetDlgItem(IDC_BB); CDC* pDC=h->GetDC(); //-----------------------------------// CEdit *edit = (CEdit*)GetDlgItem(IDC_EDIT1); edit->GetWindowText(str); i = atof((const char*)str); x=x+i; sprintf(buf,"%lf",x); siki_edit.SetWindowText(buf); /*---------------------------------------*/ if(count==0) pDC->MoveTo(200,200); // 座標(200,200) に移動 pDC->LineTo(200+x,200); // 座標(200+x,200) まで線を引く count++; h->ReleaseDC(pDC); CDialogEx::OnTimer(nIDEvent); } 実行結果は添付した画像のようになります。 イメージではcountが0の時だけMoveToで動かし、それ以降は座標(200,200)から横に線を引いていきたいのですが。 どのように直せばよいのでしょうか? LineToからLineToの指令ができないということでしょうか?

  • GetDlgItemInt( ) c++

    現在MFCでウィンドウプログラムを作成しています。 現在、エディットボックス(IDC_EDIT1)が1つあり その変数に CEdit m_ed1; と、もう1つ double d_ed1; があります。 どちらもIDC_EDIT1に対する変数です。 IDC_EDIT1で入力された値(2.56)をd_ed1に代入したいのです。 d_ed1 = GetDlgItemInt(IDC_EDIT1); としたらもちろん d_ed1には [2]しか入らないわけなのですが、 これを解消するにはどうしたらよいのでしょうか。 ご教授の程お願いいたします。

  • SetWindowText関数について

    プログラミング初心者です。 WINAPI32を用いて、プログラミングに励んでいます。 リソース機能を用いて、親ウインドウのメニューバーからダイアログという形で子ウインドウを開けるようなプログラムを作りました。さらにその子ウインドウ上に、エディットボックスのコントロールを作りました。 例えばそのエディットボックスのIDがIDC_EDIT1なのですが、 子ウインドウを開いた時にすでにそのエディットボックスに数値が入力されているようにしたいのです。 そこで、ダイアログが開かれた時に流れる WM_INITDIALOGのメッセージがきたときに、SetWindowText関数を使えばよいのかな?と思ったのですが、このようなとき第一パラメータにはどのような数値をいれたらエディットボックスに文字列を代入できますか?? IDC-EDIT1といれたら、Struct HWNDに変換してくださいというエラーがでました。 どなたかご教授よろしくお願いいたします。

  • ダイアログの領域全てをエデイトボックスが占めるプログラム

    お世話になります。 現在ダイアログにエディトボックス(IDC_EDIT1)を1つおいて、このエディトボックスがダイアログの全体を占める様なプログラムを作成しています。 以下のようなプログラムでは、サイズ変更をした時に初めてダイアログ内にエディトボックスが動的に占めるのですが、これをプログラムを起動したときから既にエディトボックスがダイアログの全体を占めている状態にしたいのですが、どのようにすればよいでしょうか? 開発環境はVC++ 6.0 MFC WindXPです。 ご教示よろしくお願いします。 プログラム: void CxxxDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください CRect rect; CWnd* pEdit = GetDlgItem( IDC_EDIT1 ); GetClientRect(&rect); if( pEdit != NULL ) { rect=CRect(0,0,cx,cy); pEdit->MoveWindow( &rect, TRUE ); } }

  • エディットボックスでテキストの最後に入力したい?

    エディットボックスで最後の位置に ( が入力されたときに閉じ括弧の ) を出力して () としたいのです が、下のコードだと ( が入ったときに )( となってしまいます。いろいろ試していますが () と出力 できないので、わかる方よろしくお願いします。 int nStartChar, nEndChar; CEdit *edit1 = (CEdit *) GetDlgItem(IDC_EDIT1); if(pMsg->message == WM_CHAR) if(pMsg->wParam == '(') { edit1->GetSel(nStartChar, nEndChar); edit1->SetSel(nStartChar, nEndChar); edit1->ReplaceSel(")"); }

  • 変数の代入について

    ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }