MFC

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ざこ

MFC

#1

投稿記事 by ざこ » 16年前

超初心者的な質問で申し訳ないのですが・・
MFCのダイアログベースで関数を追加すると例えばButtonをクリックしたときに実行する とした場合

void CMyDlg::OnButton1()
{
}

な感じの始まりになりますよね。この関数の結果を返したいんですがこの型はvoidで戻り値を設定できないです。
どういじくれば戻り値を設定できるのか教えて下さい。

たかぎ

Re:MFC

#2

投稿記事 by たかぎ » 16年前

> この関数の結果を返したいんですが

どこに返すのですか?

ざこ

Re:MFC

#3

投稿記事 by ざこ » 16年前

関数の呼び出し元かな・・

例えば
void CMyDlg::OnButton1()
{
}

void CMyDlg::OnButton2()
{
}

の関数の2つの結果を元に判定がしたいのです。

Blue

Re:MFC

#4

投稿記事 by Blue » 16年前

誰がそれらを呼ぶのでしょうか?
ふつうはWindowsのメッセージループから呼ばれる関数ですし。

どちらかのボタンを押したという情報を持ちたいのであればメンバ変数か何かを使ってみては。
そうではなくて、WM_COMMANDメッセージ以外ではなく明に呼ぶのであれば、戻り値を返す関数を
新たに作って、OnButton1ではそれを呼ぶような仕組みにしましょう。
void CMyDlg::OnButton1()
{
     this->funcButton1();
} 

int CMyDlg::funcButton1()
{
     int hoge;
     // 処理
     return hoge;
}

ざこ

Re:MFC

#5

投稿記事 by ざこ » 16年前

ほんとはちょっと違う感じだったんですがわかりやすい質問にする為ちょっとかえてました。
void CMyDlg::OnDropdownCombo1
{
   CComboBox *p1;
     p1=(CComboBox *)GetDlgItem(IDC_COMBO1);
     CString a1;
     p1->GetWindowText(a1);
} 

void CMyDlg::OnDropdownCombo2
{
  CComboBox *p2;
     p2=(CComboBox *)GetDlgItem(IDC_COMBO2);
     CString a2;
     p2->GetWindowText(a2);
    } 

void CMyDlg::OnDropdownCombo3
{ CComboBox *p3;
     p3=(CComboBox *)GetDlgItem(IDC_COMBO3);
     CString a3;
     p3->GetWindowText(a3);
    }
で3つの関数が同じ結果(a1とa2とa3が同じ値)を返した場合、実行する文がほしいんですね。
void CMyDlg::OnDropdownCombo1
{
CString a1;
  a1->hantei;
}

void CMyDlg::OnDropdownCombo2
{
CSrting a2;
a2->hantei;
}

void CMyDlg::OnDropdownCombo3
{
CString a3;
a3->hantei
}


int hantei{
実行文
}

というような感じでしょうか?ちょっと試したらCStringにはoperator->がありませんとか言われてしました。

Blue

Re:MFC

#6

投稿記事 by Blue » 16年前

1つのコンボボックスの処理が他の2つのコンボボックスの選択状態によって変わるということでしょうか?
戻り値があったところでどこにも格納できないわけですので、
前述通り、メンバ変数を使うか、逐一GetDlgItemで3つの値を取得するかどちらかでしょう。

アロー演算子(->)は通常はポインタ変数に対して使うものですが、
そこらへんの基礎知識は大丈夫でしょうか?
CString a;
の場合、ポインタ変数ではないので、「.」でメンバ関数を呼び出します。
(何でもかんでも->ではない)

また、CStringにhanteiというメンバ関数はないのでどっちにせよコンパイルエラーでしょう。
ダイアログのメンバ関数であれば this->hantei または単に hantei で呼び出せます。
(ダイアログの値に依存するのでメンバ関数にするのが普通でしょう。)

ざこ

Re:MFC

#7

投稿記事 by ざこ » 16年前

アロー演算子は初めてみたのでまだ不完全です。わかりやすい説明ありがとうございます。

ざこ

Re:MFC

#8

投稿記事 by ざこ » 16年前

void CMyDlg::OnDropdownCombo1
{
   CComboBox *p1;
     p1=(CComboBox *)GetDlgItem(IDC_COMBO1);
     CString a1;
     p1->GetWindowText(a1);
} 

void CMyDlg::OnDropdownCombo2
{
  CComboBox *p2;
     p2=(CComboBox *)GetDlgItem(IDC_COMBO2);
     CString a2;
     p2->GetWindowText(a2);
    } 

void CMyDlg::OnDropdownCombo3
{ CComboBox *p3;
     p3=(CComboBox *)GetDlgItem(IDC_COMBO3);
     CString a3;
     p3->GetWindowText(a3);
    } 

//メンバ関数を追加。

void CMyDlg::hantei(CString a1,CString a2, CString a3)
{
  if(strcmp(a1,"文字列")==0){
    if(strcmp(a2,"文字列")==0)
      if(strcmp(a3,"文字列")==0){


  実行文;
}
としましてエラーはでないのですが判定の方ができてないです。
間違っている点をご指摘お願いします。

たいちう

Re:MFC

#9

投稿記事 by たいちう » 16年前

これはどうですか?
void CMyDlg::OnDropdownCombo1
{
	hantei();
}

void CMyDlg::OnDropdownCombo2
{
	hantei();
}

void CMyDlg::OnDropdownCombo3
{
	hantei();
}

void CMyDlg::hantei()
{
	CComboBox *p1 = (CComboBox *)GetDlgItem(IDC_COMBO1);
	CComboBox *p2 = (CComboBox *)GetDlgItem(IDC_COMBO2);
	CComboBox *p3 = (CComboBox *)GetDlgItem(IDC_COMBO3);

	CString a1, a2, a3;
	p1->GetWindowText(a1);
	p2->GetWindowText(a2);
	p3->GetWindowText(a3);

	if(strcmp(a1,"文字列")==0)
		if(strcmp(a2,"文字列")==0)
			if(strcmp(a3,"文字列")==0){
				実行文;
			}

}

ざこ

Re:MFC

#10

投稿記事 by ざこ » 16年前

それでちゃんとできますね。ありがとうございました。

バグ

Re:MFC

#11

投稿記事 by バグ » 16年前

せっかくMFCを使うなら、もう少しMFCっぽく判定しましょう。
if (a1 == "文字列" && a2 == "文字列" && a3 == "文字列")
{
	実行文;
}
これでいいんではないかと…

閉鎖

“C言語何でも質問掲示板” へ戻る