UWSCのポップアップメニューのフォントを変更する
UWSCのPOPUPMENU関数はフォントの変更ができない。
公式掲示板に変更する方法はないか?という質問があったので、考えてみた。
結論
もっとも簡単なのは、システム設定を変える。
でも、これはメニューの文字全てが大きくなってしまうので、影響が大きい。
次に簡単なのは、PowerShellで出す。
しかし、UWSCのPOWERSHELL関数は遅い。
pshモジュールを使うように修正すれば、少しは改善するけど。
面倒なのは、オーナードロー。
これは、面倒すぎてサンプルを書く気にならなかった。
余程強いモチベーションがないと嫌かな、、、。
システム設定変更案
簡単だけどデメリットの大きい。
Windows7だと、「コントロールパネル」「デスクトップのカスタマイズ」「個人設定」「ウインドウの色」で
出てくる「ウインドウの色とデザイン」で、メニューの文字をクリックし、フォント・サイズを変更する。
全てのメニューの大きさが変わるので、あまりお勧めではないが楽。
PowerShellで出す案
PowerShellで自前のコンテキストメニューを出す。
ま、以下を実行してみてよ。
TEXTBLOCK _psh_code $Splitter = ',' $Separator = '^' $Items = '<#ITEMS>'.Split($Splitter) $x = [int]::MinValue $y = [int]::MinValue $FontName = '<#FONTNAME>' $FontSize = [single]<#FONTSIZE> if(!('System.Windows.Forms.Form' -as [type])) { Add-Type -AssemblyName System.Windows.Forms } $form = New-Object System.Windows.Forms.Form $form.Opacity = 0 $form.ShowInTaskbar = $false $onClick = { Param ($sender, $ev) $form.Name = $sender.Name } $components = New-Object System.ComponentModel.Container $contextMenu = New-Object System.Windows.Forms.ContextMenuStrip $components $contextMenu.SuspendLayout() $mis = New-Object 'System.Collections.Generic.List[System.Collections.Generic.List[System.Windows.Forms.ToolStripMenuItem]]' $mis.Add((New-Object 'System.Collections.Generic.List[System.Windows.Forms.ToolStripMenuItem]')) $idxb = 0 $idxs = 0 $idxsp = @() for($i = 0; $i -lt $Items.Count; $i++) { $put = $true if([string]::IsNullOrEmpty($Separator)) { $it = @() $it += $Items[$i] } else { $it = $Items[$i].Split($Separator, 2) } if($it[0].Length -gt 0) { if($it[0][0] -eq '\') { switch($it[0][1]) { '>' { $idxsp += $idxs $idxb++ $idxs = 0 $mis.Add((New-Object 'System.Collections.Generic.List[System.Windows.Forms.ToolStripMenuItem]')) $put = $false } '<' { $idxb--; $idxs = $idxsp[$idxb] $mis[$idxb][$idxs - 1].DropDownItems.AddRange($mis[$idxb + 1].ToArray()) $mis[$idxb][$idxs - 1].Remove_Click($onClick) $put = $false } default { $it[0] = $it[0].Substring(1); } } } } if($put) { $mis[$idxb].Add((New-Object System.Windows.Forms.ToolStripMenuItem $it[0])) if($it.Count -eq 1) { $mis[$idxb][$idxs].Name = $it[0] } else { $mis[$idxb][$idxs].Name = $it[1] } $mis[$idxb][$idxs].Font = New-Object System.Drawing.Font $FontName, $FontSize $mis[$idxb][$idxs].Add_Click($onClick) $idxs++ } } $contextMenu.Items.AddRange($mis[0].ToArray()) $contextMenu.Add_Closed({ $form.Close() }) $contextMenu.ResumeLayout($false) $timer = New-Object System.Windows.Forms.Timer $timer.Interval = 10 $timer.Add_Tick({ $timer.Enabled = $false if($x -eq [int]::MinValue) { $x = [System.Windows.Forms.Cursor]::Position.X } if($y -eq [int]::MinValue) { $y = [System.Windows.Forms.Cursor]::Position.Y } $contextMenu.Show($x, $y) }) $timer.Enabled = $true [void]$form.ShowDialog() $form.Name $contextMenu.Dispose() $components.Dispose() $form.Dispose() ENDTEXTBLOCK MSGBOX(POWERSHELL(REPLACE(REPLACE(REPLACE(_psh_code,"<#ITEMS>","a,\>,aa,ab,\>,aba,abb,\<,ac,\<,b,c"),"<#FONTNAME>","HGP創英角ポップ体"),"<#FONTSIZE>","32")))
最後のMSGBOXでポップアップメニューを表示しているわけです。
リターンの文字列には改行が含まれているっぽいですね。
前に書いたのをフォント変更に対応しました。
_psh_codeの<#ITEMS>や<#FONTNAME>や<#FONTSIZE>をREPLACEすることで、内容を変えられるようにしています。<#FONTNAME>や<#FONTSIZE>は説明不要かと思います。<#ITEMS>は前に書いた「使い方」を参考にしてください。
もし、pshモジュールを使って早くしたいなら、PowerShellのスクリプトを分割し、$form等は作りっぱなしで、$contextMenu.Itemsを適宜変えられるようにしたら良いと思います。
UWSCのPOPUPMENUをのっとってオーナードロー案
すみません、これは面倒なのでパスです。
Asmモジュールを使って、UWSCをのっとれば可能です。
他にも方法があるような気がするけど、、、ちょっと思いついてません。
どうでも良いけど、「ポップアップメニュー PowerShell」で検索すると、私が前に書いたのが結構上位にいるのですね。
こっちが高機能ですし、直しておきますか。
いや、新しく書くかな。