リストボックスで選んだ項目ををエディターに表示させるには?

解決


ペンネーム  2009-07-14 14:27:18  No: 70571  IP: [192.*.*.*]

たびたび申し訳ありません。
実は、OnInitDlgでポインタを使わずに
リストボックスに項目を追加して、
右のマウスボタンでダイヤログが開き、
リストボックスで何かひとつ項目を選んで、
OKボタンを押すと、その選んだ項目が
エディターに表示される、
といったことをしておりまして、
そのリストボックスで選んだ項目をエディター
に表示させるには、どうすればいいかわかりません。
お忙しい中申し訳ありませんが、わかる方教えたいただけない
でしょうか?

編集 削除
ペンネーム  2009-07-14 16:27:45  No: 70572  IP: [192.*.*.*]

まず、m_naniwoとm_donoyouniをコントロール変数で登録して、
DlgクラスのOnInitDlgで以下のようにコードを書き込みました。
BOOL CkihonkeiDlg::OnInitDialog() 
{
  CDialog::OnInitDialog();
  m_naniwo.AddString("美しい笑顔");
  m_naniwo.AddString("きれいな心");
  m_naniwo.AddString("しつこい性格");
  m_donoyouni.AddString("すごく好きです");
  m_donoyouni.AddString("とても好きです");
  m_donoyouni.AddString("まあまあ好きです");
  m_donoyouni.SetCurSel(0);
  return TRUE;
}
それで、ViewクラスのONRButtonDownで以下のようにしたのですが、
「temp +="私はあなたの" + dlg.m_naniwo;」と
「temp +="を" + dlg.m_donoyouni;」の箇所で引っかかります。
以上2箇所には、何か足りないものがあるのでしょうか?
教えていただきたいのですが・・・
void CMyLoveView::OnRButtonDown(UINT nFlags, CPoint point) 
{
  CkihonkeiDlg dlg;
  dlg.m_keisyo=0;
  
  dlg.m_date=true;
  if(dlg.DoModal()==IDOK){
    CEdit& edit=GetEditCtrl();
    CString temp;
    CString x[2]={"さん","くん"};
    temp=dlg.m_name+x[dlg.m_keisyo] + "\r\n好きです。                                                              \r\n";
    temp +="私はあなたの" + dlg.m_naniwo;
    temp +="を" + dlg.m_donoyouni;
    edit.SetWindowText(temp);
  }
  CEditView::OnRButtonDown(nFlags, point);
}

編集 削除
maru  2009-07-14 16:41:26  No: 70573  IP: [192.*.*.*]

文字列ポインタにCListBoxの加算はできないとおもう。

temp +="私はあなたの" + dlg.m_naniwo.GetWindowText();
かな。
temp +="私はあなたの";
temp +=dlg.m_naniwo.GetWindowText();
にする必要があるかも。

編集 削除
maru  2009-07-14 16:45:54  No: 70574  IP: [192.*.*.*]

しまった。

void GetWindowText(CString& rString) const;
だから、
一旦CStringにテキストを取得する必要があるな。

CString strList;
dlg.m_naniwo.GetWindowText(strList);
temp +="私はあなたの" + strList;

編集 削除
Blue  2009-07-14 16:46:08  No: 70575  IP: [192.*.*.*]

ダイアログを閉じてしまったら、コントロールにアクセスできないので、
ダイアログ側のOnOKイベントで適当なCStringメンバ変数を用意して格納し、
それを使うようにしては。

何いっているかわからない場合は、入門書から勉強してください。

編集 削除
maru  2009-07-14 16:49:03  No: 70576  IP: [192.*.*.*]

おっとっと。

> ダイアログを閉じてしまったら、コントロールにアクセスできないので、
> ダイアログ側のOnOKイベントで適当なCStringメンバ変数を用意して格納し、
> それを使うようにしては。
こっちでしたか。

編集 削除
ペンネーム  2009-07-14 17:10:53  No: 70577  IP: [192.*.*.*]

> ダイアログを閉じてしまったら、コントロールにアクセスできないので、
> ダイアログ側のOnOKイベントで適当なCStringメンバ変数を用意して格納し、
> それを使うようにしては。
意味がよくわからないんですが、要は、ClassWizardでIDOKイベント
に変数を追加することでしょうか?
そうした上で、
CString strList;
dlg.m_naniwo.GetWindowText(strList);
temp +="私はあなたの" + strList;
を行うんでしょうか?

編集 削除
Blue  2009-07-14 17:32:50  No: 70578  IP: [192.*.*.*]

http://laboratory.sub.jp/c++/22.html

3,ダイアログの変数
を参考にメンバ変数をpublicでダイアログに追加する。


OKボタンを押すイベントはリソースエディタでダブルクリックすれば追加されるので、そこにコードを記入。


いまだにVC++6.0を使っているのか、、、

編集 削除
Blue  2009-07-14 17:36:18  No: 70579  IP: [192.*.*.*]

参考サイトはVC++6.0のものではなかったw
publicとか指定できるのがあったのにないとおもったら
>Microsoft Visual C++ Ver 4.0
orz

http://www.vcppclub.com/kouza/beginner/beginner2.html

■ 通常のメンバ変数の追加
を参考に。

編集 削除
ペンネーム  2009-07-14 17:38:41  No: 70580  IP: [192.*.*.*]

使っているのは、vc++Ver6です。

編集 削除
ペンネーム  2009-07-14 18:10:01  No: 70581  IP: [192.*.*.*]

よくわかりません。
ダイアログ側のOnOKイベントってどこを
さすのでしょうか?
ちなみに、今の状態でやったら、
コンパイルは通ったのですが、
実行でエラーになりました。
FILE  WINCORE.CPP
Line1074
です。

編集 削除
maru  2009-07-14 18:20:31  No: 70582  IP: [192.*.*.*]

> ダイアログ側のOnOKイベントってどこをさすのでしょうか?

> OKボタンを押すイベントはリソースエディタでダブルクリックすれば追加されるので、そこにコードを記入。

class CkihonkeiDlg
{
...
public:
 CString m_str1; // 追加
 CString m_str1; // 追加
...
}
void CkihonkeiDlg::OnOK(/*引数は忘れた*/)
{
 m_naniwo.GetWindowText(m_str1);
 m_donoyouni.GetWindowText(m_str2);
 CDialog::OnOK();
}
void CMyLoveView::OnRButtonDown(UINT nFlags, CPoint point) 
{
...
 temp +="私はあなたの" + dlg.m_str1;
 temp +="を" + dlg.m_str2;
...
}

編集 削除
maru  2009-07-15 10:06:21  No: 70583  IP: [192.*.*.*]

> CString m_str1; // 追加
> CString m_str1; // 追加

間違い修正
 CString m_str1; // 追加
 CString m_str2; // 追加

編集 削除
ペンネーム  2009-07-15 10:09:33  No: 70584  IP: [192.*.*.*]

maruさんどうもありがとうございました。
上のエラーの件は、解決しました。
また、ひとつお聞きしたいことがございまして、
今度は、リストボックスで、選んだ項目が
エディターに表示されなくなりました。
なにか設定忘れ戸かあるのでしょうか?
お忙しい中、教えていただきたいのですが・・・

編集 削除
ペンネーム  2009-07-15 10:41:23  No: 70585  IP: [192.*.*.*]

上の表記に誤字がありました。
すみません。
なにか設定忘れ戸かあるのでしょうか?

なにか設定忘れ等があるのでしょうか?

編集 削除
maru  2009-07-15 11:29:58  No: 70586  IP: [192.*.*.*]

> なにか設定忘れ等があるのでしょうか?
あなたがどこにどんな設定をしているのはわかりませんので、回答しようが有りません。

> 今度は、リストボックスで、選んだ項目が
> エディターに表示されなくなりました。
CkihonkeiDlg::OnOK()のm_naniwo.GetWindowText(m_str1);
でリストボックスで選んだ項目がとれているか、
CMyLoveView::OnRButtonDown(UINT nFlags, CPoint point) で
dlg.m_str1がどうなっているかをデバッガで追って見てください。

編集 削除
ペンネーム  2009-07-15 11:51:25  No: 70587  IP: [192.*.*.*]

>CkihonkeiDlg::OnOK()のm_naniwo.GetWindowText(m_str1);
>でリストボックスで選んだ項目がとれているか、

デバッガで追ってみたのですが、
CkihonkeiDlg::OnOK()のm_naniwo.GetWindowText(m_str1);
のところでは、項目は取れていませんでした。

>CMyLoveView::OnRButtonDown(UINT nFlags, CPoint point) で
>dlg.m_str1がどうなっているかをデバッガで追って見てください。
同じように取れていません。

編集 削除
maru  2009-07-15 12:18:30  No: 70588  IP: [192.*.*.*]

失礼、別のコントロールと勘違いしてました。
void CkihonkeiDlg::OnOK()
{
 int nSel = naniwo.GetCurSel();
 if (nSel != LB=ERR)
 {
   m_naniwo.GetText(nSel, m_str1);
 }
 CDialog::OnOK();
}
です。

編集 削除
ペンネーム  2009-07-15 13:18:18  No: 70589  IP: [192.*.*.*]

maruさん、本当にどうもありがとうございました。
長い間、お手数おかけしました。
おかげさまでうまくいきました。
本当にどうもありがとうございました。

大変申し訳ないのですが、
ちなみに
>if (nSel!= LB=ERR)
if (nSel!= CB_ERR)
の間違えですよ・・・

編集 削除
maru  2009-07-15 15:19:47  No: 70590  IP: [192.*.*.*]

> >if (nSel!= LB=ERR)
> if (nSel!= CB_ERR)
> の間違えですよ・・・
おっとっと。ちょっと打ち間違い。
LB_ERRの間違いです。CB_ERRはCCombBoxのエラー。
値は両方とも-1だから間違いじゃないけどね。
HELPをみてね。

編集 削除