home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mnod.zip / mnodsamp.cpp < prev   
Text File  |  1994-03-14  |  4KB  |  175 lines

  1. // ICLUI sample
  2. // Create a Menubar dynamically (ie. not from .rc file)
  3. // Manipulate the system menu using ISystemMenu
  4. // Create a Menu drawItem
  5.  
  6. #define INCL_WIN
  7. #define INCL_GPIPRIMITIVES   // for owner draw menuitem
  8. extern "C" {
  9.    #include <os2.h>
  10.    #include <stdio.h>
  11. }
  12.  
  13. #include <iapp.hpp>
  14. #include <imenubar.hpp>
  15. #include <isysmenu.hpp>
  16. #include <icmdhdr.hpp>
  17. #include <iframe.hpp>
  18. #include <istattxt.hpp>
  19. #include <istring.hpp>
  20.  
  21. #include <imnitem.hpp>
  22. #include <imndihdr.hpp>
  23.  
  24. #define ID_OWNERDRAW1 201
  25. #define ID_OWNERDRAW2 202
  26.  
  27. class TMenuDraw : public IMenuDrawItemHandler
  28. {
  29.   protected:
  30.  
  31.  Boolean
  32.   // NOTE: interface to setSize() was changed in the first CSD for 2.1 of CSet++.
  33.   //       The IMenuDrawItemEvent parm was added at that time.
  34.   setSize(IMenuDrawItemEvent& evt, ISize& newSize),
  35.   draw(IMenuDrawItemEvent& evt, DrawFlag& flag);
  36.   highlight(IMenuDrawItemEvent& evt);
  37.   unhighlight(IMenuDrawItemEvent& evt);
  38. };
  39.  
  40. //
  41. // Overrides for the  Menu Draw Handler
  42. //
  43.  
  44. Boolean TMenuDraw :: setSize(IMenuDrawItemEvent& evt, ISize& newSize)
  45. {
  46.   int height;
  47.   // Make the height of the draw items slightly different
  48.   if (evt.itemId() == ID_OWNERDRAW1) {
  49.      height = 24;
  50.   } else {
  51.      height = 32;
  52.   } /* endif */
  53.  
  54.   newSize.setWidth(162).setHeight(height);
  55.   return true;
  56. }
  57.  
  58. Boolean TMenuDraw :: highlight(IMenuDrawItemEvent& evt)
  59. {
  60.   // You can supply your own rotine to hightlight here.
  61.   // return true to prevent PM from doing the highlight
  62.   // Same applies to unhighlight() below
  63.   return false;
  64. }
  65.  
  66. Boolean TMenuDraw :: unhighlight(IMenuDrawItemEvent& evt)
  67. {
  68.   return false;
  69. }
  70.  
  71. Boolean TMenuDraw :: draw(IMenuDrawItemEvent& evt, DrawFlag& flag)
  72. {
  73.    IString testString;
  74.  
  75.    switch (evt.itemId()) {
  76.    case ID_OWNERDRAW1:
  77.       testString = "Owner Draw Item 1";
  78.       break;
  79.    case ID_OWNERDRAW2:
  80.       testString = "Owner Draw Item 2";
  81.       break;
  82.    default:
  83.       testString = "unexpected Draw Item";
  84.    } /* endswitch */
  85.  
  86.    POINTL drawPoint = evt.itemRect().bottomLeft().asPOINTL();
  87.    RECTL drawRect = evt.itemRect().asRECTL();
  88.    GpiCharStringPosAt(evt.itemPresSpaceHandle(), &drawPoint, &drawRect,
  89.                     CHS_CLIP,
  90.                     testString.length(), (char *)testString,
  91.                     0);
  92.    return true;
  93.  
  94. }
  95.  
  96. //
  97. // End of Owner Draw Handler
  98. //
  99.  
  100.  
  101. class TMenuWindow : public IFrameWindow,
  102.                     public ICommandHandler
  103. {
  104. public:
  105.  
  106.    TMenuWindow();
  107.    Boolean command( ICommandEvent& cmdEvent );
  108.  
  109. private:
  110.    IMenuBar    menu;
  111.    ISystemMenu sysMenu;
  112.    IStaticText status;
  113.    TMenuDraw   menuDraw;
  114. };
  115.  
  116.  
  117. void  main()
  118. {
  119.    TMenuWindow window;
  120.    IApplication::current().run();
  121. }
  122.  
  123. TMenuWindow::TMenuWindow()
  124.  : IFrameWindow("Menu Test"),
  125.    status( 100, this, this),
  126.    menu(this,IMenuBar::empty),     // empty style needed
  127.    sysMenu(this),
  128.    menuDraw()
  129. {  
  130.    ICommandHandler::handleEventsFor(this);
  131.    menuDraw.handleEventsFor(&menu);
  132.  
  133.    setClient(&status);
  134.  
  135.    // populate the empty menu bar
  136.    menu.addText(20, "Item1");
  137.    // NOTE: under version 2.0 then following function name was
  138.    //   addSubMenu - ie. the "M" is uppercase
  139.    menu.addSubmenu(20);
  140.      menu.addText(21, "Item1.1", 20);
  141.      menu.addText(22, "Item1.2", 20);
  142.      menu.addSubmenu(22);
  143.        menu.addText(23,"Item1.2.2", 22);
  144.  
  145.    menu.addText(30, "Owner draw items");
  146.      menu.addSubmenu(30);
  147.      IMenuItem::setDefaultStyle(IMenuItem::drawItem);
  148.      IMenuItem od1(ID_OWNERDRAW1);
  149.      IMenuItem od2(ID_OWNERDRAW2);
  150.      menu.addItem(od1, 30);
  151.      menu.addItem(od2, 30);
  152.  
  153.    // Add a submenu to the system menu
  154.    sysMenu.addText(20, "Item1", ISystemMenu::idPulldown);
  155.    sysMenu.addSubmenu(20);
  156.      sysMenu.addText(21, "Item1.1", 20);
  157.      sysMenu.addText(22, "Item1.2", 20);
  158.  
  159.    show();
  160.    setFocus();
  161. }
  162.  
  163. Boolean TMenuWindow::command( ICommandEvent& cmdEvent )
  164. {
  165.   unsigned long id = cmdEvent.commandId();
  166.  
  167.   if(id == ID_OWNERDRAW1 || id == ID_OWNERDRAW2)
  168.      status.setText("A draw item was selected");
  169.   else
  170.      // This won't get the "text" of the drawItems
  171.      status.setText(menu.menuItem(id).text());
  172.  
  173.   return true;
  174. }
  175.