• ベストアンサー

親ウィンドウの変数の変更

以下のようにクライアント領域をダブルクリックして、モーダルダイアログを表示し ダイアログからCPPPViewのメンバ変数flgを変更しましたが、 CPPPView内では変更結果が反映させていません。 どうしてなのでしょうか? またどうすれば変更されるようになりますか? void CPPPView::OnLButtonDblClk(UINT nFlags, CPoint point) {    CHenkouDlg dlg;    dlg.DoModal();           //  ここではflgが99になっていない    CView::OnLButtonDblClk(nFlags, point); } void CHenkouDlg::OnOK() {    CPPPView* my = (CPPPView*)GetParent();    my->flg=99;    CDialog::OnOK(); }

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>CPPPView* my = (CPPPView*)GetParent(); >my->flg=99; 親ウィンドウはViewではありません。 この処理はメモリ破壊を起こしてます。 親ウィンドウのViewウィンドウを取得する必要があります。 CPPPView* my = (CPPPView*)((CFrameWnd*)GetParent())->GetActiveView();

VitaminBB
質問者

お礼

#1さん #2さん回答ありがとう御座います。 どちらの方法でもうまく行きました。 改めて色々な方法が有るものだなと思いました。 そこで、逆にCPPPView内から値を取得する場合、以下の方法が一般的?だと思うのですが、 (実はこの方法が分からなくて最初の質問をしました) これ以外にも方法があれば紹介下さい。 void CPPPView::OnLButtonDblClk(UINT nFlags, CPoint point) {    CHenkouDlg dlg;    dlg.DoModal();           flg=dlg.aa;    CView::OnLButtonDblClk(nFlags, point); } void CHenkouDlg::OnOK() {    aa=99;    CDialog::OnOK(); }

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>   flg=dlg.aa; いいんじゃないですか?それで。 あとは無理やりなことしか思いつかないですけど。

VitaminBB
質問者

お礼

回答ありがとうございます。

回答No.2

void CPPPView::OnLButtonDblClk(UINT nFlags, CPoint point) {    CHenkouDlg dlg(this); // 変更    dlg.DoModal();           CView::OnLButtonDblClk(nFlags, point); } void CHenkouDlg::OnOK() {    CPPPView* my = (CPPPView*)m_pParentWnd; // 変更    my->flg=99;    CDialog::OnOK(); }

VitaminBB
質問者

お礼

#1さん #2さん回答ありがとう御座います。 どちらの方法でもうまく行きました。 改めて色々な方法が有るものだなと思いました。 そこで、逆にCPPPView内から値を取得する場合、以下の方法が一般的?だと思うのですが、 (実はこの方法が分からなくて最初の質問をしました) これ以外にも方法があれば紹介下さい。 void CPPPView::OnLButtonDblClk(UINT nFlags, CPoint point) {    CHenkouDlg dlg;    dlg.DoModal();           flg=dlg.aa;    CView::OnLButtonDblClk(nFlags, point); } void CHenkouDlg::OnOK() {    aa=99;    CDialog::OnOK(); }

関連するQ&A

  • SendMessage();の使い方

    よろしくお願いします。 <環境> WIN98 VC++6.0 MFC SDIにてウィンドウをクリックすると、モードレスダイアログ1とモーダルダイア ログ2が開くようにしました。 void CMy222View::OnLButtonDown(UINT nFlags, CPoint point) { CDlg1 *dlg; dlg = new CDlg1; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); CDlg2 dlg2; dlg2.DoModal(); CView::OnLButtonDown(nFlags, point); } ダイアログ2のボタン押し下げにてダイアログ1のボタン1を押し下げたいのですが 、どのようにすれば実現できるのでしょうか? void CDlg2::OnButton2() { SendMessage(); //■ここの書き方が分かりません CDialog::OnOK(); } 宜しくお願いいたします。

  • ドラッグしたときにマウスカーソルを変更するには?

    こんにちは。 VC6.0 MFCで開発しています。 マウスカーソルの形状をウィンドウをドラッグしているときとしていないときで 違ったものに変更したいのですが、うまくいきません。 ソースはこんなふうにしています。 ↓ void CTest::OnLButtonDown(UINT nFlags, CPoint point) { //変更する SetCursor(AfxGetApp()->LoadCursor( IDC_CUR2 )); CDialog::OnLButtonDown(nFlags, point); } void CTest::OnLButtonUp(UINT nFlags, CPoint point) { //元に戻す SetCursor(AfxGetApp()->LoadCursor( IDC_CUR1 )); CDialog::OnLButtonUp(nFlags, point); } どうぞ宜しくお願いします。

  • 左ボタンアップを作動するようにするには

    環境 VC++6.0 MFC 久々にさわってほとんど忘れてしまってるので、 教えて下さい。 タイトルバー無しのウィンドウを動かせるように、左ボタンダウン時に以下のように、PostMessageを追加しました。 そうすると、左ボタンアップが動かなくなったのですが、どうすれば動くようになるのですか? void CABCView::OnLButtonDown(UINT nFlags, CPoint point) { PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); CView::OnLButtonDown(nFlags, point); } void CABCView::OnLButtonUp(UINT nFlags, CPoint point) { AfxMessageBox("9"); CView::OnLButtonUp(nFlags, point); }

  • 変数アクセス(MFC)

    クラス別の変数間のアクセスについてよくわかりません。 【CADlg.cpp】 void CADlg::OnOK() { CB bdlg; CString str; m_ed.GetwindowText(str); Astr=&str; cdlg.DoModal(); CDialog::OnOK(); } 【CADlg.h】 public: CString *Astr; 【CB.cpp】 void CB::OnOK() { CStr CADlg dlg; dlg.Astr=&bstr;; MessageBox(bstr); CDialog::OnOK(); } 【CB.h】 CString bstr; 中身見てもちゃんと移ってないようです。 どうすればちゃんとできますでしょうか?

  • 子ウィンドウから親ウィンドウへデータを渡すには?

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、ダイアログのテキストボックスに入力した文字をウィンドウに表示しています。 また、ウィンドウ生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_moji=m_InputData; //テキストボックスの文字をウィンドウに表示されるう変数m_mojiに代入 pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログを非表示から表示にし、ウィンドウに表示されている文字をダイアログのテキストボックスに表示させるために以下のようにしましたが、文字は表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point) { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->m_InputData=m_moji;//変数に正しい文字が代入されていることは確認できました UpdateData(FALSE); pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • 左ダブルクリックについて

    アプリの中から動的に新規にウィンドウを作っています。 新規に作ったウィンドウのクライアント領域を左ダブルクリックした時に、メッセージボックスを出そうとしましたが、何も出てきません。 左クリックであればうまく行きます。 (右でも同様の現象) どうしてこうなるのでしょうか? お分かりの方アドバイスお願いします。 ************************* CMyWnd::CMyWnd( CWnd* parent,int i) { } void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { AfxMessageBox("99"); CWnd::OnLButtonDown(nFlags, point); } void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point) { AfxMessageBox("99"); CWnd::OnLButtonDblClk(nFlags, point); }

  • Invalidate()について

    以下コードにてAfxMessageBox("");があれば、”aaa”が表示されますが、無いと表示されません。 どうしてなのでしょう。 またAfxMessageBox("");なしで、”aaa”を表示するにはどうすれば良いですか? void CIiView::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC myDC(this); myDC.TextOut(0,0,"ttttttt"); Invalidate(); //AfxMessageBox(""); myDC.TextOut(0,0,"aaa"); CView::OnLButtonDown(nFlags, point); }

  • ウィンドウの破棄について

    アプリの中から動的に新規にウィンドウを作っています。 この新規に作ったウィンドウをそのウィンドウのクライアント領域を右クリックして破棄したいと思います。 とりあえず以下のようにしてみましたが、不正な処理で落ちてしまいます。 どこが悪いのでしょうか? よろしくお願いいたします。 ********************** void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) { ::DestroyWindow(m_hWnd); CWnd::OnRButtonDown(nFlags, point); }

  • 変数の代入について

    ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }

  • ダイアログの再表示について

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、 生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_left=100; pWnd->m_top=100; m_pAryDlg.Add ( pWnd ); //m_pAryDlg2.Add ( &m_InputData ); pWnd->m_moji=m_InputData; pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログが非表示から 表示になるように以下のコードを書きましたが、表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  //ウィンドウのダブルクリック { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

専門家に質問してみよう