メインウインドウの他に、新しく「通常ウインドウ」を
作成する方法を教えてください。
--------------------------------------------
メインウインドウとは別に補助的な表示をさせるウインドウを
作りたいと思い、当初、「モードレスダイアログ」でウインドウを作ったの
ですが、これだとメインのウインドウに重なった時、非アクティブな時でも
メインウインドウよりも前面に来てしまい、メインが見づらくなってしまいます。
ただ、これはそもそもモードレスダイアログの仕様なのかもしれない
と思い、もしかしたら「通常ウインドウ」が自分の作りたいもの
ではないかと思いました。
それで、モードレスダイアログの例に倣って、通常ウインドウを
作っていこうとしたんですが、
1,RADツール、ProjectViewのマテリアル・タブから
新たにウインドウを挿入して、
2,CreateWindowEX()でウインドウを作成しようとしたんですが、
"lpClassName"、や"hInstance"など
実際にどのように設定すべきなのか分からないものも
あり、詰まっています。
(また"RegisterClassEx"や"WNDCLASSEX構造体"なども。)
それにマテリアル・タブから新たにウインドウを挿入したとき
、RADではどこまで自動的に作っているのかも分からず
悩んでいます。
RADツールを使って新しく「通常ウインドウ」を
作成し、表示する方法を教えてください。
「通常ウインドウ」の作成について
Re: 「通常ウインドウ」の作成について
通常ウィンドウをマテリアルから追加した時点で既に通常ウィンドウは作成されています。> メインウインドウの他に、新しく「通常ウインドウ」を
> 作成する方法を教えてください。
>
> --------------------------------------------
>
> メインウインドウとは別に補助的な表示をさせるウインドウを
> 作りたいと思い、当初、「モードレスダイアログ」でウインドウを作ったの
> ですが、これだとメインのウインドウに重なった時、非アクティブな時でも
> メインウインドウよりも前面に来てしまい、メインが見づらくなってしまいます。
> ただ、これはそもそもモードレスダイアログの仕様なのかもしれない
> と思い、もしかしたら「通常ウインドウ」が自分の作りたいもの
> ではないかと思いました。
>
> それで、モードレスダイアログの例に倣って、通常ウインドウを
> 作っていこうとしたんですが、
> 1,RADツール、ProjectViewのマテリアル・タブから
> 新たにウインドウを挿入して、
> 2,CreateWindowEX()でウインドウを作成しようとしたんですが、
> "lpClassName"、や"hInstance"など
> 実際にどのように設定すべきなのか分からないものも
> あり、詰まっています。
> (また"RegisterClassEx"や"WNDCLASSEX構造体"なども。)
> それにマテリアル・タブから新たにウインドウを挿入したとき
> 、RADではどこまで自動的に作っているのかも分からず
> 悩んでいます。
>
> RADツールを使って新しく「通常ウインドウ」を
> 作成し、表示する方法を教えてください。
と、いうのも新しく追加した通常ウィンドウは非表示になっているため”見えない”だけなんです。
新しく作った通常ウィンドウのスタイルに「可視」を追加するか、ShowWindow関数で新しく作ったウィンドウのハンドルを指定してSW_SHOWで表示してやればよいです。
レクありがとうございます。
素早いレスありがとうございます。
ウインドウがきちんと表示されました。
(下にソースの一部を。
メインウインドウに貼り付けてあるボタンをクリックで通常ウインドウを表示する
というプログラムです。)
初めから表示させておきたいと思って(ボタンクリックからではなく)、
メインウインドウのクリエイト・イベント内に上の処理を書いてみたのですが、
その時にはこのノーマルウインドウは表示できませんでした。
調べてみるとどうもノーマルウインドウのハンドル(hNormalWindow1)が
ゼロ。まだ作成されてない様子。
メインウインドウのクリエイト・イベントが終了するまでhNormalWindow1は
作られないのかなとも思ったのですが、
それでもその解決が分かりません。
ノーマルウインドウのハンドルhNormalWindow1が作成されているかどうか、
確認するにはどうしたら良いのでしょうか。
教えて頂いた通り、ウィンドウのハンドルを指定してSW_SHOWで表示すると、新しく作った通常ウィンドウのスタイルに「可視」を追加するか、ShowWindow関数で新しく作ったウィンドウのハンドルを指定してSW_SHOWで表示してやればよいです。
ウインドウがきちんと表示されました。
(下にソースの一部を。
メインウインドウに貼り付けてあるボタンをクリックで通常ウインドウを表示する
というプログラムです。)
(ここにソースが表示されます) [ここをクリックすると内容が表示されます]
ただそれで次に、メインウインドウ作成時に、このノーマルウインドウをコード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim windowRc As RECT
windowRc.left=0
windowRc.top=0
windowRc.right=256
windowRc.bottom=128
AdjustWindowRectEx(windowRc,GetWindowLong(hNormalWindow1, GWL_STYLE), TRUE, GetWindowLong(hNormalWindow1, GWL_EXSTYLE))
MoveWindow(hNormalWindow1,256,256,windowRc.right-windowRc.left, windowRc.bottom-windowRc.top, TRUE)
ShowWindow(hNormalWindow1,SW_SHOW)
End Sub
初めから表示させておきたいと思って(ボタンクリックからではなく)、
メインウインドウのクリエイト・イベント内に上の処理を書いてみたのですが、
その時にはこのノーマルウインドウは表示できませんでした。
調べてみるとどうもノーマルウインドウのハンドル(hNormalWindow1)が
ゼロ。まだ作成されてない様子。
メインウインドウのクリエイト・イベントが終了するまでhNormalWindow1は
作られないのかなとも思ったのですが、
それでもその解決が分かりません。
ノーマルウインドウのハンドルhNormalWindow1が作成されているかどうか、
確認するにはどうしたら良いのでしょうか。
Re: レクありがとうございます。
ウィンドウをプログラムの実行直後に表示したい場合は、ウィンドウのスタイルに「可視」を追加してください。> ただそれで次に、メインウインドウ作成時に、このノーマルウインドウを
> 初めから表示させておきたいと思って(ボタンクリックからではなく)、
> メインウインドウのクリエイト・イベント内に上の処理を書いてみたのですが、
> その時にはこのノーマルウインドウは表示できませんでした。
>
> 調べてみるとどうもノーマルウインドウのハンドル(hNormalWindow1)が
> ゼロ。まだ作成されてない様子。
> メインウインドウのクリエイト・イベントが終了するまでhNormalWindow1は
> 作られないのかなとも思ったのですが、
> それでもその解決が分かりません。
>
> ノーマルウインドウのハンドルhNormalWindow1が作成されているかどうか、
> 確認するにはどうしたら良いのでしょうか。
「ウィンドウ編集」ウィンドウの右側に「スタイル」の項があるので「可視」にチェックを付けます。
レクありがとうございます。
再びのレクありがとうございます。
「可視」のチェック、ウインドウが表示されました。
ただ、このチェックでは上のプログラムでやっていたウインドウの
大きさのセットなど諸々の操作が出来ず、やはりハンドルの取得が
必要かなと思っています。
モードレスダイアログウインドウの場合では、「CreateDialog()」の
戻り値で取得することが出来、ハッキリとハンドルが「いつ」取得出来るのか
を意識してプログラムを組むことが出来ました。
同じことを通常ウインドウで行うにはやはり「CreateWindowEx()」を
使うべき(ヘルプによればこの戻り値でハンドルが取得出来るとあります)なのでしょうか?
「可視」のチェック、ウインドウが表示されました。
ただ、このチェックでは上のプログラムでやっていたウインドウの
大きさのセットなど諸々の操作が出来ず、やはりハンドルの取得が
必要かなと思っています。
モードレスダイアログウインドウの場合では、「CreateDialog()」の
戻り値で取得することが出来、ハッキリとハンドルが「いつ」取得出来るのか
を意識してプログラムを組むことが出来ました。
同じことを通常ウインドウで行うにはやはり「CreateWindowEx()」を
使うべき(ヘルプによればこの戻り値でハンドルが取得出来るとあります)なのでしょうか?
Re: レクありがとうございます。
NormalWindow1のCreateイベントでサイズを設定するのはどうですか?> 「可視」のチェック、ウインドウが表示されました。
> ただ、このチェックでは上のプログラムでやっていたウインドウの
> 大きさのセットなど諸々の操作が出来ず、やはりハンドルの取得が
> 必要かなと思っています。
わざわざ、MainWndのCreateイベントでNormalWindow1のサイズを設定する必要は無いと思いますが。。。
レクありがとうございます。
ありがとうございます。
NormalWindow1のCreateイベントでサイズの設定をするのは
方法なのですが、このNormalWindow1のサイズや諸設定は
メインのクリエイトで設定される変数によって変わってくるので
それで、どうしたもんかなと思っていました。
(最初からこのウインドウ表示させるかどうかも、場合により変わってしまいます)
もっともNormalWindow1のCreateイベントが
メインウインドウのCreateイベントよりも確実に「後」に実行されるなら
NormalWindow1のCreateイベントでそれらの変数を拾って
そこで改めてセットすることは可能です。ただ、一体NormalWindow1のCreateイベントが
いつ実行されているのか、(メインウインドウから見て)NormalWindow1のハンドルはいつ
利用可能になるのか、そこらがハッキリ掴めないままで。
それから、このNormalWindow1を一旦「破棄」してしまうと(モードレスダイアログの
「DelWnd」の様に)再びこのウインドウを「クリエイト」するには
どうすればいいのか、親ウインドウなどの設定はどうすればいいのか、
などということも。
もともとモードレスダイアログとして作っていたところで、
ただ「重なったときにいつも前面にある」のが今回のプログラムではどうにも邪魔で、
それで「通常ウインドウ」となったのがそもそもです。
ダイアログボックスのようにメインからコントロール出来たらと。
もう少し考えてみようと思います。
NormalWindow1のCreateイベントでサイズの設定をするのは
方法なのですが、このNormalWindow1のサイズや諸設定は
メインのクリエイトで設定される変数によって変わってくるので
それで、どうしたもんかなと思っていました。
(最初からこのウインドウ表示させるかどうかも、場合により変わってしまいます)
もっともNormalWindow1のCreateイベントが
メインウインドウのCreateイベントよりも確実に「後」に実行されるなら
NormalWindow1のCreateイベントでそれらの変数を拾って
そこで改めてセットすることは可能です。ただ、一体NormalWindow1のCreateイベントが
いつ実行されているのか、(メインウインドウから見て)NormalWindow1のハンドルはいつ
利用可能になるのか、そこらがハッキリ掴めないままで。
それから、このNormalWindow1を一旦「破棄」してしまうと(モードレスダイアログの
「DelWnd」の様に)再びこのウインドウを「クリエイト」するには
どうすればいいのか、親ウインドウなどの設定はどうすればいいのか、
などということも。
もともとモードレスダイアログとして作っていたところで、
ただ「重なったときにいつも前面にある」のが今回のプログラムではどうにも邪魔で、
それで「通常ウインドウ」となったのがそもそもです。
ダイアログボックスのようにメインからコントロール出来たらと。
もう少し考えてみようと思います。
Re: レクありがとうございます。
> NormalWindow1のCreateイベントでサイズの設定をするのは
> 方法なのですが、このNormalWindow1のサイズや諸設定は
> メインのクリエイトで設定される変数によって変わってくるので
> それで、どうしたもんかなと思っていました。
> (最初からこのウインドウ表示させるかどうかも、場合により変わってしまいます)
> もっともNormalWindow1のCreateイベントが
> メインウインドウのCreateイベントよりも確実に「後」に実行されるなら
> NormalWindow1のCreateイベントでそれらの変数を拾って
> そこで改めてセットすることは可能です。ただ、一体NormalWindow1のCreateイベントが
> いつ実行されているのか、(メインウインドウから見て)NormalWindow1のハンドルはいつ
> 利用可能になるのか、そこらがハッキリ掴めないままで。
通常ウィンドウを2つ作成した場合は、メインウィンドウのクリエイトイベントが終了
してから2つ目のウィンドウが作成されます。
ですのでメインウィンドウのクリエイトで変数を設定しておき、2つ目のウィンドウで
その変数を使用しても問題ありません。
> それから、このNormalWindow1を一旦「破棄」してしまうと(モードレスダイアログの
> 「DelWnd」の様に)再びこのウインドウを「クリエイト」するには
> どうすればいいのか、親ウインドウなどの設定はどうすればいいのか、
> などということも。
前と同じ設定でいいのであれば、MakeWindow.wbpというのを開いて、
そのなかで
CreateWindowEx関数を呼んでいる行をそのままコピーすればOKです。
もしくはモーダルダイアログをhOwnerWindowを0にして呼び出せば
同じことができるかもしれません。
> 方法なのですが、このNormalWindow1のサイズや諸設定は
> メインのクリエイトで設定される変数によって変わってくるので
> それで、どうしたもんかなと思っていました。
> (最初からこのウインドウ表示させるかどうかも、場合により変わってしまいます)
> もっともNormalWindow1のCreateイベントが
> メインウインドウのCreateイベントよりも確実に「後」に実行されるなら
> NormalWindow1のCreateイベントでそれらの変数を拾って
> そこで改めてセットすることは可能です。ただ、一体NormalWindow1のCreateイベントが
> いつ実行されているのか、(メインウインドウから見て)NormalWindow1のハンドルはいつ
> 利用可能になるのか、そこらがハッキリ掴めないままで。
通常ウィンドウを2つ作成した場合は、メインウィンドウのクリエイトイベントが終了
してから2つ目のウィンドウが作成されます。
ですのでメインウィンドウのクリエイトで変数を設定しておき、2つ目のウィンドウで
その変数を使用しても問題ありません。
> それから、このNormalWindow1を一旦「破棄」してしまうと(モードレスダイアログの
> 「DelWnd」の様に)再びこのウインドウを「クリエイト」するには
> どうすればいいのか、親ウインドウなどの設定はどうすればいいのか、
> などということも。
前と同じ設定でいいのであれば、MakeWindow.wbpというのを開いて、
そのなかで
CreateWindowEx関数を呼んでいる行をそのままコピーすればOKです。
もしくはモーダルダイアログをhOwnerWindowを0にして呼び出せば
同じことができるかもしれません。
レスありがとうございます。
レスありがとうございます。返信が遅れてすみません。
それから、
セットしてた感じがします。「必ず親子にしなくてはならないんじゃ
ないか」って固定観念でもって。
本当に、ここを0にすれば思っていた動作をしてくれますね。
ノッチさん、それからNoWestさん、長くなってしまいましたが、
ありがとうございました。
またよろしくお願いします。
メインウィンドウのクリエイトイベントの後、なんですね。通常ウィンドウを2つ作成した場合は、メインウィンドウのクリエイトイベントが終了
してから2つ目のウィンドウが作成されます。
ですのでメインウィンドウのクリエイトで変数を設定しておき、2つ目のウィンドウで
その変数を使用しても問題ありません。
これは、是非試してみようと思います。前と同じ設定でいいのであれば、MakeWindow.wbpというのを開いて、
そのなかで
CreateWindowEx関数を呼んでいる行をそのままコピーすればOKです。
それから、
思えば自分は、「親ウインドウ」という設定を、なんとなくでhOwnerWindowを0にして呼び出せば
同じことができるかもしれません。
セットしてた感じがします。「必ず親子にしなくてはならないんじゃ
ないか」って固定観念でもって。
本当に、ここを0にすれば思っていた動作をしてくれますね。
ノッチさん、それからNoWestさん、長くなってしまいましたが、
ありがとうございました。
またよろしくお願いします。