home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk11 / tk4 / mdi / app.c next >
Encoding:
C/C++ Source or Header  |  1989-02-20  |  7.3 KB  |  275 lines

  1. /***************************************************************************\
  2. * app.c - MDI Sample application
  3. *
  4. * Created by Microsoft Corporation, 1989
  5. *
  6. \***************************************************************************/
  7.  
  8. #define INCL_WINSYS
  9. #define INCL_WINCOMMON
  10. #define INCL_WINMESSAGEMGR
  11. #define INCL_WINPOINTERS
  12. #define INCL_WININPUT
  13. #define INCL_WINMENUS
  14. #define INCL_WINFRAMEMGR
  15. #define INCL_WINWINDOWMGR
  16. #define INCL_WINRECTANGLES
  17. #define INCL_WINHEAP
  18. #define INCL_WINSCROLLBARS
  19. #define INCL_GPIPRIMITIVES
  20.  
  21. #include <os2.h>
  22. #include "app.h"
  23. #include "appdata.h"
  24. #include "mdi.h"
  25. #include "mdidata.h"
  26.  
  27. /*
  28.     Function prototypes
  29. */
  30. BOOL AppInit(VOID);
  31. BOOL MDIInit(VOID);
  32. VOID AppTerminate(VOID);
  33. VOID MDITerminate(VOID);
  34. BOOL AppNewDocument(USHORT, PSZ);
  35. VOID TrackSplitbars(HWND, USHORT, SHORT, SHORT);
  36. VOID MDIDesktopSize(HWND, MPARAM, MPARAM);
  37. VOID MDIDesktopSetFocus(HWND, MPARAM); 
  38. VOID MDIDesktopActivateDoc(SHORT idMenuitem);
  39. BOOL AppNewDocument(USHORT, PSZ);
  40. NPDOC MDINewDocument(USHORT fsStyle, PSZ pszClassName);
  41. VOID MDISetInitialDocPos(HWND hwndNewFrame);
  42.  
  43. int cdecl main(void)
  44. {
  45.     QMSG qmsg;
  46.     /*
  47.      * Initialize the application globals
  48.      * and create the main window.
  49.      */
  50.     if (AppInit() == FALSE) {
  51.         WinAlarm(HWND_DESKTOP, WA_ERROR);
  52.         return(0);
  53.     }
  54.  
  55.     /*
  56.      * Initialize the MDI globals etc..
  57.      */
  58.     if (MDIInit() == FALSE) {
  59.         WinAlarm(HWND_DESKTOP, WA_ERROR);
  60.         WinAlarm(HWND_DESKTOP, WA_ERROR);
  61.         return(0);
  62.     }
  63.  
  64.     /*
  65.      * Create an initial, untitled document.
  66.      */
  67.     AppNewDocument(DS_HORZSPLITBAR | DS_VERTSPLITBAR, szDocClass);
  68.  
  69.     while (WinGetMsg(NULL, (PQMSG)&qmsg, NULL, 0, 0)) {
  70.         WinDispatchMsg(NULL, (PQMSG)&qmsg);
  71.     }
  72.  
  73.     /*
  74.      * Do the clean-up of the MDI code.
  75.      */
  76.     MDITerminate();
  77.  
  78.     /*
  79.      * Do the clean-up of the Application.
  80.      */
  81.     AppTerminate();
  82.  
  83.     DosExit(EXIT_PROCESS, 0);
  84. }
  85.  
  86.  
  87. MRESULT CALLBACK MDIWndProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  88. {
  89.     HPS hps;
  90.     RECTL rclPaint, rclWindow;
  91.     POINTL ptlPatternRef;
  92.  
  93.     switch (msg) {
  94.  
  95.     case WM_PAINT:
  96.         hps = WinBeginPaint(hwnd, (HPS)NULL, &rclPaint);
  97.  
  98.         /*
  99.          * Set the pattern to be at the top-left
  100.          * since we're top-left aligning the bits.
  101.          */
  102.         WinQueryWindowRect(hwnd, (PRECTL)&rclWindow);
  103.         ptlPatternRef.x = rclWindow.xLeft;
  104.         ptlPatternRef.y = rclWindow.yTop;
  105.         GpiSetPatternRefPoint(hps, &ptlPatternRef);
  106.  
  107.         WinFillRect(hps, &rclPaint, SYSCLR_APPWORKSPACE);
  108.  
  109.         WinEndPaint(hps);
  110.         break;
  111.  
  112.     case WM_SIZE:
  113.         MDIDesktopSize(hwnd, mp1, mp2);
  114.         break;
  115.  
  116.     case WM_SETFOCUS:
  117.         MDIDesktopSetFocus(hwnd, mp2);
  118.         break;
  119.  
  120.     case WM_COMMAND:
  121.         switch (SHORT1FROMMP(mp1)) {
  122.  
  123.         /*
  124.          * Pass these accelerators onto the active document's
  125.          * frame so it can process it.
  126.          *
  127.          * These are the CMD_ values from the document system
  128.          * menu.
  129.          */
  130.         case CMD_DOCRESTORE:
  131.             WinSendMsg(hwndActiveDoc, WM_SYSCOMMAND, (MPARAM)SC_RESTORE, mp2);
  132.             break;
  133.  
  134.         case CMD_DOCNEXT:
  135.             WinSendMsg(hwndActiveDoc, WM_SYSCOMMAND, (MPARAM)SC_NEXT, mp2);
  136.             break;
  137.  
  138.         case CMD_DOCMINIMIZE:
  139.             WinSendMsg(hwndActiveDoc, WM_SYSCOMMAND, (MPARAM)SC_MINIMIZE, mp2);
  140.             break;
  141.  
  142.         case CMD_DOCCLOSE:
  143.             WinSendMsg(hwndActiveDoc, WM_SYSCOMMAND, (MPARAM)SC_CLOSE, mp2);
  144.             break;
  145.  
  146.         case CMD_DOCSPLIT:
  147.             /*
  148.              * Call TrackSplitbars() with -1 for xMouse to tell
  149.              * it to reposition the pointer to where the
  150.              * splitbars currently are.
  151.              */
  152.             WinSetPointer(HWND_DESKTOP, hptrHVSplit);
  153.             TrackSplitbars(WinWindowFromID(hwndActiveDoc, FID_CLIENT),
  154.                     SPS_VERT | SPS_HORZ, -1, -1);
  155.             WinSetPointer(HWND_DESKTOP, hptrArrow);
  156.             break;
  157.  
  158.         case CMD_NEW:
  159.             if (AppNewDocument(DS_HORZSPLITBAR | DS_VERTSPLITBAR, szDocClass) == FALSE)
  160.                 WinAlarm(HWND_DESKTOP, WA_ERROR);
  161.             break;
  162.  
  163.         case CMD_CLOSE:
  164.             /*
  165.              * Close the active document.
  166.              */
  167.             if (hwndActiveDoc)
  168.                 WinSendMsg(hwndActiveDoc, WM_CLOSE, 0L, 0L);
  169.             break;
  170.  
  171.     case CMD_ABOUT:
  172.         /*
  173.          * Put up the About... dialog box
  174.          */
  175.         WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, NULL, IDD_ABOUT, NULL);
  176.         break;
  177.     
  178.         case CMD_EXIT:
  179.             WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
  180.             break;
  181.  
  182.         case CMD_ARRANGETILED:
  183.             ArrangeWindows(AWP_TILED);
  184.             break;
  185.  
  186.         case CMD_ARRANGECASCADED:
  187.             ArrangeWindows(AWP_CASCADED);
  188.             break;
  189.  
  190.         default:
  191.             /*
  192.              * The means a window title was selected from
  193.              * the window menu.  Have the MDI code activate
  194.              * the correct window based on the menuitem ID.
  195.              *
  196.              * WARNING: Be sure to keep you applications
  197.              * menuitem IDs < CMD_WINDOWITEMS.
  198.              */
  199.             if (SHORT1FROMMP(mp1) >= CMD_WINDOWITEMS)
  200.                 MDIDesktopActivateDoc(SHORT1FROMMP(mp1));
  201.             break;
  202.         }
  203.         break;
  204.  
  205.     default:
  206.         return(WinDefWindowProc(hwnd, msg, mp1, mp2));
  207.         break;
  208.     }
  209.  
  210.     return (0L);
  211. }
  212.  
  213.  
  214. BOOL AppNewDocument(USHORT fsStyle, PSZ pszClassName)
  215. {
  216.     register NPDOC npdocNew;
  217.     HWND hwndFrame, hwndClient;
  218.     HWND hwndHScroll, hwndVScroll;
  219.  
  220.     npdocNew = MDINewDocument(fsStyle, pszClassName);
  221.  
  222.     npdocNew->clrBackground = clrNext++;
  223.     if (clrNext > CLR_PALEGRAY)
  224.         clrNext = CLR_BACKGROUND;
  225.  
  226.     hwndFrame = npdocNew->hwndFrame;
  227.     hwndClient = WinWindowFromID(hwndFrame, FID_CLIENT);
  228.  
  229.     /*
  230.      * Setup the scrollbars.
  231.      */
  232.     hwndHScroll = WinWindowFromID(hwndFrame, FID_HORZSCROLL);
  233.     WinSendMsg(hwndHScroll, SBM_SETSCROLLBAR, MPFROMSHORT(0),
  234.             MPFROM2SHORT(0, 600));
  235.     hwndHScroll = WinWindowFromID(hwndFrame, ID_HORZSCROLL2);
  236.     WinSendMsg(hwndHScroll, SBM_SETSCROLLBAR, MPFROMSHORT(0),
  237.             MPFROM2SHORT(0, 600));
  238.  
  239.     hwndVScroll = WinWindowFromID(hwndFrame, FID_VERTSCROLL);
  240.     WinSendMsg(hwndVScroll, SBM_SETSCROLLBAR, MPFROMSHORT(0),
  241.             MPFROM2SHORT(0, 600));
  242.     hwndVScroll = WinWindowFromID(hwndFrame, ID_VERTSCROLL2);
  243.     WinSendMsg(hwndVScroll, SBM_SETSCROLLBAR, MPFROMSHORT(0),
  244.             MPFROM2SHORT(0, 600));
  245.  
  246.     /*
  247.      * Set the focus the client so the new window will be
  248.      * active when we show it.
  249.      */
  250.     WinSetFocus(HWND_DESKTOP, hwndClient);
  251.  
  252.     /*
  253.      * Set the initial position of the frame window and make it visible.
  254.      */
  255.     MDISetInitialDocPos(hwndFrame);
  256.  
  257.     return (TRUE);
  258. }
  259.  
  260. MRESULT CALLBACK AboutDlgProc(HWND hDlg, USHORT msg, MPARAM mp1, MPARAM mp2)
  261. /*
  262.     About... dialog procedure
  263. */
  264. {
  265.     switch(msg) {
  266.     case WM_COMMAND:
  267.         switch(COMMANDMSG(&msg)->cmd) {
  268.         case DID_OK: WinDismissDlg(hDlg, TRUE); break;
  269.         default: break;
  270.         }
  271.     default: return WinDefDlgProc(hDlg, msg, mp1, mp2);
  272.     }
  273.     return FALSE;
  274. }
  275.