(*---------------------------------------- MenuItem関係のユニット 2011/06/24(金) ・ 作成 2012/10/20(土) ・ MenuItem_GetSubItemCountFunc等を作成 //----------------------------------------*) unit MenuUnit; interface uses Menus, Math, Classes, Windows, Graphics, RectPointUnit, end_uses; function GetPopupMenuItemsRect(BaseHandle: THandle; PopupMenu: TPopupMenu; PopupPoint: TPoint): TRect; procedure PopupMenu_GetRectInitialize(PopupMenu: TPopupMenu); type TMenuItem_GetSubItemCountCompareFunction = function (SubMenuItem: TMenuItem): Boolean; function MenuItem_GetSubItemCountFunc(MenuItem: TMenuItem; Func: TMenuItem_GetSubItemCountCompareFunction): Integer; function MenuItem_GetSubItemEnableCount(MenuItem: TMenuItem): Integer; function MenuItem_GetSubItemVisibleCount(MenuItem: TMenuItem): Integer; implementation {--------------------------------------- ポップアップメニューのポップアップ起動するRectを取得 機能: 備考: 一度ポップアップしておかないと、GetMenuItemRectで 正しい値が取得できないので、あまり使えない。2011/06/27(月) 参考: GetMenuItemRect 解説/Delphi de Win32API http://www.geocities.jp/asumaroyuumaro/program/winapi/menu/getmenuitemrect.html 履歴: 2011/06/24(金) ・ 作成 }//(*----------------------------------- function GetPopupMenuItemsRect(BaseHandle: THandle; PopupMenu: TPopupMenu; PopupPoint: TPoint): TRect; var I: Integer; MenuItemMaxWidth: Integer; MenuItemHeight: Integer; MenuItemRect: TRect; begin Result := Rect(PopupPoint, PopupPoint); MenuItemHeight := 0; MenuItemMaxWidth := 0; for I := 0 to PopupMenu.Items.Count - 1 do begin if GetMenuItemRect(BaseHandle, PopupMenu.Handle, I, MenuItemRect) = False then Exit; MenuItemHeight := MenuItemHeight + GetRectHeight( MenuItemRect ) + 1; MenuItemMaxWidth := Max(MenuItemMaxWidth, GetRectWidth(MenuItemRect)); end; MenuItemMaxWidth := MenuItemMaxWidth + 8; Result := Rect(PopupPoint.X, PopupPoint.Y, PopupPoint.X + MenuItemMaxWidth, PopupPoint.Y + MenuItemHeight); end; //------------------------------------*) {--------------------------------------- ポップアップメニューの初期化。 PopupMenu_GetRectInitialize 機能: GetPopupMenuItemsRectが起動時から正しく動作するようにするために FormCreateイベントでPopupMenu_GetRectInitializeを実行すると メニューを開いて閉じる処理。 備考: ポップアップメニューを自動的に閉じるには? http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200503/200503_05030103.html 履歴: 2012/08/12(日) ・ 作成 2012/08/13(月) ・ 修正 2012/08/28(火) ・ Popupイベントが動作しないようにした。 }//(*----------------------------------- procedure PopupMenu_GetRectInitialize(PopupMenu: TPopupMenu); var EventBuffer: TNotifyEvent; begin if 1 <= PopupMenu.Items.Count then begin EventBuffer := PopupMenu.OnPopup; PopupMenu.OnPopup := nil; {↓このようにするとPopupした直後にメニューを閉じる事ができる} SetForegroundWindow(PopupMenu.WindowHandle); PopupMenu.Popup(0,0); PopupMenu.OnPopup := EventBuffer; end; end; //------------------------------------*) {--------------------------------------- 条件に従ってSubItemの個数をカウントする関数 機能: 備考: 履歴: 2012/10/20(土) ・ 作成 }//(*----------------------------------- function MenuItem_GetSubItemCountFunc(MenuItem: TMenuItem; Func: TMenuItem_GetSubItemCountCompareFunction): Integer; var I: Integer; begin Result := 0; for I := 0 to MenuItem.Count - 1 do begin if Func(MenuItem.Items[I]) then Inc(Result); end; end; function FuncMenuItemEnabled(MenuItem: TMenuItem): Boolean; begin Result := MenuItem.Enabled; end; //SubMenuItemが Enabled := True の個数を求める関数 function MenuItem_GetSubItemEnableCount(MenuItem: TMenuItem): Integer; begin Result := MenuItem_GetSubItemCountFunc(MenuItem, FuncMenuItemEnabled ); end; function FuncMenuItemVisible(MenuItem: TMenuItem): Boolean; begin Result := MenuItem.Visible; end; //SubMenuItemが Visible := True の個数を求める関数 function MenuItem_GetSubItemVisibleCount(MenuItem: TMenuItem): Integer; begin Result := MenuItem_GetSubItemCountFunc(MenuItem, FuncMenuItemVisible ); end; //------------------------------------*) end.