DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームを常にアクティブにしておくには?

環境/言語:[Windows XP  VS2005]
分類:[.NET]

すみません、説明の仕方が間違ってました。

フォームを常にアクティブに固定しておくにはどうすればよいでしょうか?
そのアクティブなフォームを別のフォームで操作したいのです。

よろしくお願いします!
■No20129に返信(kawagutiさんの記事)
> そのアクティブなフォームを別のフォームで操作したいのです。

意味がよくわかりませんでしたので、もう少し具体的な実現したいことを書いて頂けないでしょうか?
なおアクティブにする範囲はアプリケーション内での話でしょうか?
OS 全体の話であればユーザービリティと他のアプリケーションの迷惑という観点で大反対します。
実現したいことは、グラフィックソフトの様なものを作成したいのです。

一つのソフトの中で、そのソフトで開いたファイルを
パレットで操作したいのです。

複数のファイルを開くことができて、アクティブなファイルを、
パレットのボタンなどで、効果を加えたりしたいのです。

パレットは自由に移動できるものです。

よろしくお願いします!
■No20133に返信(kawagutiさんの記事)
> 複数のファイルを開くことができて、アクティブなファイルを、
> パレットのボタンなどで、効果を加えたりしたいのです。

NOACTIVATEスタイルを指定した
継承フォームを使うのがいいのかな?

Private Const WS_EX_NOACTIVATE As Integer = &H8000000
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim p As CreateParams = MyBase.CreateParams
If Not MyBase.DesignMode Then
p.ExStyle = p.ExStyle Or WS_EX_NOACTIVATE
End If
Return p
End Get
End Property
下の様にしたのですが・・・・
何が問題なのでしょうか?
これは、Form7のすべてのコードです。

このForm7を、クリックすると
タイトルバーが青くなりアクティブになりますけど・・・

もう少しで、何とかなるような気がします、

お願いします・・・


Public Class Form7

Private Const WS_EX_NOACTIVATE As Integer = &H8000000

Protected Overrides ReadOnly Property CreateParams() As CreateParams

Get
Dim p As CreateParams = MyBase.CreateParams
If Not MyBase.DesignMode Then
p.ExStyle = p.ExStyle Or WS_EX_NOACTIVATE
End If
Return p
End Get

End Property

End Class
■No20136に返信(kawagutiさんの記事)
> 下の様にしたのですが・・・・
> 何が問題なのでしょうか?
> このForm7を、クリックすると
> タイトルバーが青くなりアクティブになりますけど・・・

ありゃりゃ。すみません。
適当なことをいったらやっぱりだめでしたか。

WS_EX_NOACTIVATEは他のアプリケーションがフォーカスを持ってるときに
クリックしてもアクティブ化されないってスタイルですので、
目的と違いますよね。
> フォームを常にアクティブに固定しておくにはどうすればよいでしょうか?
> そのアクティブなフォームを別のフォームで操作したいのです。

逆に、「別のフォーム」がアクティブにならないようにするというのではどうでしょうか?

> 逆に、「別のフォーム」がアクティブにならないようにするというのではどうでしょうか?

アクティブなフォームにピクチャーボックスがあるとします、
もう一つのフォームにボタンがあるとします。

たとえば、ボタンを押してピクチャーボックスの
バックカラーを変えようとする場合、

ボタンを押すときに、ボタンがあるフォームが
アクティブになってしまいます。

何かよい方法はないでしょうか?
■No20152に返信(kawagutiさんの記事)
> ボタンを押すときに、ボタンがあるフォームが
> アクティブになってしまいます。
>
> 何かよい方法はないでしょうか?

アクティブというのは、ユーザーがそのwindowで作業しているという印で、
Windowsで一つしかありません(正確にはちょっと違うけど)

ですので、ボタンを押すときには、
そのボタンを含むフォームがアクティブになっていないと押せません。

本当にアクティブにならないフォームがあると、
そのフォームのボタンは押せませんし、テキストも入力できませんし、
xボタンも聞きませんし、移動もサイズ変更もできません。

また、本当にアクティブになりつづけるフォームがあると、
そのフォーム以外のフォームで作業することができません。

それでも良ければ、
ActivatedイベントやOnActivatedメソッドでActivateメソッドを呼べば、
(NonClientAreaを除けば)実現できます。
たぶん、望みの動作ではないと思いますが。

描画ソフトなどでよく用いるツールウィンドウを作りたいのでしたら、
FormBorderをSizable/FixedToolWindowにして、
先ほどのNOACTIVATEを指定して、
Minimize/MaximizeBoxを消して、
…、
といった操作をしたフォームを使えばよいと思います。

FocusとかActiveとかZ-Orderとか、
ややこしいので私も覚えていません。
昔のコードを見直してみたんですが、
細かい振る舞いまで気にすると、
かなり大変なようです。
(しかも本当に正しいのかどうかわからない)

ツールボックスの操作の対象は、
アプリケーションで覚えておく必要があります。

というか、
普通、ツールの親ウィンドウって一つですから、
アクティブでなくなっても
問題ないのでは?
2007/07/27(Fri) 03:56:33 編集(投稿者)

■No20152に返信(kawagutiさんの記事)
>
>>逆に、「別のフォーム」がアクティブにならないようにするというのではどうでしょうか?
>
> アクティブなフォームにピクチャーボックスがあるとします、
> もう一つのフォームにボタンがあるとします。
>
> たとえば、ボタンを押してピクチャーボックスの
> バックカラーを変えようとする場合、
>
> ボタンを押すときに、ボタンがあるフォームが
> アクティブになってしまいます。
>
> 何かよい方法はないでしょうか?

過去ログにありますので、とりあえずはそちらをご覧ください。

http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=18849&no=0&KLOG=1
ありがとうございました。

解決しました!

フォームにタグを付けて、管理すれば
問題を処理できました。

ありがとう!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板