環境:XP、VS2003、Windowsフォームアプリケーション
質問内容
メインウィンドウの左側に子ウィンドウを貼り付けようと思っているのですが、
なかなか実現できず困っております。
現状なのですが、メインウィンドウ(親)の コンストラクタの中で
以下のような処理を書いております。
MainForm(void)
{
InitializeComponent();
//以下私が手動で追加した部分
this->CSample = new( sample );
this->CSample->Show(); // 子ウィンドウの表示
}
上記の処理では、CSapleのウィンドウが表示されるだけです(当たり前ですが)。
困っていますのが、上記処理にどのような処理を追加すれば、
メインウィンドウの左側に張りつける事が出来るかという事です。
この処理ですと、親ウィンドウをマウスで移動してもCSampleウィンドウは
動かずにそのままディスプレイに表示された最初の位置に固定されてしまっている状態
です。
(CSampleウィンドウの「FormBorderStyle」プロパティはNoneです)
メインウィンドウの左側に張りつけて、ユーザにはあたかも一つのウィンドウだけで動
いているように
見せたいというのが狙いです。
以下、そのイメージ図です。
+---------------+
|+-----+ |
|| | |
|| | |
|| B | A |
|| | |
|| | |
|+-----+ |
----------------+
(Aウィンドウに枠を持たないBウィンドウを張りつける)
CSample自体は、ソリューションエクスプローラを
「右クリック」->「追加」->「新しい項目の追加」->「UI」->「Windowsフォーム」で追
加したものです。
後々には、CSampleウィンドウにはボタンやらリストボックスやら乗せて、
制御していこうと思っておりますが、
まずは、ウィンドウを張りつけなければ話にならないというのがありまして・・・。
ご存知の方がいましたらアドバイスの程、お願い致します。
FormではなくUserControlにするのがいいと思います。
>aetosさん
レス有難う御座います。
UserControlでも試してみたのですが、
それも問題に遭遇してしまいました。
例えば以下のような場合
+---------------+
|+-----+ |
|| | A |
|| | |
|| B |+------+|
|| || ||
|| || C ||
|+-----++------+|
----------------+
BとCはそれぞれ、ソリューションエクスプローラを
「右クリック」->「追加」->「新しい項目の追加」->「.NET」->「Windowsコントロール
ライブラリフォーム」で
追加したものです
それを、Aウィンドウに張りつけました。
上記のような場合に、
Bの情報をCへ渡したい場合に、それが出来ずに困ってしまいました。
(例えばBの出力テキストをCのテキストボックスに出したい場合など)
それが出来れば、これでもOKなのですが。
仮に Form を貼り付けることができたとしても同じ問題が発生すると思いますよ。
UserControl だから起きる特有の問題ではないと思います。
で、BとCがそれぞれテキストを(テキストボックスをじゃないですよ!)プロパティと
して公開し、Aがそれを仲介するとか。
これ以上はちょっと目的が抽象的すぎてアドバイスできません。
っていうか、今気づきましたけど、2003でManaged C++ですか?
古い開発環境を捨てられない事情があるのかもしれませんが、なんでまたそんなマニア
ックな開発環境を選んだのやら。
>aetosさん
レス有難う御座います。
>仮に Form を貼り付けることができたとしても同じ問題が発生すると思いますよ。
なるほど・・・。
ご指摘有難う御座います
>これ以上はちょっと目的が抽象的すぎてアドバイスできません。
Cの領域にはテキストボックスのみを張りつけ(ReadOnly)、
AやBが吐き出すデバック情報を出力しようとしています。
(printfやcoutの変わりをさせてようという狙いです)
>っていうか、今気づきましたけど、2003でManaged C++ですか?
現状手元にある環境がVS2003とVS2008 Eexpress Editionの二つでして、
2008の方で本当はやりたいのですが、2003で言うところの
「Windowsコントロールライブラリフォーム」のようなものが見当たらず、
なくなく2003でやっている状況です。
(2008の製品版じゃないと無いのでしょうか?)
希望としまして、
aetosさんのおっしゃいます、UserControlの処理を
デザイナを使用して作成し、ツールボックスからメインウィンドウに
張りつけられるような事が2008Eexpress Editionでも出来れば、
そちらに今すぐにでも乗り換えたいというのが本音です。
SetParentで親に貼り付けてしまえば良いのでは?
Managed C++についてはよく知らないのでコメントできません。
BからCへはaetosさんの言われるようにA経由が
簡単だと思います。
>にーにさん
レス有難う御座います。
>SetParentで親に貼り付けてしまえば良いのでは?
これも試したのですが、だめでした。
set_Parent()の引数の型がControl型なのに対して、
UserControlを使わずに作ったB、Cの領域はForm型ですので、
そもそも型が違うようです。
(型を気にせずそのまま書いてみたら実行時に不正アクセスで落ちました)
現状は最初のaetosさんのおっしゃるように、UserControlで作成して
張りつけてますが、デザイン画面を開いている時に
ソリューションの「ビルド」メニュからクリーンを実行すると
張りつけたコントロールが全て消えたり、コンストラクタに引数を渡すような
実装しリビルドしても、コントールが張りつけた画面から消えたり・・・。
(丁寧にソースコードからも消える)
2005(家)ですと、UserControlも一つのプロジェクトに追加出来るのですが、
2003ですとそれも出来ないんですよね。
>A経由が簡単だと思います。
これは、BやCがAに対してメッセージを送るという解釈でよいですか?
> 現状手元にある環境がVS2003とVS2008 Eexpress Editionの二つでして、
> 2008の方で本当はやりたいのですが、2003で言うところの
> 「Windowsコントロールライブラリフォーム」のようなものが見当たらず、
> なくなく2003でやっている状況です。
> (2008の製品版じゃないと無いのでしょうか?)
手元に VS2008 TeamSuite しかないので何とも言えませんが、Express だからといって
ユーザコントロールがないというのは考えづらいです。
2008 でプロジェクトの新規作成時に「Windowsフォームアプリケーション」を選択し、
ソリューションエクスプローラーでプロジェクトを右クリックして「追加」>「新しい
項目」>「UI」>「ユーザーコントロール」というのがありませんかね?
> set_Parent()の引数の型がControl型なのに対して、
set_Parent と SetParent は別物です。
set_Parent は .NET Framework のプロパティ、SetParent は Windows API でしょう。
>aetosさん
レス有難う御座います。
>「ユーザーコントロール」というのがありませんかね?
確認したと所、「UI」の所には「Windowsフォーム」しかない状態です。
>set_Parent は .NET Framework のプロパティ、SetParent は Windows API でしょう。
失礼しました。そういう事ですか。
解決致しましたので報告です。
フォームの貼り付けは以下サイトを参考に行えば出来る事を確認しました。
http://dobon.net/vb/dotnet/form/formwithinform.html
ただし、この場合はデザインを操作しながら開発を進められるわけではないので、
デザインを操作しながら開発を行いたい場合は、ユーザコントロールを
貼り付けるのが良いかと思います。
また、ユーザコントロール間のデータのやりとりは
親フォームを経由(メッセージでやり取り)する事で問題を解決致しました。
aetosさん、にーにさん、レス有難う御座いました。