• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SDIウィンドウを動的に複数生成する方法)

SDIウィンドウを動的に複数生成する方法

このQ&Aのポイント
  • SDIウィンドウをダイアログベースのアプリケーションに配置したボタンを押すたびに動的に生成・表示する方法について質問します。
  • 生成するSDIウィンドウには、CMfcToolBar、CMfcRibbonStatusBar、独自に作成したCScrollView派生クラスを使用し、1アプリケーション内で複数のSDIを生成する必要があります。
  • 過去にCSingleDocTemplateを使用したが、ツールバーのボタンにUPDATE_COMMAND_UIが来ない問題が発生し、解決できなかったため、別のアプローチを検討したいと思っています。

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

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

SDIはフレームワークが唯一のドキュメントとそれに付随する唯一のビューしか扱わないことを前提にしています。 従って「ひとつのアプリケーション内でCSingleDocTemplateを複数扱」うことはできない構造になっています。 それを改造するとなるとMFCのかなり深いところまで手を入れる必要があると思われます。 > MDIのようにメインのフレームウィンドウから出られない子ウィンドウではなく、自由に配置できる子ウィンドウを動的に複数生成したいのです。 お望みの機能はプロジェクト生成時の「アプリケーションの種類:複数のトップレベルドキュメント」では実現できないのでしょうか?今、VC2010はExpressしか手元に無いので確認できないのですが、VC2008ではこの選択肢があります。 > 最終的にはDLLにして、利用するアプリケーションがなんであれそのウィンドウが表示できるようなものにしたいと思っています。 やりたいことが分からなくなってきました。 DLLからアプリケーション(プログラム)を起動したいということでしょうか? だとすると画面の表示方法はそのアプリケーションに依存してしまい、DLL側で操作できる範囲はかなり限られてしまいますが。ここでいうアプリケーションはソフトウェアではなくデータのことを言っているのでしょうか? もしDLLで表示を行うプログラムを作成するのであれば、そもそもSDIやMDIのフレームワークを使用することはできません。自分自身でフレームワーク相当のことをやる必要があります。

shouko0918
質問者

お礼

maru_yoshi_さん 回答ありがとうございます。 イメージとしては、モードレスダイアログのように、あるきっかけで、SDI形式のウィンドウが複数表示したい。 しかも、MDIのように親フレーム内に収まった状態ではなく、トップレベルウィンドウのように。 そういう意味では、ご紹介くださった複数のトップレベルドキュメントはかなり近いのですが、最初のSDIを閉じると他のウィンドウも終了してしまう事や、ベースとなる親ウィンドウがダイアログなどで既に存在している。という点で要件を実現するのが少し難しいところです。 そもそもSDIをダイアログのようにポコポコ生成表示するという事が間違っているとは思うのですが、正解となる方法が無いかと探っている次第です。 しかし、通常のMFCの仕様ではイレギュラーな考え方であり、「通常はできない」と言うことですね。 今実現しているSDIを表示する方法自体強引な訳ですが、その方法のまま、背景としてある問題を解決する方法を考えたいと思います。 ありがとうございました。 -------------------------------------------------------------------------------- 以下は、余談というか、現状報告です。 現在、以下のようなコードを実行すると、SDIウィンドウは生成されますし、表示も動作もします。 しかし、親ウィンドウがダイアログの場合、ツールバーにON_UPDATE_COMMAND_UIがきませんでした。 どうやら親がSDIならON_UPDATE_COMMAND_UIがくることが判明。ダイアログはWM_IDLEUPDATECMDUIのメッセージハンドラを実装していない為のよう。 CSingleDocTemplate* g_pNewWnd ; if( NULL == g_pNewWnd ) {     g_pNewWnd = new CSingleDocTemplate(       IDR_NEWWINDOW,       RUNTIME_CLASS( CSDIWndDoc ),       RUNTIME_CLASS( CSDIWndFrame ),       RUNTIME_CLASS( CSDIWndView )     );     CDocument* pDocumanet = g_pNewWnd->OpenDocumentFile( NULL ) ; } そこで、 http://msdn.microsoft.com/ja-jp/library/ccstww6w%28VS.80%29.aspx にあるような対応を応用できないか今から取り組むところです。

その他の回答 (1)

回答No.1

回答がつかないですね。 質問自体が矛盾しているような気がしているのは私だけではないのかも? > 4.1アプリケーション内で複数のSDIを生成する 1アプリケーションで一つのドキュメント(Single Document)を処理するインターフェース(Interface)のことをSDIと呼ぶのですが、 複数のSDIとはどういう意味なのでしょうか? 複数のドキュメント、ビューを扱いたいのであればMDIを使用するのが普通です。 SDI/MDIを扱う上ではドキュメント-ビューアーキテクチャーの理解が必要ですが、その辺は大丈夫でしょうか? 単に複数のビューを表示したいと言うことであれば素直にMDIにすればよいでしょう。

shouko0918
質問者

お礼

回答ありがとうございます。 >複数のSDIとはどういう意味なのでしょうか? ひとつのアプリケーション内でCSingleDocTemplateを複数扱いたいという意味です。 たしかに、「MDIにしなさい」というのが正論かと思いますが、MDIのようにメインのフレームウィンドウから出られない子ウィンドウではなく、自由に配置できる子ウィンドウを動的に複数生成したいのです。出来れば子ウィンドウの親がダイアログであってもOKな。 最終的にはDLLにして、利用するアプリケーションがなんであれそのウィンドウが表示できるようなものにしたいと思っています。

関連するQ&A