特定のビューへのポインタ取得方法について

このQ&Aのポイント
  • MFCプログラミング(MDI)において、複数の子ビューがある場合に特定のビューへのポインタの取得方法を教えてください。
  • ビューの種類はCViewの派生クラスやCFormViewの派生クラスなどがあります。
  • ドキュメントクラスのポインタからGetNextView()を使用し順番にビューを取得する方法もありますが、具体的な利用方法が不明です。
回答を見る
  • ベストアンサー

特定のビューへのポインタ取得方法について

MFCプログラミング(MDI)について教えてください。 1つのドキュメントに 複数の子ウィンドウ+子ビューのセットがあるとき、 特定のビューへのポインタの取得方法を教えてください。 ちなみに、ビューの種類は、 1.CViewの派生クラス 2.CFormViewの派生クラス です。 MSDNを調べ回っった結果、 ドキュメントクラスのポインタから、 GetNextView(pos)を使って順番にビューを使うところまで来たのですが、その後が分かりませんし、 この方法の方向性自体の是非も良く分かりません。 ご指導よろしくお願いします。 POSITION pos = pDoc->GetFirstViewPosition(); while(pos != NULL) { CView* tmpView = pDoc->GetNextView(pos); if(tmpView == ???????)........????? }

  • zico
  • お礼率60% (48/80)

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

  • ベストアンサー
回答No.1

1つのドキュメントにそのクラスのビューは1つだけ、という前提でよければ CView* tmpView = pDoc->GetNextView( pos ); if ( tmpView->IsKindOf( RUNTIME_CLASS ( CTargetView ) ) { ... }

zico
質問者

お礼

遅くなってすみません。 うまく行きました。 ありがとうございました。

関連するQ&A

  • OnDrawが呼び出されません

    一つの画面をコントロール部と描画部にわけたものを作ろうとしています. (VC++6.0 MFC使用) ・CMyViewクラス(CFormViewクラス派生・コントロール部) ・CTest1Viewクラス(CViewクラス派生・描画部)(CTest1Docに関連付け) ・CTest1Docクラス MyViewのボタン入力でTest1Viewの画面を再描画させたいのですが,MyView内から以下のようにしてもTest1ViewのOnDrawが呼び出されません. (OnUpdateは呼び出されるようです) CTest1Doc *pDoc=(CTest1Doc *)GetDocument(); pDoc->UpdateAllViews(NULL, 1, NULL); 再描画させるにはどうすればよいのでしょうか.

  • MFC オリジナルDLLからエクスポートしたビュークラスを CMultiDocTemplate で登録すると Assert Failed! が出る

    環境はVisualStudio2005、MDIプロジェクトと拡張DLLプロジェクトを1つのソリューションに作成しています。 MDIアプリを作成していますが InitInstance() 関数内の CMultiDocTemplateの引数 RUNTIME_CLASS() 実行時にAssert Failed!が出ます。 CMultiDocTemplate に登録するビュークラスはオリジナルの拡張DLL内でCFormViewクラスから派生させたクラスです。 特に変わったことをしている訳ではなく、ほとんどウィザードがソースを吐いた状態のままです。 "COriginalView" をデフォルトの "CMyView" にするとエラーは出ません。 また、"COriginalView" もコントロールを1ヶ置いてビューフォームとクラスを作成し、 AFX_EXT_CLASS でエクスポートして参照できています。 また、MDI側でフォームとクラスを作成しそれを使用した場合はエラーは出ません。 ドキュメント/ビューアーキテクチャの理解が足りない為起きている問題だと思います。 宜しくお願い致します。 --- 詳細 ------------------------------------------------ CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,   RUNTIME_CLASS(CMyDoc),   RUNTIME_CLASS(CChildFrame),   RUNTIME_CLASS(CDllView)); ←これ実行時に Assert が出る AddDocTemplate(pDocTemplate); ---------------------------------------------------------

  • MFC:MDIにおけるビューのアクティブ化

    ・環境 VisualStudio2008SP1+FeaturePack Windows7 64bit タブドキュメント形式でMDIアプリを作っているのですが、複数ドキュメントがある際にプログラムから任意のビューを安全にアクティブ化させる方法がわからずに困っております。CMainFrame::SetActiveViewメソッドを使用すると指定したビューがアクティブになり所望の動作になるのですが、この方法だとドキュメントをクローズするときに以下の例外が出て怒られます。SetActiveViewはビューのOnCreate内で実行しています。  アクティブ化を解除しているアクティブ化コンテキストは、最近アクティブ化されたものではありません。 こういった状況に遭遇しない方法を探っているのですが使用するAPIと適切な使用タイミングがつかめず困っております。どなたかにご教授いただければ幸いです。

  • VC++で作成したアプリ起動時のウィンドウサイズについて

    VC++初心者の者です。初投稿です。宜しくお願いします。 ※何を言っているのか解らない、情報が足りないって場合は聞いてください。超初心者ですので宜しくお願いします。。。 VC++で作成したMDIアプリを起動させた時、 又は新しくウィンドウを開いた時の デフォルトウィンドウサイズを指定する方法を どなたか教えていただけませんでしょうか? また、開いたウィンドウをリサイズできないように するにはどうしたら良いでしょうか? (ViewクラスはCFormViewを基底としています。) 宜しくお願い致します。

  • 基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

    VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

  • VC++ ウィンドウの大きさを変えたい

    初歩的なことだと思いますが、メニューからのコマンドメッセージを受け取って、CViewクラスで処理すると同時に、CFrameWndクラスでウィンドウの大きさを変えたいです。 CViewのメッセージハンドラでCFrameWndのオブジェクトのポインタを保持して、直接操作する方法を考えたのですが、CViewからCFrameWndを取得する方法が分かりません。 どのようにすればいいか知りたいです。 また、同じメッセージをCViewとCFrameWndの両方に配信するとか、他に良い方法があれば教えていただきたいです。 よろしくお願いします。

  • 【MFC】キャンセルボタン処理が実装できない

    VC++2005(MFC)にて下記サイトを参考にMDIアプリケーションを作成しています。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MDI1.html 手順として、プロジェクトを新規作成し、MFC AppWizard(exe)で 新規プロジェクト名をMDITest1に設定し、アプリケーションの種類はMDI、 ビュークラスCMDITest1Viewの基本クラスはCFormViewとします。 リソースビューより、自動生成されたフォームの上に、 Buttonを配置し、イベントハンドラOnBnClickedButton1()内にて、 IDCANCEL()処理にて、ボタン押下時のウィンドウを閉じる処理を 実装したいのですが、コンパイルエラーが発生します。 基本クラスがCDialogクラスの場合は実装できるような気がするのですが。。 フォームビューだと、キャンセル処理は実装不可能なのでしょうか? また、不可能だとしたらウィンドウを閉じる処理はどのように実装すればよいのでしょうか? 解決策をご存知の方おられましたら、お手数ですがご教授宜しくお願い致します。

  • CViewクラスの切り替え

    MFCプログラミングについて教えてください。 同じドキュメントに対して、 通常の表示とOpenGL表示 2つのViewを作り、 切り替えボタンまで作ったのですが、 肝心のViewを切り替える方法が全く分かりません。 MDIなので、childframeで操作するのでしょうか? ご教示よろしくお願い致します。

  • IEコンポーネント(CWebBrowser2)を編集モードにする方法(VC++6.0)

    MFCAppウィザードで作ったSDIのプログラムで IEコンポーネント(CWebBrowser2)をフォームに表示し それを編集モードにしたいと思っています。 リソースエディタでフォームにコントロールを貼り付けています。 http://www.nitoyon.com/vc/tips/ie_component.htm こちらを参考に、IWebBrowser2のポインタを取得し そこからIHTMLDocument2を取ってデザインモードに したいのですが、うまくIWebBrowser2のポインタを 取得することが出来ません。 CWnd* pIE = (CWnd *)GetDlgItem(IDC_EXPLORER1); if (pIE == NULL) return; // コントロールのハンドルを得る HWND hWnd = pIE->GetSafeHwnd(); // 使えるかどうかチェック if (hWnd != NULL && ::IsWindow(hWnd) != 0) { CComPtr<IUnknown> punkIE; if (AtlAxGetControl(hWnd, &punkIE) == S_OK){//ここで失敗する CComQIPtr<IWebBrowser2> pWB2 = punkIE; if(pWB2 != NULL){ CComPtr<IDispatch> pDisp ; pWB2->get_Document( &pDisp) ; CComQIPtr<IHTMLDocument2> pDoc = pDisp ; pDoc->put_designMode(L"On"); } } }

  • MFC SDIのDocからViewの関数を呼び出す方法

    現在、センサから取得したデータを処理・および表示するMFC SDIベースのプログラムを作成しております。 今まではdialogベースで作っていたのですが、今回はセンサーデータをグラフにプロット表示するためにViewがあるSDIを選びました。 現在、2画面にスプリットして、左側がViewベース、右側がFormViewベースにし、センサーの取得開始などの制御ボタンを右側のFormViewへ、あたかもダイアログベースアプリのように開発しています。左側のViewへは取得されたセンサデータをプロットするようにしています。 さて、Docの中に独自スレッドを立てて、RS232C経由で定期的にセンサデータは取得できているのですが、その数値をFormViewに配置しているEditBoxに表示させたいと考えております。 Dialogベースで作っていたときは、dialog自体のポインタをAfxBeginThreadの2番目の引数(LPVOID pParam)で渡して、Thread内から該当のEditBoxの表示を切り替える関数(CEDITのSetWindowText)を呼び出していました。 今回Docの中にThreadが立っているので、FormViewのポインタをどうやって取得すべきかわかりません。FormView内では、GetDocument()でDocを取得できますが、その逆のパターンです。 CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); CXXXXView* pView = (CXXXXView*)pFrame->GetActiveView(); こんな感じで取得してみたのですが、Thread内からこのpViewを呼び出すとアクセス違反で落ちてしまいます。 FormViewクラス内にOnTimerを設けて、定期的にpDocに該当変数をチェックし変化があったらEditBoxに表示させるという”非同期”の方法だと実現できるのですが、なんかしっくりきません。 知識不足で根本から考え方が違うのかもしれませんが、ご教示いただければと思います。

専門家に質問してみよう