ウィンドウにフォーカスが移動しないようにするには?


なお  2004-02-06 13:22:17  No: 81857  IP: [192.*.*.*]

自作のドロップダウンメニューコントロールを作成しています。
環境は、

OS:Win2000
言語:VB6.0 SP5

です。

UserControl内にラベルを配置し、それにマウスが乗ったときにドロップダウンメニューを表示しようと思い、UserControlからドロップダウン用のフォーム(以下DD用のフォーム)を表示するよう作りました。
で、作ったコントロールをフォームに貼り付けてドロップダウンさせてみると、フォームのフォーカスがDD用のフォームに移ってしまっているようなのです。

なので、DD用のフォームにフォーカスが移らないようにしたいのです。フォーカスを持たないウィンドウって作成できるのでしょうか?

知っている方がおりましたら、ぜひお教えください。

編集 削除
いちゆ  2004-02-06 16:09:24  No: 81858  IP: [192.*.*.*]

…SetWindowPosでZオーダーを最下位にするとか?
…それよりも、
「ラベルの形だけどドロップダウンもできるぞ」
とかいうユーザコントロールを作ったほうがいいかも?

編集 削除
なお  2004-02-06 17:45:31  No: 81859  IP: [192.*.*.*]

>SetWindowPosでZオーダーを最下位にするとか?
最下位にしてみましたが、やはりフォーカスが移ってしまいますね。しかもオーナーフォームの後ろにでてしまいます(当然?)。

>「ラベルの形だけどドロップダウンもできるぞ」

イメージ認識が合ってるかどうかわかりませんが、今作っているのがそういう感じのものだと思います。

本家のコンボボックスのドロップダウンリストってどうやって作ってるんだろ?
ネットで探してみたけど、自作のドロップダウンリスト作ってる人は見当たらなかったんですよねー・・・

編集 削除
いちゆ  2004-02-06 18:15:58  No: 81860  IP: [192.*.*.*]

>>SetWindowPosでZオーダーを最下位にするとか?
>最下位にしてみましたが、やはりフォーカスが移ってしまいますね。しかもオーナーフォームの後ろにでてしまいます(当然?)。
最下位にするのはShow(Visible=Trueでも)の後にしてみて。
…でも、この方法だとキー入力を受け付けるかどうか…
いま環境がないからよく言えない。

>>「ラベルの形だけどドロップダウンもできるぞ」
>
>イメージ認識が合ってるかどうかわかりませんが、今作っているのがそういう感じ>のものだと思います。
>
>本家のコンボボックスのドロップダウンリストってどうやって作ってるんだろ?
>ネットで探してみたけど、自作のドロップダウンリスト作ってる人は見当たらなか>ったんですよねー・・・
UserControlにラベルとドロップダウンリスト作っておいて、
マウスがラベルの上にきたらラベルを隠してドロップダウンリストを変わりに表示。
ドロップダウンリストからマウスが外れたらまたリストに戻す、とか…

すまない…あんまりこういうの考えたことないからよくわからん。

編集 削除
コムサン  2004-02-06 18:39:18  No: 81861  IP: [192.*.*.*]

> DD用のフォームにフォーカスが移らないようにしたいのです。
貼り付たフォームのキャプションバーをアクティブなキャプションバー
になる様に再描画すればいいのでは?

編集 削除
なお  2004-02-08 11:48:15  No: 81862  IP: [192.*.*.*]

>貼り付たフォームのキャプションバーをアクティブなキャプションバー
>になる様に再描画すればいいのでは?

具体的にはどうすればよいのでしょうか?
勉強不足なのかよく意味がわかりませんでした(--;

編集 削除
訛り武士  2004-02-10 18:26:09  No: 81863  IP: [192.*.*.*]

>> 貼り付たフォームのキャプションバーをアクティブなキャプションバー
>> になる様に再描画すればいいのでは?

> 具体的にはどうすればよいのでしょうか?

レスが無い様なので想像で一言。
「フォームのフォーカスがDD用のフォームに移ってしまう」の問題点が、
「貼り付たフォームのキャプションバーが非アクティブな色になる」
現象だと仮定した上で、その回避策が「キャプションバーを
アクティブなキャプションバーになる様に再描画すればいい」
ということでしょう?多分

現象や問題点を明らかすれば、いろいろ回避策があると思いますが?

編集 削除
なお  2004-02-11 00:19:05  No: 81864  IP: [192.*.*.*]

レスありがとうございます。

「アクティブなキャプションバーになる様に再描画」ということがよくわからないのです・・・
具体的には、どんなAPIを調べたらよいのかわかりませんでした。
分かりにくい書き方でもうしわけないです。

ちなみにいろいろ探してみて、DD用フォームをSetWindowLongでNO_ACTIVATEにしてみましたがだめでした。

編集 削除
訛り武士  2004-02-11 12:31:50  No: 81865  IP: [192.*.*.*]

相変わらず問題点が明らかになっていない様ですね?
「フォームのフォーカスがDD用のフォームに移ってしまう」ことで、
困ることって何でしょうか?

「アクティブなキャプションバーになる様に再描画」ということは、
フォームのフォーカスがDD用のフォームに移った場合、
フォームは非アクティブのままなので、アクティブであるかの様に偽装
することだろうと思います。

この方法で問題点が回避できるかわかりませんが、
例えば、フォームがアクティブ/非アクティブになる場合、
WM_NCACTIVATEメッセージが飛んでくるので、そのwParamを操作
すれば、「アクティブなキャプションバーになる」と思います。

編集 削除
なお  2004-02-15 23:39:49  No: 81866  IP: [192.*.*.*]

機能上はさほど問題ではないですが、例えばコンボボックスのドロップダウンリストを開いたときに、親フォームが非アクティブになったとしたら、コントロールとしてちょっとおかしい気がしません?
今作っているのはドロップダウンメニューコントロールで、ラベル上にマウスがあるときに自動でサブメニューがドロップダウンするように作っているのですが、ドロップダウンすると親フォームが非アクティブになってしまうのでちょっとかっこ悪いとおもいまして・・・。

>例えば、フォームがアクティブ/非アクティブになる場合、
>WM_NCACTIVATEメッセージが飛んでくるので、そのwParamを操作
この前知ったばかりなんですが、サブクラス化というやつですよね?
ありがとうございます、ためしてみます。

編集 削除