Annotation of q_a/samples/menus/menuspm.txt, revision 1.1

1.1     ! root        1: /* This is a document showing Menus.c commented with PM information.   */
        !             2: /* Menus.c is a combination of many of the menu functionality          */
        !             3: /* available under PM.  It shows cascaded menus, how to disable a      */
        !             4: /* menu item through its attributes, how to check menu items through   */
        !             5: /* their attributes, how to display bitmaps in menus, how to create    */
        !             6: /* popup menus, how to change menus on the fly, and how to create new  */
        !             7: /* menu items on the fly.                                              */
        !             8: 
        !             9: #define INCL_WINMESSAGEMGR
        !            10: #define INCL_WIN
        !            11: #define INCL_GPI
        !            12: #define INCL_WINDIALOGS
        !            13: #include <os2.h>
        !            14: #include "menus.h"
        !            15: 
        !            16: #include "string.h"
        !            17: #include "stdio.h"
        !            18: #include "stdlib.h"
        !            19: 
        !            20: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM);
        !            21: 
        !            22: int main (void)
        !            23:    {
        !            24:    static CHAR  szClientClass [] = "menus";
        !            25:    static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU    |
        !            26:                                FCF_SIZEBORDER    | FCF_MINMAX     |
        !            27:                                FCF_SHELLPOSITION | FCF_TASKLIST   |
        !            28:                                FCF_MENU          | FCF_ACCELTABLE ;
        !            29:    HAB    hab;
        !            30:    HMQ    hmq;
        !            31:    HWND   hwndFrame, hwndClient;
        !            32:    QMSG   qmsg;
        !            33: 
        !            34:    hab = WinInitialize (0);
        !            35:    hmq = WinCreateMsgQueue (hab, 0);
        !            36: 
        !            37:    WinRegisterClass (
        !            38:                  hab,             // Anchor Block handle
        !            39:                  szClientClass,   // Name of class being registered
        !            40:                  ClientWndProc,   // Window procedure for class
        !            41:                  CS_SIZEREDRAW,   // Class style
        !            42:                  0);              // Extra bytes to reserve
        !            43: 
        !            44:    hwndFrame = WinCreateStdWindow (
        !            45:                  HWND_DESKTOP,    // Parent of Window handle
        !            46:                  WS_VISIBLE,      // Style of frame window
        !            47:                  &flFrameFlags,   // Pointer to control data
        !            48:                  szClientClass,   // Client window class name
        !            49:                  NULL,            // Title bar text
        !            50:                  0L,              // Style of Client Window
        !            51:                  0,               // Module of handle for resources
        !            52:                  ID_RESOURCE,     // ID of resources
        !            53:                  &hwndClient);    // Pointer to client window handle
        !            54: 
        !            55:    WinSendMsg (hwndFrame, WM_SETICON,
        !            56:                WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
        !            57:                NULL);
        !            58: 
        !            59:    WinSetWindowText (hwndFrame, "Menus Code for PM Apps");
        !            60: 
        !            61: 
        !            62:    while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
        !            63:       WinDispatchMsg (hab, &qmsg);
        !            64: 
        !            65:    WinDestroyWindow (hwndFrame);
        !            66:    WinDestroyMsgQueue (hmq);
        !            67:    WinTerminate (hab);
        !            68:    return 0;
        !            69:    }
        !            70: 
        !            71: /********************** ClientWndProc **************************/
        !            72: 
        !            73: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg,
        !            74:                                 MPARAM mp1, MPARAM mp2)
        !            75:    {
        !            76:    /* Used in switching menus. */
        !            77:    static HWND hwndFrame;            // Handle to the window frame.
        !            78:    static HWND hwndMenu;             // Handle to the original menu.
        !            79:    static HWND hwndMenuAlt;          // Handle to the switched to menu.
        !            80: 
        !            81:    /* Used in the popup menu. */
        !            82:    static HWND hwndMenuPopup;        // Handle to the popup menu.
        !            83:    HPS         hps;                  // These 3 variables are used in
        !            84:    RECTL       rcl;                  // in locating the popup menu.
        !            85:    POINTL      ptlMouse ;
        !            86: 
        !            87:    /* Used in enable/disable and checking menu items. */
        !            88:    SHORT       sState;               // Used to toggle 'checked' and
        !            89:                                      // 'enabled' menu item state.
        !            90: 
        !            91:    /* Used in adding menu items on the fly. */
        !            92:    HWND          hSubMenu;           // Handle to added menu item.
        !            93:    MENUITEM      mi;                 // Structure to define new menu item.
        !            94:    static USHORT ActionBarID = 1000; // Used to identify new menu item.
        !            95:    static USHORT SubMenuID = 6000;   // Used to identify new sub menu item.
        !            96:    CHAR          buffer[10];         // Holds text string for menu item.
        !            97:    MENUCREATETEMPLATE mt;            // See type definition in menus.h
        !            98: 
        !            99: 
        !           100:    switch (msg)
        !           101:      {
        !           102:       case WM_CREATE:
        !           103:          /* During the create, the 3 menus are loaded: the original     */
        !           104:          /* "Cascade Sample  Microsoft  *Button2 Up Shows Popup Menus"; */
        !           105:          /* the popup menu; and the second menu used to switch to       */
        !           106:          /* "MenuItems".                                                */
        !           107: 
        !           108: 
        !           109:          /* Loading the popup menu. */
        !           110:          hwndMenuPopup = WinLoadMenu (hwnd, 0, ID_POPUP) ;
        !           111:          WinSetWindowPos (hwndMenuPopup, NULL,
        !           112:                             0, 0, 0, 0, SWP_SIZE) ;
        !           113:          WinSetParent (hwndMenuPopup, HWND_DESKTOP, FALSE) ;
        !           114: 
        !           115:          /* Setting the original menu's owner to HWND_OBJECT to make it  */
        !           116:          /* make it disappear.  Then loading the second menu, and then   */
        !           117:          /* setting it's parent to be HWND_OBJECT to make it disappear.  */
        !           118:          /* And finally setting the original menu's parent to be the     */
        !           119:          /* window frame again to make it visible.                       */
        !           120: 
        !           121:          hwndFrame = WinQueryWindow(hwnd, QW_PARENT,FALSE);
        !           122:          hwndMenu = WinWindowFromID (hwndFrame, FID_MENU);
        !           123:          WinSetParent(hwndMenu, HWND_OBJECT, TRUE);
        !           124:          hwndMenuAlt = WinLoadMenu( hwndFrame, 0, ID_ALTERNATE);
        !           125:          WinSetParent(hwndMenuAlt, HWND_OBJECT, TRUE);
        !           126:          WinSetParent(hwndMenu, hwndFrame, TRUE);
        !           127:          return 0;
        !           128: 
        !           129:       case WM_COMMAND:
        !           130:         switch (COMMANDMSG(&msg)->cmd)
        !           131:           {
        !           132:           case IDM_ALT_ADD:
        !           133:             /* From the second menu, when the user chooses to add a new  */
        !           134:             /* menu item, this is done on the fly.  In general you create*/
        !           135:             /* a menu, and then insert it.  The menu is created with     */
        !           136:             /* WinCreateMenu using control data in the form of the       */
        !           137:             /* Resource Type Menu (RT_MENU), or menu creation template.  */
        !           138:             /* The menu is inserted with a MM_INSERTITEM and a MENUITEM  */
        !           139:             /* sturcture.                                                */
        !           140: 
        !           141:             /* Filling out the menu template, using many defaults. */
        !           142:             mt.size = 0;
        !           143:             mt.version = 0;
        !           144:             mt.codepage = 0;
        !           145:             mt.mnemonic = 0;
        !           146:             mt.itemcount = 1;
        !           147:             mt.item[0].afStyle  = MIS_TEXT;
        !           148:             mt.item[0].afAttribute = 0;
        !           149:             mt.item[0].id = SubMenuID;
        !           150:             strcpy(mt.item[0].text,
        !           151:             itoa(SubMenuID++,buffer,10));
        !           152: 
        !           153:             /* Create a popup menu using template information. */
        !           154:             hSubMenu = WinCreateMenu( hwndMenuAlt, &mt);
        !           155: 
        !           156:             /* Filling out the MENUITEM structure. */
        !           157:             mi.iPosition = MIT_END;
        !           158:             mi.afStyle = MIS_TEXT | MIS_SUBMENU;
        !           159:             mi.afAttribute = 0;
        !           160:             mi.id = ActionBarID;
        !           161:             mi.hwndSubMenu = hSubMenu;
        !           162:             mi.hItem = 0;
        !           163: 
        !           164:             /* Inserting the new item. */
        !           165:             WinSendMsg(hwndMenuAlt,MM_INSERTITEM,(MPARAM)&mi,
        !           166:                 (MPARAM)(PCH)itoa(ActionBarID++,buffer,10));
        !           167:             break;
        !           168: 
        !           169: 
        !           170:           case IDM_SWITCH:
        !           171:              /* From the original menu, when the user chooses to switch  */
        !           172:              /* to the second menu: Set the first menu's parent to be    */
        !           173:              /* HWND_OBJECT to make it disappear, set the second menu's  */
        !           174:              /* parent to be the window frame, and then post an update   */
        !           175:              /* message telling the frame to redraw.                     */
        !           176: 
        !           177:              WinSetParent(hwndMenu, HWND_OBJECT, TRUE);
        !           178:              WinSetParent(hwndMenuAlt, hwndFrame, TRUE);
        !           179:              WinPostMsg (hwndFrame, WM_UPDATEFRAME,
        !           180:                          MPFROMSHORT(FCF_MENU), 0L);
        !           181:              break;
        !           182: 
        !           183:           case IDM_ALT_SWITCH:
        !           184:              /* From the second menu, when the user chooses to switch    */
        !           185:              /* back; follow the same procedure as demonstrated for      */
        !           186:              /* case IDM_SWITCH:                                         */
        !           187: 
        !           188:              WinSetParent(hwndMenuAlt, HWND_OBJECT, TRUE);
        !           189:              WinSetParent(hwndMenu, hwndFrame, TRUE);
        !           190:              WinPostMsg (hwndFrame, WM_UPDATEFRAME,
        !           191:                          MPFROMSHORT(FCF_MENU), 0L);
        !           192:              break;
        !           193: 
        !           194:           case IDM_DISABLE:
        !           195:              /* From the original menu, when the user chooses to disable  */
        !           196:              /* the cascading menu items, the "Disable Cascade" sub-menu  */
        !           197:              /* item is checked, and the "Cascade" sub-menu item and its  */
        !           198:              /* cascaded items are grayed out and disabled.  The user can */
        !           199:              /* reactivate it by selecting "Disable Cascade" again.  To   */
        !           200:              /* toggle a menu items MIA_* attribute state, query its state*/
        !           201:              /* using MM_QUERYITEMATTR.  Toggle the value using the found */
        !           202:              /* state and XORing it with the chosen MIA_* value, and then */
        !           203:              /* reset the attribute value with MM_SETITEMATTR.            */
        !           204: 
        !           205:              /* Toggling the check on "Disable Cascade". */
        !           206:              (MRESULT)sState = WinSendMsg( hwndMenu,
        !           207:                                   MM_QUERYITEMATTR,
        !           208:                                   MPFROM2SHORT(IDM_DISABLE, TRUE),
        !           209:                                   MPFROMSHORT(MIA_CHECKED));
        !           210: 
        !           211:              sState ^= MIA_CHECKED;
        !           212: 
        !           213:              WinSendMsg(hwndMenu,
        !           214:                         MM_SETITEMATTR,
        !           215:                         MPFROM2SHORT(IDM_DISABLE, TRUE),
        !           216:                         MPFROM2SHORT(MIA_CHECKED, sState));
        !           217: 
        !           218: 
        !           219:              /* Toggling the enable for "Cascade". */
        !           220:              (MRESULT)sState = WinSendMsg( hwndMenu,
        !           221:                                   MM_QUERYITEMATTR,
        !           222:                                   MPFROM2SHORT(IDM_SUB3, TRUE),
        !           223:                                   MPFROMSHORT(MIA_DISABLED));
        !           224: 
        !           225:              sState ^= MIA_DISABLED;
        !           226: 
        !           227:              WinSendMsg(hwndMenu,
        !           228:                         MM_SETITEMATTR,
        !           229:                         MPFROM2SHORT(IDM_SUB3, TRUE),
        !           230:                         MPFROM2SHORT(MIA_DISABLED, sState));
        !           231:              break;
        !           232: 
        !           233: 
        !           234:           default:
        !           235:              /* A catch all default which explains that the action menu  */
        !           236:              /* items have no functionality.                             */
        !           237: 
        !           238:              WinAlarm(HWND_DESKTOP, WA_NOTE);
        !           239:              WinMessageBox (HWND_DESKTOP, hwnd,
        !           240:                        "This item has no functionality.",
        !           241:                        "PM Menus Code",
        !           242:                        0, MB_OK | MB_ICONASTERISK );
        !           243:              break;
        !           244:         }
        !           245: 
        !           246:      case WM_PAINT:
        !           247:         /* A simple client space paint. */
        !           248: 
        !           249:         hps = WinBeginPaint (hwnd, NULL, NULL);
        !           250:         GpiErase (hps);
        !           251:         WinQueryWindowRect (hwnd, &rcl);
        !           252:         WinEndPaint (hps);
        !           253:           return 0;
        !           254: 
        !           255: 
        !           256:      case WM_BUTTON2UP:
        !           257:         /* When the user activates the popup menu with the Button2Up,    */
        !           258:         /* First query the position of the mouse, display the popup menu */
        !           259:         /* using the WinSetWindowPos, and then capture the mouse to this */
        !           260:         /* window.                                                       */
        !           261: 
        !           262:         WinQueryPointerPos (HWND_DESKTOP, &ptlMouse) ;
        !           263: 
        !           264:         ptlMouse.y += WinQuerySysValue (HWND_DESKTOP, SV_CYMENU) ;
        !           265: 
        !           266:         WinSetWindowPos  (hwndMenuPopup, HWND_TOP,
        !           267:                           (SHORT) ptlMouse.x, (SHORT) ptlMouse.y,
        !           268:                           0, 0, SWP_MOVE | SWP_SHOW) ;
        !           269: 
        !           270:         WinSendMsg        (hwndMenuPopup, MM_SELECTITEM,
        !           271:                            MPFROM2SHORT (IDM_POPUP, FALSE),
        !           272:                            MPFROMSHORT (FALSE)) ;
        !           273: 
        !           274:         WinSetCapture (HWND_DESKTOP, hwndMenuPopup) ;
        !           275:         return 0 ;
        !           276: 
        !           277: 
        !           278: 
        !           279: 
        !           280:      case WM_HELP:
        !           281:         WinMessageBox (HWND_DESKTOP, hwnd, "Help Message Box",
        !           282:                        "PM Menus Code", 0,
        !           283:                        MB_OK | MB_ICONASTERISK);
        !           284:         break;
        !           285: 
        !           286:      case WM_DESTROY:
        !           287:         return 0;
        !           288:      }
        !           289:    return WinDefWindowProc (hwnd, msg, mp1, mp2);
        !           290:    }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.