UWSCのポップアップメニューのフォントを変更する

UWSCのPOPUPMENU関数はフォントの変更ができない。
公式掲示板に変更する方法はないか?という質問があったので、考えてみた。

結論

もっとも簡単なのは、システム設定を変える。
でも、これはメニューの文字全てが大きくなってしまうので、影響が大きい。
次に簡単なのは、PowerShellで出す。
しかし、UWSCPOWERSHELL関数は遅い。
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」で検索すると、私が前に書いたのが結構上位にいるのですね。
こっちが高機能ですし、直しておきますか。
いや、新しく書くかな。