透明化したエリア内でマウスのイベント処理

タグの編集
投稿者 N88-Basic  (社会人) 投稿日時 2023/8/6 15:51:26
Winodws 11 Home + Visual Studio 2022( Basic )にて付箋紙のようなアプリを作成しています。

条件としては、付箋紙エリア外にマウスがあるときにテキストエリアの背景を透明にし、エリア内にある時は不透明にしたいと思っております。

Private Sub TextBox(sender As Object, e As EventArgs) Handles TextBox.MouseEnter
        Me.TransparencyKey = TextBox.BackColor
        Me.AllowTransparency = True
End Sub

Private Sub TextBox(sender As Object, e As EventArgs) Handles TextBox.MouseLeave
        Me.AllowTransparency = False
End Sub

背景が透明になるとイベントが取得できないようで、文字などがあればイベントが取得できるようです。

現在は、少し見にくいですが Me.Opacity の値を調整しています

以上、対応策等をご存じでしたらご教授ください。

投稿者 (削除されました)  () 投稿日時 2023/8/7 01:14:05
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/8/7 11:02:12
> Private Sub TextBox(sender As Object, e As EventArgs) Handles TextBox.MouseLeave
いやいやいやいや。それは流石に嘘でしょう。

System.Windows.Forms.TextBox クラスのインスタンスに、"TextBox1" 等ではなく
クラス名と同じ "TextBox" という名をそのまま付けるという点までは分かります。

しかし、Handles TextBox.MouseLeave のイベントハンドラーの名前までも
"Sub TextBox" にしてしまっては、フォーム上で名前が競合してしまうので
コンパイルエラー(BC30260)になってしまうはずですよ?
そのまま "Sub TextBox_MouseLeave" あたりにしておくべきかと。

> 付箋紙のようなアプリを作成しています。
「付箋紙『のような』アプリ」とやらが、どういう構成なのかの説明が欲しかった…。


> 付箋紙エリア外にマウスがあるときにテキストエリアの背景を透明にし、エリア内にある時は不透明にしたいと思っております。

ひとまず、Form1 に TextBox だけを貼った状態で、質問文では
 Form1 部…「付箋紙エリア」と呼称
 TextBox1 部…「テキストエリア」と呼称
と呼ばれているのだと想定してみます。

MouseLeave/MouseEnter だとコントロール数が増えると面倒なので、
手抜きで Timer で座標を調べてみるとか。
https://gist.github.com/Benshi/237a1ab8b34110791f9a8c20089dd7d2

一方、TrancparencyKey プロパティでくりぬいた場合、
文字周辺のアンチエイリアス部が綺麗に切り抜けません。
真面目にやるなら、 UpdateLayeredWindow API 方式に切り替えるとか。
https://wiki.onakasuita.org/pukiwiki/?UpdateLayeredWindow
https://www.codeproject.com/Articles/1822/Per-Pixel-Alpha-Blend-in-C
投稿者 N88-BASIC  (社会人) 投稿日時 2023/8/8 09:07:08
魔界の仮面弁士さん、ご連絡ありがとうございます。

>いやいやいやいや。それは流石に嘘でしょう
 申し訳ありません。エディタからコピペしたテキストでコントロール名を一般名に変更したのですが、配慮に欠けていたようです。

>「付箋紙『のような』アプリ」とは?
 Windows 添付の付箋紙とは同じようなものですが、タスクバーにアイコンが表示されるのと、TopMost にならないのでメモなどを参照するのに不便なためです。邪魔にならないように背景も透明にしたほうがいいのではと考えたものです。目的はアプリ作成に使う特殊文字の羅列や、気になる株の購入価格を見ながら売り時を確認するためです。

>MouseLeave/MouseEnter だとコントロール数が増えると面倒なの、、、
 ご指摘のように、背景を透明にしてしまうと、MouseLeave のイベントが発生しないようで、パネル内にテキストボックスを置こうとしましたが、テキストボックスから離れてアプリ外に移動するときに、パネルに対して MouseEnter / MouseLeave が連続して起きてしまうので管理が複雑になり諦めました

 残念ながら自動化はあきらめ、手動で透明、不透明を行うようにしました。

以上、お手数をおかけして申し訳ありません。今後ともよろしくお願いいたします。