- PR -

DLL でダイアログボックスを表示する

1
投稿者投稿内容
kin
会議室デビュー日: 2004/03/17
投稿数: 4
投稿日時: 2004-03-17 18:00
はじめまして。
VCビギナーです。

今、MDIフォームからDLLで子画面を表示させる方法で悩んでいます。
考えているのは、MDIの子画面のOnCreat関数内でDLLを動的に呼出し、
子画面のハンドルをDLLに渡し、それにDLLのリソースで持っている
ダイアログボックスを描画させる、という方法です。

この方法を選択された理由は以下の2点です。
1.DLLから呼ばれる画面もMDIで管理したい
2.コードで描画する方法はメンテナンスの点から避けたい

過去のスレッドで同じような方法を探されている方がいましたが、
.NETで作成されていました。
MDIではこの方法は不可能なのでしょうか?
kin
会議室デビュー日: 2004/03/17
投稿数: 4
投稿日時: 2004-03-17 22:50
追記です。

先ほど
>OnCreat関数内でDLLを動的に呼出し
と記述しましたが、
ここでは子画面はまだ作成されていないので
メニューからイベントを発生させ、
そのイベントからDLLを呼出し
子画面のハンドルを渡してDialogBoxを実行しようとしていますが
うまくいきません。

DLLでDialogBoxを使用して子画面に描画するというのは
不可能なのでしょうか?

以上です。
よろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-18 11:00
 いくつか不明な点がありますので、お答えください。

 使用するのはVC6.0ですか、VC.NETですか?
 『過去のスレッドで同じような方法を探されている方がいましたが、.NETで作成されていました。MDIではこの方法は不可能なのでしょうか?』
 .NETでMDIフォームを作成するのは可能なので、この部分が意味不明。SDIで作成されていた?VC.NET+SDIだったが、VC6.0+MDIで行いたい?
>VC6.0の場合、回答が得られない確率が高くなりますが、".NET Insider"
 なので、ご了承ください。

 MDIで、モーダルなダイアログを表示するのでしょうか?
 MDI、マルチドキュメントインタフェースで、モーダルダイアログ、他のフォームにアクセスできないダイアログを表示するのですか?
『子画面のハンドルを渡してDialogBoxを実行しようとしていますがうまくいきません。』
 子画面を表示したいのか、子画面から表示したいのか?モーダルダイアログボックスの性質からして、親、つまりすべての子画面を包含している画面から表示させるべきかと思う。『MDIで管理したい』ということなので、親画面の中に表示される子フォームの一つとしたいということだと判断するが、それならモーダルダイアログボックスはおかしいのではないか?
 MDIは作ったことがないので、あくまで「思う」。

 私は特に意地悪なので、「不可能なのでしょうか」という問いに対しては「はい/いいえ」で答えたくなってしまいます。お尋ねになりたいのは「どのように実現するのか」ということではないでしょうか?

 「うまくいきません」とは、具体的にどのように「うまくいっていない」のでしょう?コンパイルが通らない?コンパイルは通ったが、実行時にエラーがでる?エラーはでないが、思ったのと違う現象が発生する?その辺がわかりません。また、どのような現象が発生しているかも、重要な要素です。

 他のスレッドを参考にされたということですが、そのスレッドはどれでしょう?参考URLの方はスレッドディレクトリになっておりますが、すべてをごらんになったのでしょうか?



 これらを最初に書いておいてくだされば、「こいつ、慇懃な書き方しやがって」と嫌な思いをされることはなかったでしょうし、回答も早く得られたと思いますが、いかがでしょうか?
kin
会議室デビュー日: 2004/03/17
投稿数: 4
投稿日時: 2004-03-18 16:14
Jitta さん

返信ありがとうございます。

>使用するのはVC6.0ですか、VC.NETですか?
私が使用しているのはVC6.0です。

>MDIで、モーダルなダイアログを表示するのでしょうか?
MDI(EXE)で作成された子画面にDLLのダイアログを描画します。
子画面に張り付いているのでモーダルというのが正しいのでしょうか?
すみません。そこらへんの認識があやふやです。

その子画面は他に子画面が表示されていても
それらに対して操作することが可能にしたいのです。

>他のスレッドを参考にされたということですが、そのスレッドはどれでしょう?
参考にしたスレッドは
Insider.NET 会議室>
 ディレクトリ>
  DLL処理/クロスランゲージ >
   親画面(EXE)と子画面(DLL)の作成
URLは
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5726&forum=7
です。

>「うまくいきません」とは、具体的にどのように「うまくいっていない」のでしょう?
コンパイルは通ったのですが、子画面にダイアログが描画されませんでした。

その後、DialogBox ではなく
CreateDialog :子画面のハンドルを引数に渡す
ShowWindow  :CreateDialogの戻り値のハンドルを渡す
UpdateWindow :CreateDialogの戻り値のハンドルを渡す
で処理を行いました。
そうすると、EXEで作成した子画面にダイアログボックスを描画することが出来、
他の子画面、フレームワークの操作も出来ました。

また、DLLのリソースで作成したダイアログボックスの
プロパティを以下のように設定しました。
「スタイルタブ」
スタイル:チャイルド

これでしたいと思っていた動きは出来ました。
でも、いろいろ試して出来たという状態なので、
何か気づいた点があればご教授お願いします。

また処理でつまずくことがあると思いますが、
その時はもう少しちゃんと質問が出来るようにします。

どうもありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-18 18:02
 うまくいったようで、良かったです。


 モーダルフォームとモードレスフォームがあります。モーダルフォームというのは、そのフォームが表示されている間、他のフォームを操作することができません。DialogBoxの説明で、「モーダルダイアログボックス」とあったので、「MDIなのにモーダル?」と、疑問に思いました。
 CreateDialogは、「モードレスダイアログ」と書いてありますから、やっぱり関係あったみたいですね。
kin
会議室デビュー日: 2004/03/17
投稿数: 4
投稿日時: 2004-03-18 22:20
Jittaさん

解説までしていただいてありがとうございます♪

>「MDIなのにモーダル?」と、疑問に思いました。

そうだったのですね。
あるサンプルプログラムを参考にしていて、
そこでは DialogBox が使われていました。
それで「これは出来てなぜこっちはできないの?」
と混乱してしまいました。

本当にありがとうございましたm(__)m
1

スキルアップ/キャリアアップ(JOB@IT)