質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

912閲覧

Form上にマウスカーソルが無いときは Formを半透明 にしたい

kamikazelight

総合スコア305

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/01/12 02:10

編集2019/01/12 05:09

前提・実現したいこと

Formを 普段は半透明で マウスカーソルをForm上に持って行った時だけ不透明にしたいです。
何か方法はないでしょうか?


試したこと_1

Formにイベント追加

  • MouseEnter イベント で Form を 不透明 化
  • MouseLeave イベント で Form を 半透明 化
発生問題_1

Form内の他のコントロール上にカーソルが移動したとき等
半透明になってしまう。

試したこと_2
  • リストForm内の全てのコントロールにForm同様のイベントを追加
発生問題_2 ← 現在

Formのタイトルバー上にカーソルが移動したときに
半透明になってしまう。

サンプルコード

powershell

1using namespace System.Windows.Forms 2using namespace System.Drawing 3 4 5$_Get_Form = { 6 #フォームの作成 7 $FormWed = 600 8 $FormlHei = 300 9 $Form = [Form]::new() 10 $Form.Size = [Size]::new($FormWed, $FormlHei) 11 $Form.Text = "Test" 12 13 #データグリッドビューの作成 14 $ListCount = 2 15 $Script:List = 1..$ListCount | foreach { [DataGridView]::new() } 16 $ListName = @('test1', 'test2') 17 for ($i = 0; $i -lt $ListCount; $i++) 18 { 19 $List[$i].AutoSizeColumnsMode = [DataGridViewAutoSizeColumnsMode]::AllCells 20 $List[$i].AutoSizeRowsMode = [DataGridViewAutoSizeRowsMode]::AllCells 21 $List[$i].Name = "List_$($ListName[$i])" 22 $List[$i].Dock = [DockStyle]::Fill 23 } 24 $List[0].Add_SelectionChanged($_ListNowUp) 25 $List[0].MultiSelect = $false 26 #$List[1].Columns[0].DefaultCellStyle.WrapMode = [DataGridViewTriState]::True 27 28 $SplitContainer = [SplitContainer]::new() 29 $SplitContainer.Panel1.Controls.Add($List[0]) 30 $SplitContainer.Panel2.Controls.Add($List[1]) 31 $SplitContainer.Name = "SplitContainer_1" 32 $Form.Controls.Add($SplitContainer) 33 34 35 36 $Form.Add_Activated({ 37 $Form.TopMost = $True 38 }) 39} 40 41$_Form_Semitransparent = { 42 $_Fm= $Form 43 $_Fm.Opacity = 0.1 44} 45 46$_Form_Opacity = { 47 $_Fm= $Form 48 $_Fm.Opacity = 1 49} 50 51$_AllControls = { 52 53 param([Control]$Control) 54 55 $Control.Controls | foreach { 56 $($_AllControls.Invoke($_)) 57 } 58 $Control 59} 60 61.$_Get_Form 62$($_AllControls.Invoke($Form)) | foreach { 63 $_."Add_MouseEnter"($_Form_Opacity) 64 $_."Add_MouseLeave"($_Form_Semitransparent) 65} 66 67$Form.ShowDialog() 68 69

補足情報

Win10

  • From は System.Windows.Forms.Form の オブジェクト です
  • Form中のControlにはNestされているものもあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/01/12 04:44

コードを提示してください
guest

回答1

0

ベストアンサー

マウス関連のイベントだと面倒そうだったため、
タイマーを使って、フォームの大きさ(Bounds)とマウスの位置([Cursor]::Position)の関係を監視するアプローチとしてみました。

powershell

1using namespace System.Windows.Forms 2using namespace System.Drawing 3 4Set-StrictMode -Version Latest 5 6[scriptblock]$_Get_Form = { 7 #フォームの作成 8 [Form]$Form = 9 New-Object -TypeName Form -Property @{ 10 Width = 600 11 Height = 300 12 Opacity = 0.1 13 Text = 'Test' 14 TopMost = $true 15 } 16 17 #データグリッドビューの作成 18 [string[]]$ListName = @('test1', 'test2') 19 [DataGridView[]]$List = 20 $ListName | 21 ForEach-Object -Process { 22 # 共通の設定は生成時に`-Property`で設定 23 New-Object -TypeName DataGridView -Property @{ 24 AutoSizeColumnsMode = [DataGridViewAutoSizeColumnsMode]::AllCells 25 AutoSizeRowsMode = [DataGridViewAutoSizeColumnsMode]::AllCells 26 Name = 'List_{0}' -f $_ 27 Dock = [DockStyle]::Fill 28 } 29 } 30 #$List[0].Add_SelectionChanged($_ListNowUp) 31 $List[0].MultiSelect = $false 32 #$List[1].Columns[0].DefaultCellStyle.WrapMode = [DataGridViewTriState]::True 33 34 [SplitContainer]$SplitContainer = [SplitContainer]::new() 35 $SplitContainer.Panel1.Controls.Add($List[0]) 36 $SplitContainer.Panel2.Controls.Add($List[1]) 37 $SplitContainer.Name = "SplitContainer_1" 38 $Form.Controls.Add($SplitContainer) 39 40 Export-ModuleMember -Variable Form, List 41} 42 43# `Export-ModuleMember`で設定した要素(Form, List)をメンバーとして持つPSCustomObjectを生成($Scirpt:~を避けたかったため) 44[psobject]$formContainer = New-Module -AsCustomObject -ScriptBlock $_Get_Form 45 46# タイマーの生成 47[Timer]$mouseMonitor = 48 New-Object -TypeName Timer -Property @{ 49 Interval = 50 50 Enabled = $true 51 Tag = $formContainer.Form # 仮にタグとしてフォームを設定(もっと良い方法がありそう) 52 } 53 54$mouseMonitor.add_Tick({ 55 [Form]$mainForm = $this.Tag # [Form]::ActiveForm 56 57 # タイトルバー含めたフォームの大きさは`Bounds`から、 58 # マウスの位置は`[Cursor]::Position`から取得できるため 59 # フォームの中に、マウスが入っているかどうかで確認 60 [int]$newOpacity = 61 if ($mainForm.Bounds.Contains([Cursor]::Position)) { 62 1 63 } else { 64 0.1 65 } 66 67 if ($mainForm.Opacity -ne $newOpacity) { # 負荷軽減のため(意味があるか未確認) 68 $mainForm.Opacity = $newOpacity 69 } 70}) 71 72$mouseMonitor.Start() 73$formContainer.Form.ShowDialog() > $null 74$formContainer.Form.Dispose() 75$mouseMonitor.Dispose() # Formとの紐付けが無いため、忘れないように

投稿2019/01/14 15:33

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2019/01/15 00:55

タイマーと座標を使って...ってところまでは考えていたのですが フォームの座標とサイズとカーソルの位置を取得して x,y座標を個別に範囲内か判定しようとしてました。 範囲内か確認するためにこんなにスマートな方法があるとは知りませんでした。 今回もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問