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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

解決済

2回答

3809閲覧

エディットコントロールに入力された数値を計算に利用する方法等を教えてください!

don

総合スコア10

MFC

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

0クリップ

投稿2022/07/25 14:22

前提

C++でMFCアプリケーションを勉強し始めた初心者です。

実現したいこと

・エディットコントロールに入力された数値を変数に受け取り、ボタンイベントの関数内で計算に利用したい。
・身長と体重のエディットコントロールに入力値がある時のみ、ボタンを有効にする。

発生している問題・エラーメッセージ

エディットコントロールに追加する変数をdouble型で定義すれば、ボタンイベント内での計算に使えるのですが、その他の処理でCEditクラスの関数を利用したいため、エディットコントロールに追加する変数をCEdit型としてコードを書きたい。
もしくは他に良い方法があればご教授願いたいです。

該当のソースコード

C++

1// BMIviewerDlg.h 2 3// 実装 4protected: 5 HICON m_hIcon; 6 7 // 生成された、メッセージ割り当て関数 8 virtual BOOL OnInitDialog(); 9 afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 10 afx_msg void OnPaint(); 11 afx_msg HCURSOR OnQueryDragIcon(); 12 DECLARE_MESSAGE_MAP() 13public: 14 afx_msg void OnBnClickedButton1(); 15 CListCtrl m_ListCtrl; 16 CEdit m_Height; 17 CEdit m_Weight; 18 CEdit m_BMI; 19 afx_msg void OnBnClickedButton2(); 20 afx_msg void OnBnClickedButton3(); 21 22// BMIviewerDlg.cpp 23 24// 初期状態:無効化 25// エディットコントロールに入力された身長、体重からBMIを計算する関数 26void CBMIviewerDlg::OnBnClickedButton1() 27{ 28// ↓出来てません。 29 UpdateData( true ); 30 31 TCHAR Buf1[128]; 32 TCHAR Buf2[128]; 33 TCHAR Buf3[128]; 34 35 //GetWindowText( IDC_EDIT1, Buf1, 5 ); 36 //GetWindowText( IDC_EDIT2, Buf2, 5 ); 37 //GetWindowText( IDC_EDIT3, Buf3, 4 ); 38 39 double dHeight = _tstof( Buf1 ); 40 double dWeight = _tstof( Buf2 ); 41 double dBMI = _tstof( Buf3 ); 42 43 44 dBMI = ( dWeight / ( ( dHeight / 100 ) * ( dHeight / 100 ) )); 45 46 47 if( 18.50 > dBMI ){// 痩せぎみ 48 49 } 50 51 if( 18.50 <= dBMI 52 && 25.00 > dBMI ){// 普通体重 53 54 } 55 56 if( 25.00 <= dBMI ){// 肥満 57 58 } 59 60 UpdateData( false ); 61} 62 63// 初期状態:無効化 64// エディットコントロール内の数値をクリア 65void CBMIviewerDlg::OnBnClickedButton2() 66{ 67 68 m_Height.Clear(); 69 m_Weight.Clear(); 70 m_BMI.Clear(); 71 72 // 身長・体重の値がクリアされるため、計算ボタンと記録ボタンを無効化 73 CButton *button1 = ( CButton * ) GetDlgItem( IDC_BUTTON1 ); 74 button1->EnableWindow( FALSE ); 75 76 CButton *button3 = ( CButton * ) GetDlgItem( IDC_BUTTON3 ); 77 button3->EnableWindow( FALSE ); 78} 79 80// 初期状態:無効化 81// 身長・体重・BMI・肥満度に数値があるときにリストにそれらを記録 82void CBMIviewerDlg::OnBnClickedButton3() 83{ 84 85 86} 87

補足情報(FW/ツールのバージョンなど)

visual studioのバージョンは2022です。
MFCのダイアログベース、
スタティックライブラリでMFCを使用
マルチバイト文字セット
を利用しています。

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

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

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

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

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

yominet

2022/07/25 18:11

例えば、m_Height.GetWindowText()でとれませんか?
dodox86

2022/07/26 01:19

> エディットコントロールに追加する変数をCEdit型としてコードを書きたい。 ですが、CEdit型のメンバー変数 m_Height, m_Weight, m_BMI が既に宣言されていますが、これはVisual Studioからクラスウィザードや「変数の追加」などで追加したものですか? それとも手動(自力)で書いたものでしょうか。
dodox86

2022/07/26 01:44

MFCにはDDX(Dialog Data Exchange)と言う機構がもともとあって、ダイアログボックス中のコントロール、本質問ではEDITコントロールつまりCEditのメンバー変数をおおむね自動的に割り付けて、そのメンバー変数経由でデータの操作をすることができます。 [ダイアログ データ エクスチェンジ] https://docs.microsoft.com/ja-jp/cpp/mfc/dialog-data-exchange?view=msvc-170 MFC特有の方法だしクセもあるし、分からないところに無理して使うこともないですが。
don

2022/07/26 07:01

dodox86さん それらの変数は変数の追加機能を使って追加しました! そんな機能があるんですか。 使えるようになれば便利そうなことはわかりました。 調べてみます!
dodox86

2022/07/26 07:31 編集

> それらの変数は変数の追加機能を使って追加しました! そうであれば正にDDXを使う為の操作です。使うべき、あるいはせっかくなので使えるようになっておいた方が得、でしょうね。doubleのメンバー変数を割り当てておいてEDITコントロールの入力文字列を自動的にdoubleに変換して格納することもできます。簡単な範囲チェック、エラー表示などもできます。
guest

回答2

0

ベストアンサー

エディットコントロールをCEditの変数に割り当てたからと言って、再度double型の変数に割り当てられないわけではありません。両方に割り当てればいいだけです。
ボタンの有効/無効切り替えは、エディットコントロールのEN_UPDATEに対するハンドラーを作成して、内容が変更された時にチェックするようにすれば実現できます。

投稿2022/07/26 05:24

m-take

総合スコア249

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

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

don

2022/07/26 07:03

1つのオブジェクト?(エディットコントロールなど)に2つ以上変数があっても良いのでしょうか? ダメなんて記述は見たことないですが、感覚的にあまりよくない気がして汗
m-take

2022/07/26 08:18

CEditのようなCWnd派生クラスに対してコントロールを割り当てた場合、該当するクラスのインスタンスに対してコントロールのウィンドウハンドルがアタッチされます。 値型の変数を割り当てた場合、UpdateDataが呼び出された段階で、コントロールに設定されているデータを取得して変数に設定、または変数の値をコントロールに設定します。 両方の処理があっても、特に支障はないと思いますし、実際今まで使っていて問題が出たことはありません。
don

2022/07/26 11:21

なるほど! 丁寧にご説明いただきありがとうございました! 一応ほかの回答者の方のやり方と両方確認してみてどちらも意図したとおりに動きました!
don

2022/07/26 11:35

すみません追加になるんですが、エディットコントロールのEN_UPDATEに対するハンドラを作る際、複数のエディットコントロールを選択する方法はないんでしょうか? 例えば、エディットコントロール1とエディットコントロール2の両方が更新されたとき に処理をしたいです。
don

2022/07/26 11:55

なるほど、できるかわかりませんが調べてやってみます! 度々ありがとうございました!
guest

0

たとえばこんなカンジでいかがでしょ。

C++

1void CBMIviewerDlg::OnBnClickedButton1() 2{ 3 char buffer[100]; 4 GetDlgItem(IDC_WEIGHT)->GetWindowText(buffer, 100); 5 double weight = _tstof(buffer); // 体重 6 GetDlgItem(IDC_HEIGHT)->GetWindowText(buffer, 100); 7 double height = _tstof(buffer) / 100; // 身長(cm -> m) 8 double bmi = weight / height / height; // BMI値を 9 sprintf(buffer, "%lf", bmi); // 文字列に変換し 10 GetDlgItem(IDC_BMI)->SetWindowText(buffer); // EditBoxに書く 11}

edit-controlがメンバ変数 editXXX_ にアタッチされているなら:

C++

1void CMFCApplication3Dlg::OnBnClickedButton1() 2{ 3 char buffer[100]; 4 editWeight_.GetWindowText(buffer, 100); 5 double weight = _tstof(buffer); 6 editHeight_.GetWindowText(buffer, 100); 7 double height = _tstof(buffer) / 100; 8 double bmi = weight / height / height; 9 sprintf(buffer, "%lf", bmi); 10 editBMI_.SetWindowText(buffer); 11}

投稿2022/07/25 23:59

編集2022/07/26 03:15
episteme

総合スコア16614

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

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

m-take

2022/07/26 08:25

このコードって、_UNICODEが定義されている時のことが考慮されてないですよね。
m-take

2022/07/26 08:27

質問者の条件に合わせているのであれば、_tstofの部分も合わせておくべきかと。
episteme

2022/07/26 11:22

> _UNICODEが定義されている時のことが考慮されてないですよね。 ですね。 // これでいいかな? TCHAR buffer[100]; editWeight_.GetWindowText(buffer, 100); double weight = _tstof(buffer); editHeight_.GetWindowText(buffer, 100); double height = _tstof(buffer) / 100; double bmi = weight / height / height; _stprintf(buffer, _T("%lf"), bmi); editBMI_.SetWindowText(buffer);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問