[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]

    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.

[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]