none
ウインドウ透明領域のクリックイベント取得方法 RRS feed

  • 質問

  • ウインドウに透明な領域を作って、そこでおきるマウスクリックイベントを取得していと思っています。

    例えば次のようなウインドウの3x3のグリッドの真ん中へのMouseDownを拾いたいのですが

    イベントが発生しないようです。また、Previewイベントも同様に発生しませんでした。

    <Window x:Class="TestTransparentClick.MainWindow"
    		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    		Title="MainWindow" Height="350" Width="525"
    		WindowStyle="None" AllowsTransparency="True" Background="Transparent">
    	<Grid>
    		<Grid.ColumnDefinitions>
    			<ColumnDefinition Width="1*"/>
    			<ColumnDefinition Width="1*"/>
    			<ColumnDefinition Width="1*"/>
    		</Grid.ColumnDefinitions>
    		<Grid.RowDefinitions>
    			<RowDefinition Height="1*"/>
    			<RowDefinition Height="1*"/>
    			<RowDefinition Height="1*"/>
    		</Grid.RowDefinitions>
    		<Grid Grid.ColumnSpan="3" Background="Blue"/>
    		<Grid Grid.Row="1" Background="Blue"/>
    		<Grid Grid.Row="1" Grid.Column="1" Background="Blue" MouseDown="Grid_MouseDown"/>
    		<Grid Grid.Row="1" Grid.Column="2" Background="Blue"/>
    		<Grid Grid.Row="2" Grid.ColumnSpan="3" Background="Blue"/>
    	</Grid>
    </Window>
    
    

    色をちょっとだけ不透明にするとイベントは発生するようになりましたが、完全な透明のまま

    イベントを拾う方法は無いでしょうか?

    よろしくお願いいたします。

     

    2011年8月9日 7:34

回答

  • WinForms でも WPF でも、完全に透過の部分は 不定形ウィンドウ として処理されます。つまり、矩形ではないウィンドウを作成します。このため、東名部分にはウィンドウがありません。無いものに対してイベントは発生しようがないので、なんらかの対応が必要になります。

    • 見えないような色をつける
    • 透明にしないで、不透明のウィンドウに背景が透過したような画像を自分で描画する
    • フレームワークで提供されている透過処理を使用せず、自分で透過関連の実装を行い透明なウィンドウを生成する

    などが考えられます。

    • 回答としてマーク hamling-ling 2011年8月30日 9:32
    2011年8月9日 9:25
  • 2番目と3番目の方法は大変だと思うので1番目の方法になるのですが、以下のような背景色にしてもダメなほど完全な透明を求められてるのでしょうか。

    Background="#01FFFFFF"
    

    自分の目的には透明と区別がつきませんでした。


    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    • 回答としてマーク hamling-ling 2011年8月30日 9:32
    2011年8月15日 6:04
  • コメントありがとうございます。

    そうですか、3番目は不可能なんですね。

    また、2番目に関する方法のご提示もありがとうございました。

    大変だが可能であると理解しました。今後何かの際に参考にさせていただきます。

     

    • 回答としてマーク hamling-ling 2011年8月30日 9:42
    2011年8月30日 9:42

すべての返信

  • WinForms でも WPF でも、完全に透過の部分は 不定形ウィンドウ として処理されます。つまり、矩形ではないウィンドウを作成します。このため、東名部分にはウィンドウがありません。無いものに対してイベントは発生しようがないので、なんらかの対応が必要になります。

    • 見えないような色をつける
    • 透明にしないで、不透明のウィンドウに背景が透過したような画像を自分で描画する
    • フレームワークで提供されている透過処理を使用せず、自分で透過関連の実装を行い透明なウィンドウを生成する

    などが考えられます。

    • 回答としてマーク hamling-ling 2011年8月30日 9:32
    2011年8月9日 9:25
  • ご回答ありがとうございます。

     

    1番目のデメリットである"見えないような色がついてしまう"というのに

    比べると、2と3番目はあまりに大変そうです。

     

    しかし、本件はあえて完全透明で出来ないか?を調べておりますので、可能なら

    2番目か、3番目の案を実現するに当たり参考サイトなどあればご教授ください。

     

    2011年8月9日 11:13
  • 2番目と3番目の方法は大変だと思うので1番目の方法になるのですが、以下のような背景色にしてもダメなほど完全な透明を求められてるのでしょうか。

    Background="#01FFFFFF"
    

    自分の目的には透明と区別がつきませんでした。


    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    • 回答としてマーク hamling-ling 2011年8月30日 9:32
    2011年8月15日 6:04
  • WPF ではなくWinFormsの透過処理であるLayedWindowでは、

    Hit testing of a layered window is based on the shape and transparency of the window. This means that the areas of the window that are color-keyed or whose alpha value is zero will let the mouse messages through. However, if the layered window has the WS_EX_TRANSPARENT extended window style, the shape of the layered window will be ignored and the mouse events will be passed to other windows underneath the layered window.

    ということらしいので、OS の機能としては透明な部分に対する操作はサポートしていないようです。おそらく、WPF でも最終的にいきつくところは同じでしょうから、3番目は不可能ということになります。

    2番目の方法ですが、透過ウィンドウのように下位のウィンドウをリアルタイムに表示するのはちょっと面倒です。自身が表示される直前の絵が透過していれば良い場合や定期的に更新することで疑似的に透過を漂っ現する場合、Display DC を取得して画像化してしまっておくとよいでしょう。定期的に更新する場合には、「透明にする→Display DCから画像を作成→不透明にする」という手順で、ユーザに気が付かれずに更新することができます。


    2011年8月15日 8:27
  • ご回答ありがとうございます。
    >2番目と3番目の方法は大変だと思うので1番目の方法になるのですが、以下のような背景色にしてもダメなほど完全な透明を求められてるのでしょうか。
    完全な透明というよりもちょっとだけ不透明にする方法が、全うかどうかの判断材料を
    求めていました。しかし皆様のアドバイスを頂いて、その方法が妥当であることの確信を
    得ることができました。お提案のとおりBackground="#01FFFFFF"とすることで
    対応したいと思います。

    2011年8月30日 9:31
  • コメントありがとうございます。

    そうですか、3番目は不可能なんですね。

    また、2番目に関する方法のご提示もありがとうございました。

    大変だが可能であると理解しました。今後何かの際に参考にさせていただきます。

     

    • 回答としてマーク hamling-ling 2011年8月30日 9:42
    2011年8月30日 9:42