Program MenuAdd; { provided as is, no guarantees, no support Question 1: My_ByPosition locates items by position from the top of the menu, mf_ByCommand finds an idem uses the items id. Question 2: These commands start a new column, the one separated by a bar the other not separated by a bar. If you are not in a PopUpMenu then it places the item on a new line. } Uses WinProcs, WinTypes, OWindows; Const cmEnable = 101; cmColor = 102; cmBlackWhite = 103; cmAddCommand = 104; Type PMyWindow = ^TMyWindow; TMyWindow = Object(TWindow) mh: HMenu; constructor Init(AParent: PWindowsObject; AName: PChar); procedure Enable(var Msg: TMessage); virtual cm_First + cmEnable; procedure Color(var Msg: TMessage); virtual cm_First + cmColor; procedure BlackWhite(var Msg: TMessage); virtual cm_First + cmBlackWhite; procedure AddCommand(var Msg: TMessage); virtual cm_First + cmAddCommand; procedure SetUpWindow; virtual; procedure WMLButtonDown(var Msg: TMessage); virtual wm_First + wm_LButtonDown; end; TMyApp = Object(TApplication) procedure InitMainWindow; virtual; end; constructor TMyWindow.Init(AParent: PWindowsObject; AName: PChar); begin TWindow.Init(AParent, AName); Attr.Menu := CreateMenu; end; procedure TMyWindow.SetUpWindow; begin TWindow.SetUpWindow; mh := CreatePopUpMenu; AppendMenu(Attr.Menu, mf_PopUp, Mh, '&Commands'); AppendMenu(Mh, mf_String, cmEnable, '&Enable Options'); AppendMenu(Mh, mf_Separator, 0, Nil); AppendMenu(Mh, mf_String, cmColor, '&Color'); AppendMenu(Mh, mf_String, cmBlackWhite, '&Black/White'); AppendMenu(Mh, mf_Separator, 0, Nil); AppendMenu(Mh, mf_String, cmAddCommand, 'Add Command'); EnableMenuItem(Mh, 2, mf_ByPosition or mf_Grayed); EnableMenuItem(Mh, 3, mf_ByPosition or mf_Grayed); EnableMenuItem(Mh, 5, mf_ByPosition or mf_Grayed); DrawMenuBar(HWindow); end; procedure TMyWindow.WMLButtonDown(var Msg: TMessage); begin MessageBeep(0); HiLiteMenuItem(HWindow, Attr.Menu, 0, mf_ByPosition or mf_HiLite); SetFocus(Attr.Menu); end; procedure TMyWindow.Enable(var Msg: TMessage); begin EnableMenuItem(Mh, 2, mf_ByPosition or mf_Enabled); EnableMenuItem(Mh, 3, mf_ByPosition or mf_Enabled); EnableMenuItem(Mh, 5, mf_ByPosition or mf_Enabled); DeleteMenu(Mh, 0, mf_ByPosition); DeleteMenu(Mh, 0, mf_ByPosition); CheckMenuItem(Mh, cmColor, mf_ByCommand or mf_Checked); end; procedure TMyWindow.Color(var Msg: TMessage); var State: Word; begin State := GetMenuState(Mh, cmColor, mf_ByCommand); if (State and mf_Checked) = mf_Checked then CheckMenuItem(Mh, cmColor, mf_ByCommand or mf_UnChecked) else CheckMenuItem(Mh, cmColor, mf_ByCommand or mf_Checked); State := GetMenuState(Mh, cmBlackWhite, mf_ByCommand); if (State and mf_Checked) = mf_Checked then CheckMenuItem(Mh, cmBlackWhite, mf_ByCommand or mf_UnChecked) end; procedure TMyWindow.BlackWhite(var Msg: TMessage); var State: Word; begin State := GetMenuState(Mh, cmBlackWhite, mf_ByCommand); if (State and mf_Checked) = mf_Checked then CheckMenuItem(Mh, cmBlackWhite, mf_ByCommand or mf_UnChecked) else CheckMenuItem(Mh, cmBlackWhite, mf_ByCommand or mf_Checked); State := GetMenuState(Mh, cmColor, mf_ByCommand); if (State and mf_Checked) = mf_Checked then CheckMenuItem(Mh, cmColor, mf_ByCommand or mf_UnChecked) end; procedure TMyWindow.AddCommand(var Msg: TMessage); begin InsertMenu(Mh, cmColor, mf_String, cmEnable, '&Enable Options'); InsertMenu(Mh, cmColor, mf_Separator, 0, Nil); EnableMenuItem(Mh, 2, mf_ByPosition or mf_Grayed); EnableMenuItem(Mh, 3, mf_ByPosition or mf_Grayed); EnableMenuItem(Mh, 5, mf_ByPosition or mf_Grayed); CheckMenuItem(Mh, cmColor, mf_ByCommand or mf_UnChecked); CheckMenuItem(Mh, cmBlackWhite, mf_ByCommand or mf_UnChecked); end; procedure TMyApp.InitMainWindow; begin MainWindow := New(PMyWindow, Init(nil, 'MenuAdd')); end; var A: TMyApp; begin A.Init('Ph2SecA'); A.Run; A.Done; end.