VisualC++2005 「C2039 SetWindowTextAがCButton のメンバでは無い」と出てしまう

このQ&Aのポイント
  • VisualC++2005でプロジェクトにMFC拡張DLLを追加し、ボタンにメンバ変数を割り当てるとエラーが出ます
  • エラーの内容は、'SetWindowTextA'が'CButton'のメンバではないというものです
  • 継承されているメンバ関数は問題なく使用できますが、'CButton' 固有のメンバ関数は使用できません
回答を見る
  • ベストアンサー

VisualC++2005 「C2039 SetWindowTextAがCButton のメンバでは無い」と出てしまう。

VisualC++2005において、プロジェクト(ソリューション)を以下のように構成した場合に表記のエラーが出ます。 解決方法ご存知でしたら教えて下さい。 (MFC初心者です) 【構成】 ・新規のソリューションにMFCのMDI形式のプロジェクトを作成 ・さらにMFC拡張DLLのプロジェクトを作成する (1つのソリューションに2つのプロジェクトを同居させる) ・MDIのプロジェクトは特に何もしない ・MFC拡張DLL側でダイアログを1ヶ作成する ・作成したダイアログのクラスを作成 ・OnInitDialog()を作成 ・作成したダイアログにあるボタンにメンバ変数(例:m_Button)を割り当てる ・OnInitDialog()内でm_Button.SetWindowText("HOGE");と記述 ・コンパイルするとエラーが出る 【エラー】 error C2039: 'SetWindowTextA' : 'CButton' のメンバではありません。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(2990) : 'CButton' の宣言を確認してください。 特に変わったことをしているわけではありません。 さらに「m_Button.」と入力した時点で入力補助機能が働くので m_Buttonはちゃんと認識されていると思います。 'CButton' 固有のメンバ関数の使用には問題ありませんが、 継承されているメンバ関数はことごとくNGです。

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

  • ベストアンサー
回答No.1

m_Button.SetWindowText(L"HOGE"); または m_Button.SetWindowText(_T("HOGE")); としたらどうです? これで通るなら、UNICODEモードでコンパイルされています。

sakuzo3
質問者

お礼

解決しました! 教えて頂いた通りのコードでコンパイルが通りました。 なので、文字セットの設定を「UNICODEを使用」から「マルチバイトを使用」に変更し通常通りコンパイルが出来ました。 プロジェクトウィザードでDLLの作成をしようとした時は後から設定を変えなくてはいけないのですね。 勉強になりました。 ありがとうございます。

関連するQ&A

  • ラジオボタンのメンバ変数

    VC++6.0でMFC AppWizard(exe)というプロジェクト、ダイアログベースでプログラミングしています。 ダイアログにラジオボタンを三つ配置し、Radio1を右クリック→プロパティ→グループにチェックを入れました。 そして、IDC_RADIO1にメンバ変数m_Radio(int)を追加してコンパイルすると「問題が発生したため終了します」というダイアログが出ます・・。 メンバ変数を削除するとコンパイルは成功します。 何が間違いでこんなエラーが出るのでしょうか? どうかよろしくお願いします。

  • C++/CLIとMFC

    よろしくお願いします。 環境はVisual C++ 2005です。 ご存知の方がいらっしゃいましたらご教授ください。 一つのプロジェクトで作成した親Formに対して、 もう一つのプロジェクトで作成した子ウィンドウをプラグインさせ、MDIを作ろうとしているのですが [CLR]->[Windowsフォームアプリケーション]で作成したプロジェクトのFormに対して MFCで作成した子ウィンドウをプラグインさせることは可能なのでしょうか? C++/CLIでMDIを作る時は MDIの親となるFormのIsMdiContainerプロパティをtrueに設定し、 MDIの子となるFormのMdiParentプロパティをMDIの親Formの インスタンスに設定する必要があると思うのですが、 子の部分をMFCを使って作成した場合どのようにすれば 親子関係が作れるのかわからず質問させていただきました。 よろしくお願いします。

  • CColorDialogの拡張について

    始めまして。質問させて下さい。 VC++ 2005 MFCで開発しております。 CColorDialogのサブクラスを作成しています。 ダイアログ上にあるコントロールのVisibleを変更させようと思い、 サブクラスのOnInitDialogで CButton *pBtnOK = ( CButton* )GetDlgItem( IDOK ); CButton *pBtnCancel = ( CButton* )GetDlgItem( IDCANCEL ); if( pBtnOK != NULL ){ pBtnOK->ShowWindow( SW_HIDE ); } if( pBtnCancel != NULL ){ pBtnCancel->ShowWindow( SW_HIDE ); } としています。 「色の作成」ボタンのも同様の処理をしたいのですが、 コントロールIDがわからないため実装できません。 IDをご存じの方はいますでしょうか? また、別の方法等ございましたらご教授お願い致します。

  • visualstudioでc#のdllができない

    visualstudio2010を使用しています。 dllの作成をしたいのですが、なぜか作られません。 どこに手順を書きますのでどこに間違いがあるか教えてください。 (1)作成したプロジェクトを開く (2)ファイルー新しいプロジェクトを選択 (3)クラスライブラリを選択 (4)ソリューション(S):ソリューションに追加を選択ーOKボタン (5)DLLの中を書く (6)参照設定を選択する (7)ソリューションのプロパティのビルドでフォルダを指定する。 (8)ビルドする(もちろん通る) しかし、DLLはどこにも見当たらない。 検索しても、クラスライブラリを選択すれば自動的にできると書いてあるので、困り果てています 機能はMEFを使用し、僕ではない人が作ったDLLがすでに追加されており、僕もDLLを追加したいのですが、なぜかDLLが作成されません。 詳しいかたよろしくおねがいします。

  • MFC オリジナルDLLからエクスポートしたビュークラスを CMultiDocTemplate で登録すると Assert Failed! が出る

    環境はVisualStudio2005、MDIプロジェクトと拡張DLLプロジェクトを1つのソリューションに作成しています。 MDIアプリを作成していますが InitInstance() 関数内の CMultiDocTemplateの引数 RUNTIME_CLASS() 実行時にAssert Failed!が出ます。 CMultiDocTemplate に登録するビュークラスはオリジナルの拡張DLL内でCFormViewクラスから派生させたクラスです。 特に変わったことをしている訳ではなく、ほとんどウィザードがソースを吐いた状態のままです。 "COriginalView" をデフォルトの "CMyView" にするとエラーは出ません。 また、"COriginalView" もコントロールを1ヶ置いてビューフォームとクラスを作成し、 AFX_EXT_CLASS でエクスポートして参照できています。 また、MDI側でフォームとクラスを作成しそれを使用した場合はエラーは出ません。 ドキュメント/ビューアーキテクチャの理解が足りない為起きている問題だと思います。 宜しくお願い致します。 --- 詳細 ------------------------------------------------ CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,   RUNTIME_CLASS(CMyDoc),   RUNTIME_CLASS(CChildFrame),   RUNTIME_CLASS(CDllView)); ←これ実行時に Assert が出る AddDocTemplate(pDocTemplate); ---------------------------------------------------------

  • VC++.NET DLLからのダイアログの表示

    こんばんは。 VC++.NETでDLLを作成しました。 内容はダイアログを表示させるだけの単純なもので DLLの種類はMFC拡張DLLで作成しました。 (CDIALOGを継承したクラスTESTDIALOGのコンストラクタ、デストラクタがあるだけのもの) これをテスト用の単純なMFCアプリケーションで呼び出したところ ダイアログを表示させることができましたが 別の複雑なアプリケーション(DLLからDLLを呼ぶなどしている)で 呼び出したところダイアログが表示されません。 コンパイルエラーなどもでないし 何がいけないのか分かりません。 呼び出し側ではメニューにイベントハンドラを作ってそこで TESTDIALOG dlg; dlg.DoModal(); としているだけなのですが・・・ (デバッガで追ったところMFCのdlgcore.cppのCDialog::DoModalの m_lpDialogTemplateNameが不適切なptrとなる辺りに原因はありそうなのですが何故そうなるのかわかりません。) どなたかダイアログが表示されない原因がお分かりになる方 よろしくお願いします。

  • C++/CLIのDLLをC#で使う

    C++/CLIのDLLをC#で使う ソリューションの中にC++/CLIでクラスを作成し、出力がDLLのプロジェクトと、 C#でGUI画面の処理のプロジェクトがあります。 このときC#側でC++/CLI側で作ったDLLを使用したいのですが、やり方がわかりません。 DLL自体はC#のDebugフォルダに入っており、参照設定で読み込んでいます。 ご教授のほど、よろしくお願いいたします。

  • ダイアログから、ドキュメントのメンバ変数に設定するには

    MFCで現在 View-Documentの存在を知った程度の知識でプログラムを書いています。 MDI?形式でドキュメントにstrというCString型のメンバ変数を持たせています。 ViewからはGetDocumentで簡単にアクセスできますが、自作したダイアログボックス(例えばAbortのようなもの)の中にエディトボックスがあり、ここに入力された内容をドキュメントのメンバ変数strに代入したいのですが、どうすればよいのか分からず困っています。 あと、SDIやダイアログ形式でも同じように自作したダイアログのエディトボックスに入力した内容を設定したいです。 VBのInputBoxのようなことをしようとしていると想像してください。

  • VS2012でOnInitDialogが2回呼出し

    今までVC++5.0のMFCでプログラムを組んできたのですが、XPのからみでそろそろ限界かなと思いVisualStudio2012評価版を入れてみました。 試しに今までのプロジェクトを変換して色々エラーが出る所を直して何とか動くようになったのですが、モーダルダイアログのOnInitdialog()中でEndDialog()を呼び出すとOnInitdialog()がもう1度呼び出される現象が起きて困っています。 フラグを立てて2回目は処理をしないで直ぐに抜けるようにすればよいのですが、もっと根本的な解決方法は無いのでしょうか? バグでドウシヨウモナイデスヨ!でも結構ですので原因が知りたいです。

  • 参照するDLLを格納したフォルダをVSS管理したい。

    参照するDLLを格納したフォルダをVSS管理したい。 ソリューションに、プロジェクトA、プロジェクトBがあり、それぞれフォルダ1の中にある DLLを参照しています。 これをソリューションごとソース管理に追加したいのですが、他のメンバがVSSから 落とした場合、コンパイルが通らなくなるので、参照しているフォルダごとVSSに あげたいのですが…。 ソリューションにフォルダは追加できないようなので、VisualStudioからプロジェクトA、 プロジェクトBにそれぞれフォルダを作り、その中にそれぞれDLLを追加するしかないので しょうか? しかし、DLLのバージョンがあがった場合、大変手間です。 すべてのプロジェクトが同じDLLを参照し、かつ、そのDLLもソリューションに追加し、 ソース管理したときに一緒にVSSにアップロードされるようにはできないのでしょうか? ※VisualStudioは2005です。

専門家に質問してみよう