IEの「新しいウィンドウに開く」のようなに外部に窓を開く方法を教えてください.

[戻る]
ケンタ [E-Mail] 2002/05/10(金) 04:48:50
はじめまして,最近VC++を使い始めたケンタと申します.

−−−−−−−−−−−−−−−−−−−−−−−
・動 作 環 境 :Windows XP
・開 発 環 境 :Visual C++6.0Professional Edition(MFC使用)
−−−−−−−−−−−−−−−−−−−−−−−

現在,SDI(CFromViweを選択)にて様々な計算を行いグラフを
表示するプログラムを作っています.
MDIのように一つのアプリケーション内で複数のデータファイル(グラフ)を
オープン(表示)するのではなく,グラフをInternet Explorerの
「新しいウィンドウに表示」のように外部に新規の窓を開いて
そこに表示したいのでが,どのようにしたらいいでしょうか?

なにぶん,使い始めてまもなく手探りの状態なのでアドバイスを頂けると
大変助かります.よろしくお願いします.

sugar 2002/05/10(金) 10:30:21
グラフを描く機能をSDIで作っているのはわかりました。
これを起動する側は、どのように考えてらっしゃるのでしょうか。
これも含めて、ひとつのアプリケーションが成立するわけですが、
どうも描く側の話に終始しているように思えます。

※ここでいうアプリケーションは、EXEの数とは無関係です。
 複数のEXEでひとつのアプリを構成する場合もありますから。

たけみ 2002/05/14(火) 12:16:45
引数をとるように組んで(引数がNULLなら初期設定を行う)
ShellExecute(-------9;
で自分を引数付きで呼び出し。

IEって各々が別のタスクを持っているようなので
こうやっているのではないかと思うのですが。

大量の引数が必要なら引数を結合して渡したのち、解析させる。
もしくはテンポラリファイルを作って引数を渡したように見せる。
とか?

でもややこしくなるだろうなぁ。

ケンタ [E-Mail] 2002/05/16(木) 04:53:56
返答ありがとうございます.

>sugarさんへ
>これを起動する側は、どのように考えてらっしゃるのでしょうか。

返事送れてスイマセン.
グラフ自体は,初心者用の本に載っているような,
pDC->MoveTo〜,pDC->LineTo〜
で,線に毛のはいた程度のもので,
ただ,この本に乗っているような簡単な図を描くプログラムを拡張して,
新しい窓を開けて書きたいというような
考えでプログラムを作っています.


>たけみさんへ
>ShellExecute(-------9;

本などで,調べてみたのですが良くわかりませんでした.
もうチョット詳しく教えていただけると助かるのですが.
よろしくお願いします.

PAI 2002/05/16(木) 14:25:44
まず、IEは鬼のように複雑な処理をしています。
IE全体としてプロセスとしては1つで、それぞれのIEのインスタンスは
ユーザーインターフェイススレッドです。
「新しいウィンドウに表示」
は親子関係でなく、兄弟ウィンドウを開くことになります。

それで
>IEのように外部に新規の窓を開いて
といわれたら、そういう意味かととらえます。

たけみさんsugerさんがおっしゃっているのは
それをひとつのEXEで作ることは難しいので、
ShellExcute や CreateProcess をつかって
別のEXEを起動すればいいのではないか、
という意味です。

で、戻りましょう。
兄弟関係のウィンドウが必要でしょうか?
ウィンドウAからウィンドウBを出して、
ウィンドウAを終了したとき、ウィンドウBは生きていたほうがいいのでしょうか?

ケンタ [E-Mail] 2002/05/16(木) 15:34:18
説明不足ですいませんでした.
そういう関係のウィンドウを兄弟ウィンドウというのですね.
勉強になりました.

>兄弟関係のウィンドウが必要でしょうか?
>ウィンドウAからウィンドウBを出して、
>ウィンドウAを終了したとき、ウィンドウBは生きていたほうがいいのでしょうか?

ウィンドウBは生きていたほうがいいです.

PAI 2002/05/16(木) 19:09:50
なるほど、で、

そうした場合かなり複雑な事をするのでなければ、
別のプロセスを起動することになります。

別のプロセスを起動するっていうのは
(厳密には違いますが)エクスプローラからダブルクリックするのと同じことを
やってやることになります。

で、そのAPIがShellExecute() (およびCreateProcess())です。
(一応、ここでいうAPIって言うのはWin32が用意しているグローバル関数のことです)

MSDNでプラットフォームSDKから該当関数を探してみてください。
例:電卓を起動
ShellExecute( NULL, "Open", "c:\\Windows\\CALC.EXE","","",SW_SHOW );

さらに、そうした場合、プロセス間では単純にはデータのやり取りができないので、
そのへんはちょっと工夫しなければなりません。


余談ですが、見えない親ウィンドウを作って、そこから子ウィンドウを出す、
というような手もあるにはあります。
はじめの細工が面倒だけど、データが複雑でファイルとかでいけないときは
そっちのほうが楽かも。

古いスレッドには追加発言できません。