• ベストアンサー

CDocumentの取得方法について

CTreeCtrlクラスを使って、 ドキュメントクラスのデータを ダイアログ上のツリーコントロールに 表示させるプログラムを作っています。 CViewクラスでは、GetDocument()関数で ドキュメントデータを取得できますが、 CTreectrlクラスには、そのような関数がないので、 困っています。 どうすれば、ドキュメントデータをツリー表示できるのかを教えてください。 よろしくお願いします。

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

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

  • ベストアンサー
  • hyde-la
  • ベストアンサー率28% (42/146)
回答No.1

Viewのポインタを取得し、必要なCView継承クラスへキャストして GetDocument()すれば問題ないです。 Viewを取得する方法は沢山あります。 例えばCTreeCtrlがViewの子ウィンドウとして生成されてるなら CMainFormView* pv = (CMainFormView *)pTreeCtrl->GetParent(); や、コントロールが別のダイアログにあり、且つViewが 一つだけの場合は、 CFrameWnd* pfrm = (CFrameWnd *)AfxGetApp()->GetMainWindow(); CMainView* pv = (CMainView *)pfrm->GetActiveView(); 複数viewがあった場合も、上記方法をちょっと工夫して 目的のViewが出てくるまでGetNextViewすればよいかと。

zico
質問者

お礼

ご教授ありがとうございました。 おかげさまで、無事Viewへのポインタを取得できました。 AfxGetApp関数やCFrameWndクラスのヘルプを見ることで 今まで見えなかった世界が開けてきました。 ありがとうございました。

関連するQ&A

  • ドキュメントクラスの取得方法

    MFC の SDI でアプリケーション開発をしています。 当方 “Hello, world!” を学び始めて数ヶ月のビギナーです。 ドキュメント・ビュー構造では ビュークラスからは GetDocument() 関数を使って, ドキュメントクラスの public な領域を操作することができます。 ここで質問です。 自分の作った,独自のクラスから,ドキュメントクラスを取得する には,どうしたらいいのでしょうか? GetDocument() 関数はビュークラスにしか(?)備わっていないようで,困っています。 ドキュメントクラスの ID でも分かれば GetDlgItem() が使えるかもしれない(?)などと思ったのですが。 初心者につき,変な質問をしているかもしれませんが,ご教授いただけると幸いです。

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

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

  • VBでインストール済みアプリケーション情報を取得する方法

    VBにてPCにインストール済みアプリケーション(「コントロールパネル」ー「プログラムの追加と削除」に表示されるアプリケーション)の情報を取得死体のですが、これら情報はどのようにして取得できるのでしょうか? レジストリキーの検索やWMIなど探してみたのですが、うまい解決策が見つかりません。 API関数があるのでしょうか?

  • ウィンドウハンドルの取得方法

    ダイアログの表示されないEXEを起動させて、FindWindowを使用してそのEXEのウィンドウハンドルを取得したいのですが上手くいきません・・。 FindWindowの第一引数は「ウィンドウのクラス名」を指定するようなのですが、「ウィンドウのクラス名」の意味が良くわかりません。第二引数は「ウィンドウ名」を指定するようなのですが、今回のようなアンダーグラウンドで動くEXEには「ウィンドウ名」は無いと思ってよいのでしょうか? ちなみにダイアログのあるEXEならウィンドウハンドルを取得できます。 お分かりの方がいらっしゃれば、ご教授願います。

  • ツリーコントロールとツリー構造のデータとのリンク

    ツリーコントロールとツリー構造のデータとのリンク 私が開発しているソフトウェアは、データ構造として ツリー構造を使っています。このツリー構造のデータ を表示するためにツリーコントロールを使って いますが、データとツリーコントロールのリンクする 方法として良い方法を探しています。 ここでいう「リンク」とは、例えば ツリー構造のデータにデータの追加や削除が おこなわれた場合、該当するツリーコントロールの データも追加と削除をおこなう。ことです。 現時点では、ツリー構造のデータにデータの追加や 削除がおこなわれたら、ツリーコントロールに SendMessageを送ってツリーコントロール側の データの追加や削除をおこなっています。この場合、 ツリー構造のデータのクラスに、GUIのクラスの ポインタを保持しています(ツリーコントロール へのSendMessageのためにCWnd*を保持している)。 データにGUIに関わるコードが存在するので、 GUIに依存しない方法に変えたいのですが、みなさんは このような場合はどうしていますか? ちなみに現時点では、Design PatternのObserver Patternを採用してみようと思っています。 他に良い方法があれば教えてください。 よろしくお願いします。 開発環境:VC++6.0, MFC

  • APIで作成したコモンコントロールのイベント取得方法

    こんにちは。 http://www.mitene.or.jp/~sugisita/vb6_cmctl.html にある、ツリービューコントロールの カテゴリーのサンプルを参考にして APIで、コントロールを使えるように苦戦しております。 表示はできるのですが、表示させたコントロールのイベント(click等)を取得する方法が分かりません。 ご存知の方がいらっしゃいましたら、よろしくお願いします。

  • WebBrowserに表示されているページのソースの取得方法

    RichTextBox1.Text =WebBrowser1.Document.body.innertext とすれば表示されている文字は取得できるのですがタグ付きのソースは 取得できません。 webBrowserコントロールに表示されている文字だけでなくタグもいっしょに 取得するにはどうすればよいのでしょうか

  • 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に表示させるという”非同期”の方法だと実現できるのですが、なんかしっくりきません。 知識不足で根本から考え方が違うのかもしれませんが、ご教示いただければと思います。

  • ツリーコントロールの開閉アイコンの変更

    こんにちは。Windows上でプログラムをしています。 ツリーコントロールをダイアログに貼り付けているのですが、開閉アイコン「+」「-」のアイコン変更はできるものなのでしょうか? 「+」「-」のアイコンをVisualStudioのプロジェクトのプロパティダイアログの左ペインに表示されているような三角形に変更したいと思っています。

  • CFileDialogを使用して、Pathを取得する方法

    お世話になっております。 CFileDialogクラスを使用して、Pathを取得する 方法がないでしょうか? 処理の流れでは、下記のような考えでいます。 (1)ダイアログ上の「参照」ボタンを押すと、ファイルダイアログが表示される。 (2)ファイルダイアログで、ディレクトリを移動し、任意のディレクトリまで移動したら、「開く」(または保存)を押下する。 (3)ファイルダイアログを閉じ、移動したPathを取得する。 です。 ファイルダイアログを開くところまでは出来ていますが、ファイル名を指定しないで、「開く」(または保存)を押しても、ファイルダイアログが閉じないので、困っています。 (3)のパス取得に関しては、既に処理の方法はわかっているので、(2)の部分(ファイル名を指定しないで、「開く」(または保存)でファイルダイアログを閉じる方法)をご教唆ください。 よろしくお願いします。