ページ 11

MFC

Posted: 2008年12月16日(火) 10:09
by ざこ
超初心者的な質問で申し訳ないのですが・・
MFCのダイアログベースで関数を追加すると例えばButtonをクリックしたときに実行する とした場合

void CMyDlg::OnButton1()
{
}

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

Re:MFC

Posted: 2008年12月16日(火) 10:14
by たかぎ
> この関数の結果を返したいんですが

どこに返すのですか?

Re:MFC

Posted: 2008年12月16日(火) 10:36
by ざこ
関数の呼び出し元かな・・

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

void CMyDlg::OnButton2()
{
}

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

Re:MFC

Posted: 2008年12月16日(火) 10:49
by Blue
誰がそれらを呼ぶのでしょうか?
ふつうはWindowsのメッセージループから呼ばれる関数ですし。

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

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

Re:MFC

Posted: 2008年12月16日(火) 11:13
by ざこ
ほんとはちょっと違う感じだったんですがわかりやすい質問にする為ちょっとかえてました。
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->がありませんとか言われてしました。

Re:MFC

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

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

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

Re:MFC

Posted: 2008年12月16日(火) 11:27
by ざこ
アロー演算子は初めてみたのでまだ不完全です。わかりやすい説明ありがとうございます。

Re:MFC

Posted: 2008年12月16日(火) 13:22
by ざこ
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

Posted: 2008年12月16日(火) 13:50
by たいちう
これはどうですか?
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

Posted: 2008年12月16日(火) 14:09
by ざこ
それでちゃんとできますね。ありがとうございました。

Re:MFC

Posted: 2008年12月16日(火) 14:35
by バグ
せっかくMFCを使うなら、もう少しMFCっぽく判定しましょう。
if (a1 == "文字列" && a2 == "文字列" && a3 == "文字列")
{
	実行文;
}
これでいいんではないかと…