質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

7158閲覧

C++ ダイアログでOKボタンを押したら、ダイアログの文字を変更したい

ryo_se

総合スコア68

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/04/11 14:47

MFCでC++のダイアログ作成を勉強しています。(C++初心者です)

やりたいことは
①メニューバーからダイアログを開く
②ダイアログには「A」という文字を表示させ、OKボタンを押すと次ダイアログを開いた時は「B」を表示させる
キャンセルはそのまま。
③Bの時にOKを押したらまたAに戻る

ところが、②の段階で最初にダイアログを開いた時点で文字が表示されておらず(リソースビューでは「A」を記載しています)、下記のソースで「B」にしても次にダイアログを開くときはまた文字が表示されていない状態です。
デバッグしたところ、Bの表示自体はUpdateDataの部分で確かに適用されているようです。

ご教示のほどお願いいたします。

void CTest::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); //対象の文字IDと変数を紐づけ DDX_Text(pDX, IDC_TEST_STATIC, m_test); } BEGIN_MESSAGE_MAP(CTest, CDialogEx) ON_BN_CLICKED(IDOK, &CTest::OnBnClickedOk) END_MESSAGE_MAP() void CTest::OnBnClickedOk() { m_test="B"; UpdateData(FALSE); MessageBox(_T("test")); // TODO: ここにコントロール通知ハンドラー コードを追加します。 CDialogEx::OnOK(); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ソースで提示されていない箇所は想像になりますが、現在のソースではコンストラクタで

C++

1CTest::CTest(CWnd* pParent) 2: CDialog(CTest::IDD, pParent) 3, ... 4: 5, m_test(_T("")) 6, ... 7{ 8}

のようにm_testが初期化されているのではないでしょうか。
だとすると、メニューからダイアログを呼び出すたびにm_testが空文字列("")に初期化されてしまいます。

質問者さんが意図したとおりに動かすのであれば、

C++

1CString Gettest() const { 2 return m_test; 3} 4void Settest(const CString& strVal) { 5 m_test = strVal 6}

というようなアクセス関数(いわゆるゲッター/セッターというやつです)をヘッダファイル内に作って、呼び出しでダイアログを表示する際に、これを使って表示する文字を指定してやればよいです。
具体的には

C++

1// 呼び出し側の処理 2// メンバ変数にCString m_Buffer;が定義されているとする 3 4CTest testDlg; 5testDlg.Settest(m_Buffer); 6if (testDlg.DoModal() == IDOK) { 7 m_Buffer = testDlg.Gettest(); 8}

というように呼び出し側で表示する文字を覚えておくということで実現できます。

投稿2016/04/11 17:11

編集2016/04/11 17:11
KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo_se

2016/04/12 12:38

助かりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問