• ベストアンサー
※ 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

  • SDIアプリ内からもう一つSDIを作成する方法

    開発環境:WindowsXPSp3 + VC++2010 SDIの単純なアプリケーションと、スタティックリンクしているDLL(拡張DLL)があります。 exeのツールバーにあるボタンをクリックすると、DLL内にあるCreateNewWindowという関数を呼ぶようになっています。 このCreateNewWindowでは以下のようなコードが書かれています。 ------------------------------------------------------------------ CSingleDocTemplate* g_pNewWnd ; // グローバル void WINAPI CreateNewWindow() {   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 ) ;   } } ※初期化や破棄処理は適宜行っているものとします。 ------------------------------------------------------------------ このように、Exeのほうに1つのSDIが存在している状態で、さらにDLL内で別のSDIのウィンドウを作成することは許されるのでしょうか? 実行すると、一応、ウィンドウは作成されるのですが、これらのフレーム内でCMFCToolBarを作成すると、DLLのこの関数でSDIを作成した時点でexe側のツールバーがおかしくなります。 具体的にはDLLのリソースにあるツールバーがexeのツールバーとして不完全な状態で反映され、DLLで作ったSDIウィンドウでは、ツールバーの領域だけ確保されてなにも無い状態です。 この関数を実行するまではexeのツールバーは正常に表示・動作しています。もちろん、リソースIDがユニークになているのは確認済みです。 やりたいことは、SDIやダイアログなどからボタンを押したら動的にSDIのウィンドウを生成して提供するDLLを作成したいのです。 参考になるサイトや書籍、アドバイスを頂けませんでしょうか。 よろしくお願いします。

  • ウィンドウ生成時の不具合について

    VC++6.0 WIN98 MFCにて ウィザードを使ってSDIにてウィンドウ1を作成し、メニューをクリックすることで、ウィンドウ2が新たに生成されるプログラムを書きました。 ウィンドウ2が生成されたときに、ウィンドウ1に重なっていると、ウィンドウ2を閉じてもウィンドウ1のクライアント領域にウィンドウ2の形が残ったままになってしまいます。 どうしてこうなるのでしょうか?

  • MDIでプロジェクトを作成しSDIとして使用する方法

    次の開発環境でWindowsアプリを作成するにあたり、 アプリケーションの種類をSDIとすべきかMDIと すべきか迷っています。  WindowsXP Professional  Visual Studio.NET 2002  VC++ MFC そこで、質問なのですがアプリケーションの種類を MDIとしてプロジェクトを作成した後にSDIと同じ動き となるようにコードを書く(変更する)ことがで きますか。 例えば、プロジェクトを起動させると、常に1つの ドキュメントがメインウィンドウ全体に表示される。 ご存じの方すいませんがよろしくお願いします。

  • SDIでTabCtrlを使用

    VC++でSDIにTabCtrlを用いたアプリケーションを作成しようとしているのですが、どうも上手くいきません。 SDIWindowにタブを表示する方法はわかったのですが、タブの上にどのように表示させるものを登録すればよいのか、わかりません。CStaticを継承したクラスを作成し、OnPaint()に描画処理を入れればよいのでしょうか? ※今回はOpenGLを表示し、タブ切り替えで画面を変えたいと考えています。 もし、方法をご存知の方おられましたら教えていただけないでしょうか?

  • ウィンドウを生成するには?

    今年からC言語を勉強し始め、最近windowsプログラムを勉強しようと思い、あるサイトを参考にしてウィンドウを生成するプログラムを作成したのですが。 「_mainが未解決、 パラメータ 'hPrevInstance' は一度も使用されない、パラメータ 'CmdLine' は一度も使用されない」 等のエラーが出ます、参考にするため、どなたかウィンドウを生成するプログラムを掲載してくれませんか?困ってます。

  • MFCでのウィンドウ生成

    http://www7.plala.or.jp/bunpan/htmldata/program/mfc/fol_001/mfc00112.html ここにMFCによるウィンドウ生成方法が載っています。 クラスを定義して、MyCreate() をコールすることで、ベタなウィンドウを作成できますよ。とありますが、引数UINT nIDは何を与えれば良いのでしょうか? ************************* int CxxxWnd::MyCreate( dwStyle, rect, pParentWnd, nID, pContext ); DWORD dwStyle; // (I) 作成するウィンドウのスタイルを指定してね。 const RECT ▭ // (I) 作成するウィンドウのサイズを指定してね。(参照受け渡し) CWnd *pParentWnd; // (I) 親ウィンドウのクラスのオブジェクトのアドレスを指定してね。 UINT nID; // (I) ID を指定します。 CCreateContext *pContext; // (I) ウィンドウの作成コンテキスト。(NULL でいーんじゃん?)

  • ウィンドウを隠す方法

    JFrameを利用してアプリケーションを作成しています。 ウィンドウの閉じるボタンでウィンドウを隠すことは「setDefaultCloseOperation」で「HIDE_ON_CLOSE」を指定してウィンドウを隠すように設定できました。 しかしJButtonでボタンを作成し、ボタンを押すとウィンドウを隠すようにしたいのですが、色々探したのですが結局やり方がよくわかりません。 ヒントやアドバイスでもいいので、なにかありましたらよろしくおねがいします。

    • ベストアンサー
    • Java
  • SDIアプリ D&Dで複数のファイルを開く

    お世話になります。 Windowsプログラム初心者です。 「猫でも分かるプログラミング」のサイトを参考にSDIアプリケーションを作成しました。(単純なビットマップビュアーだと思っていただいてほぼ間違いありません。) 開きたい画像ファイルをアプリのアイコンにD&Dして開く仕組みも、「猫でも分かる」の256章を真似て組み込みました。 D&Dするファイルが一つだけならうまく開けるのようになったのですが、二つ以上D&Dしたときにすべてのファイルを開く仕組みが分かりません。 具体的には、 ・引数が複数与えられたことを知る方法。 ・引数与えられたときにもう、別ウィンドウを開いてそちらで引数を処理する方法。 おそらくこの二点が分かれば先に進めると思うのですが・・・ どなたか迷える子羊に道を示してください。 よろしくお願いします。

  • Viewウインドウに直接ボタンを貼り付けるには

    VC++6.0 APPWizard(exe) SDI で作成したViewウインドウにボタンを貼り付けたいのですが、どうすればよいか教えてください。 普通にダイアログにボタンを貼り付ける場合のように簡単ではないのですか?

  • 自作ウィンドウを閉じる方法について

    只今、これならわかるJAVAという書籍でウィンドウを生成し、×ボタンがクリックされたら、ウィンドウを閉じる(プログラムを終了する)ようなプログラムを作っているのですが、書籍通りに記述しているのですが、×ボタンをクリックしてもウィンドウが閉じません。ソースは、 import java.awt.*; import java.awt.event.*; //ウィンドウを表すクラスFrameを継承し、自作のウィンドウを表すクラスを作成する public class EventDispose extends Frame{ public EventDispose() { addWindowListener(new MyWindowAdapter()); } class MyWindowAdapter extends WindowAdapter{ public void WindowClosing(WindowEvent e) { System.exit(0); } } } です、。表示を行っているクラスが、 public class MyWinApp { public static void main(String[] args) { //自作のウィンドウの生成(コンストラクタの実行) EventDispose ed = new EventDispose(); //ウィンドウのサイズの指定 ed.setSize(300,200); //生成したウィンドウを可視状態にする ed.setVisible(true); } } です。開発環境はeclipseの3.4です。 どうかご教授よろしくお願い致します。

    • ベストアンサー
    • Java
このQ&Aのポイント
  • 27歳で530万円の預金残高は、同世代の平均貯金額である300万円と比べてかなり高めです。
  • しかし、預金残高と貯金額は異なるため、実際に自由に使えるお金は99万円であり、同世代と比較するとかなりの差があります。
  • 同世代の人たちは、自由に使えるお金がある一方で、貯金額は個人によって異なるため一概には言えません。
回答を見る