home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk12 / cascade / cascade.c next >
Encoding:
C/C++ Source or Header  |  1990-07-05  |  3.6 KB  |  153 lines

  1. #define INCL_PM
  2. #include <OS2.H>
  3. #include "Cascade.H"
  4.  
  5. char szAppName[] = "Cascade";
  6. char szAppTitle[] = "Cascading Menu Example";
  7.  
  8. HAB    hAB;
  9. HMQ    hmqMsgQueue;
  10. HWND    hWndMain,
  11.     hWndFrame;
  12.  
  13. int cdecl main()
  14. {
  15.     QMSG    qmsg;
  16.     ULONG   ctlData = FCF_STANDARD & ~FCF_ACCELTABLE;
  17.  
  18.     hAB = WinInitialize (0);
  19.  
  20.     hmqMsgQueue = WinCreateMsgQueue (hAB, 0);
  21.  
  22.     if (!WinRegisterClass (hAB,
  23.                szAppName,
  24.                WndProc,
  25.                CS_SYNCPAINT | CS_SIZEREDRAW,
  26.                0)) {
  27.     return(0);
  28.     }
  29.  
  30.     hWndFrame = WinCreateStdWindow ( HWND_DESKTOP,
  31.                     WS_VISIBLE,
  32.                     &ctlData,
  33.                     szAppName,
  34.                     NULL,
  35.                     0L,
  36.                     0,
  37.                     ID_RESOURCE,
  38.                     &hWndMain);
  39.     WinSetWindowText (hWndFrame, szAppTitle);
  40.     WinShowWindow (hWndFrame, TRUE);
  41.  
  42.     while ( WinGetMsg (hAB, &qmsg, NULL, 0, 0)) {
  43.     WinDispatchMsg (hAB, &qmsg);
  44.     }
  45.  
  46.     WinDestroyWindow   (hWndFrame);
  47.     WinDestroyMsgQueue (hmqMsgQueue);
  48.     WinTerminate       (hAB);
  49. }
  50.  
  51. /*-------------------------------------------------------------------*/
  52. /*                                     */
  53. /*-------------------------------------------------------------------*/
  54.  
  55. BOOL CheckAll (HWND hMenu, int item, BOOL check);
  56. BOOL CheckAll (HWND hMenu, int item, BOOL check)
  57. {
  58.     int mPos,max,test;
  59.     MENUITEM mi;
  60.     char szText[20];
  61.     MPARAM  mp1, mp2;
  62.  
  63.     max =(int) SHORT1FROMMR( WinSendMsg (hMenu, MM_QUERYITEMCOUNT, 0L, 0L) ); 
  64.  
  65.     for (mPos=0; mPos!=(int) max; mPos++) {
  66.     test =(int) SHORT1FROMMR( WinSendMsg (hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(mPos), 0L) );
  67.     WinSendMsg (hMenu, MM_QUERYITEMTEXT, MPFROM2SHORT(test,sizeof(szText)), MPFROMP(szText));
  68.     if (test == item) {
  69.         mp1 = MPFROM2SHORT (test, TRUE);
  70.         if (check)
  71.         mp2 = MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED);
  72.         else
  73.         mp2 = MPFROM2SHORT(MIA_CHECKED, 0);
  74.         WinPostMsg (hMenu, MM_SETITEMATTR, mp1, mp2);
  75.         return TRUE;
  76.     } else {
  77.         WinSendMsg (hMenu, MM_QUERYITEM, MPFROM2SHORT(test,FALSE), (MPARAM)&mi);
  78.         if (mi.hwndSubMenu) {
  79.         if (CheckAll(mi.hwndSubMenu, item, check)) {
  80.             mp1 = MPFROM2SHORT (test, TRUE);
  81.             if (check)
  82.             mp2 = MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED);
  83.             else
  84.             mp2 = MPFROM2SHORT(MIA_CHECKED, 0);
  85.             WinPostMsg (hMenu, MM_SETITEMATTR, mp1, mp2);
  86.             return TRUE;
  87.         }
  88.  
  89.         }
  90.     }
  91.     }
  92.     return FALSE;
  93. }
  94.  
  95. /*-------------------------------------------------------------------*/
  96. /*                                     */
  97. /*-------------------------------------------------------------------*/
  98.  
  99.  
  100. MRESULT EXPENTRY WndProc (hWnd, msg, mp1, mp2)
  101.     HWND    hWnd;
  102.     USHORT  msg;
  103.     MPARAM  mp1, mp2;
  104. {
  105.     HPS       hPS;
  106.     HWND   hMenu;
  107.     static int      prevFont = 0;
  108.     int thisItem;
  109.  
  110.     switch (msg) {
  111.  
  112.     case WM_COMMAND:
  113.         thisItem = SHORT1FROMMP(mp1);
  114.         switch (thisItem) {
  115.         case IDM_ABOUT:
  116.             WinMessageBox (HWND_DESKTOP, hWnd,
  117.             "Sample PM Application",
  118.             szAppTitle, 1, MB_OK | MB_APPLMODAL | MB_MOVEABLE);
  119.             break;
  120.         default:
  121.             if ((thisItem >= IDM_FIRSTFONT) && (thisItem<= IDM_LASTFONT)) {
  122.             hMenu    = WinWindowFromID (
  123.                     WinQueryWindow (hWnd, QW_PARENT, FALSE),
  124.                     FID_MENU);
  125.             CheckAll (hMenu, prevFont, FALSE);
  126.             CheckAll (hMenu, thisItem, TRUE);
  127.             prevFont = thisItem;
  128.             } else {
  129.             DosBeep(600,60);
  130.             }
  131.         }
  132.         break;
  133.  
  134.     case WM_CLOSE:
  135.         WinPostMsg (hWnd, WM_QUIT, 0L, 0L);
  136.         break;
  137.  
  138.     case WM_ERASEBACKGROUND:
  139.         return ((MRESULT) TRUE);
  140.         break;
  141.  
  142.     case WM_PAINT:
  143.         hPS = WinBeginPaint (hWnd, NULL, (PWRECT)NULL);
  144.         WinEndPaint (hPS);
  145.         break;
  146.  
  147.     default:
  148.         return (WinDefWindowProc (hWnd, msg, mp1, mp2));
  149.         break;
  150.     }
  151.     return 0L;
  152. }
  153.