NextHE メニュー機能
秀丸エディタのマクロ用 .DLL です。
- メニュー機能
- menu 文ではメニューに追加した項目に自動的に番号が付きますが、NextHE では項目毎に番号を付ける事がでます。
状況に応じてメニュー項目を除外した表示を提供できるようになります。
また、サブ・メニューも実装できます。 - パターンマッチング(文字列比較)機能
- .NET Framework の正規表現を提供します。
10 を超える部分取り出し(キャプチャ)を提供します。 - 連想配列
- 連想配列(マップやハッシュとも呼ぶ)を提供します。
関数説明(C/C++)
秀丸エディタ マクロサンプル
PowerShell サンプル
関数説明(C/C++)
// 呼び出し規約
#define HEAPI __cdcel
//
typedef void* LPCONTEXTMENU;
// 最初に呼び出す
// メニュー・ハンドルを取得する
//
// 戻り値
// メニュー・ハンドル
//
// bitState
// 通常は 0 を渡す
// 0 でメニューが表示されない場合は 1 を渡す
// PowerShell では 1 を渡さないと表示されない
LPCONTEXTMENU HEAPI MenuBegin( INT_PTR bitState );
// 最後に呼び出す
// メニューのハンドルを破棄する
//
// 戻り値
// 必ず TRUE
//
// lpContext
// MenuBegin で取得したメニュー・ハンドル
INT_PTR HEAPI MenuEnd( LPCONTEXTMENU lpContext );
// メニューを表示する
// 事前に MenuInsertItemW / MenuInsertItemA で項目を追加しておくこと
//
// 戻り値
// 選択した項目の番号
// 未選択の場合は 0 になる
//
// lpContext
// MenuBegin で取得したメニュー・ハンドル
// hWnd
// ウィンドウ・ハンドル
// NULL を渡す事で現在フォアグラウンドのウィンドウになる
// nPositionIndex
// メニューの表示位置
// 0 はマウスカーソルのあるところ
// 1 はウィンドウの左上
// 2 はウィンドウの右上
// 3 はウィンドウの左下
// 4 はウィンドウの右下
// 5 はウィンドウの中央
INT_PTR HEAPI MenuShow( LPCONTEXTMENU lpContext, HWND hWnd, INT_PTR nPositionIndex );
// メニューに項目を追加する
// メニュー・アイテムの追加
//
// 戻り値
// 追加に成功した場合 TRUE になる
// 追加に失敗した場合 FALSE になる
//
// lpContext
// MenuBegin で取得したメニュー・ハンドル
// nItemID
// 項目番号。この項目を選択した場合に返す番号
// 0 を渡すとセパレータ(区切り)になる
// 0 を渡した場合 lpszText は無視する
// lpszText
// 項目名
INT_PTR HEAPI MenuInsertItemW( LPCONTEXTMENU lpContext, INT_PTR nItemID, wchar_t const* const lpszText );
INT_PTR HEAPI MenuInsertItemA( LPCONTEXTMENU lpContext, INT_PTR nItemID, char const* const lpszText );
// メニューの項目に項目を追加する
// サブ・アイテムの追加
//
// 事前に MenuInsertItemW / MenuInsertItemA で項目を追加しておくこと
// サブ・アイテムに対してもサブ・アイテムを追加可能
//
// 戻り値
// 追加に成功した場合 TRUE になる
// 追加に失敗した場合 FALSE になる
//
// lpContext
// MenuBegin で取得したメニュー・ハンドル
// nInsertItemID
// 項目番号。この項目にサブ・アイテムを追加する
// nItemID
// 項目番号。この項目を選択した場合に返す番号
// lpszText
// 項目名
INT_PTR HEAPI MenuInsertSubItemW( LPCONTEXTMENU lpContext, INT_PTR nInsertItemID, INT_PTR nItemID, wchar_t const* const lpszText );
INT_PTR HEAPI MenuInsertSubItemA( LPCONTEXTMENU lpContext, INT_PTR nInsertItemID, INT_PTR nItemID, char const* const lpszText );
秀丸エディタ マクロサンプル
// NextHE メニューを使えるように .DLL をロードする
loaddll "NextHE.dll";
// .DLL のロードの成功/失敗を確認
if( !result )
{
// .DLL のロードに失敗
message ".dllのロードに失敗しました。";
// マクロ終了
endmacro;
}
// メニュー開始(メニュー・ハンドルを取得する)
#Menu = dllfunc( "MenuBegin", 0 );
// メニュー項目を追加する
#r = dllfuncw( "MenuInsertItemW", #Menu, 101, "A" );
#r = dllfuncw( "MenuInsertItemW", #Menu, 102, "B" );
#r = dllfuncw( "MenuInsertItemW", #Menu, 0, "-" );
#r = dllfuncw( "MenuInsertItemW", #Menu, 103, "C" );
// サブ・メニュー項目を追加する
#r = dllfuncw( "MenuInsertSubItemW", #Menu, 103, 201, "C-1" );
#r = dllfuncw( "MenuInsertSubItemW", #Menu, 103, 202, "C-2" );
// サブ・メニューへサブ・メニューを追加する
#r = dllfuncw( "MenuInsertSubItemW", #Menu, 202, 211, "C-2-1" );
#r = dllfuncw( "MenuInsertSubItemW", #Menu, 202, 212, "C-2-2" );
// メニューを表示する
#i = dllfunc( "MenuShow", #Menu, hidemaruhandle(0), 0 );
// メニュー終了(メニュー・ハンドルを破棄する)
#r = dllfunc( "MenuEnd", #Menu );
// 選択したメニュー項目の番号を通知する
message "MenuShow: " + str(#i);
// .DLL を解放する
freedll;
PowerShell サンプル
# NextHE.dll のファイル・パス
$DLL = 'NextHE.dll'
# NextHE クラスを定義(C# ソース)
$SourceCS = "
using System;
using System.Runtime.InteropServices;
public class NextHE
{
[DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)]
public extern static IntPtr MenuBegin( IntPtr bitState );
[DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)]
public extern static IntPtr MenuEnd( IntPtr hPopupMenu );
[DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)]
public extern static IntPtr MenuShow( IntPtr hPopupMenu, IntPtr hWnd, IntPtr nPositionIndex );
[DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public extern static IntPtr MenuInsertItem( IntPtr hPopupMenu, IntPtr nItemID, string szText );
[DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public extern static IntPtr MenuInsertSubItem( IntPtr hPopupMenu, IntPtr nInsertItemID, IntPtr nItemID, string szText );
}"
# NextHE クラスを追加する
Add-Type $SourceCS
# メニュー開始(メニュー・ハンドルを取得する)
[IntPtr] $menu = [NextHE]::MenuBegin( 1 )
# メニュー項目を追加する
[void] [NextHE]::MenuInsertItem( $menu, 101, 'A' )
[void] [NextHE]::MenuInsertItem( $menu, 102, 'B' )
[void] [NextHE]::MenuInsertItem( $menu, 0, '-' )
[void] [NextHE]::MenuInsertItem( $menu, 103, 'C' )
# サブ・メニュー項目を追加する
[void] [NextHE]::MenuInsertSubItem( $menu, 103, 201, 'C-1' )
[void] [NextHE]::MenuInsertSubItem( $menu, 103, 202, 'C-2' )
# サブ・メニューへサブ・メニューを追加する
[void] [NextHE]::MenuInsertSubItem( $menu, 202, 211, 'C-2-1' )
[void] [NextHE]::MenuInsertSubItem( $menu, 202, 212, 'C-2-2' )
# メニューを表示する
[NextHE]::MenuShow( $menu, 0, 5 )
# メニュー終了(メニュー・ハンドルを破棄する)
[void] [NextHE]::MenuEnd( $menu )