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