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

  1. /***************************************************************************\
  2. * mdiinit.c - MDI initialization funtions.
  3. *
  4. * Created by Microsoft Corporation, 1989
  5. \***************************************************************************/
  6.  
  7. #define INCL_WINSYS
  8. #define INCL_WINCOMMON
  9. #define INCL_WINMESSAGEMGR
  10. #define INCL_WINPOINTERS
  11. #define INCL_WININPUT
  12. #define INCL_WINMENUS
  13. #define INCL_WINFRAMEMGR
  14. #define INCL_WINWINDOWMGR
  15. #define INCL_WINRECTANGLES
  16. #define INCL_WINHEAP
  17. #define INCL_GPIBITMAPS
  18. #define INCL_GPILCIDS
  19. #define INCL_DEV
  20.  
  21. #include <os2.h>
  22. #include "app.h"
  23. #include "appdata.h"
  24. #include "mdi.h"
  25. #include "mdidata.h"
  26.  
  27. /* Function prototypes */
  28. VOID InitMDIPointers(VOID);
  29. BOOL SetupMenuStuff(HPS hps);
  30. VOID InitSplitbars(VOID);
  31. VOID InitInitialDocPlacement(VOID);
  32.  
  33.  
  34. BOOL MDIInit(VOID)
  35. {
  36.     HPS hps;
  37.  
  38.     /*
  39.      * Register the splitbar window class.
  40.      */
  41.     if (!WinRegisterClass(NULL, szSplitbarClass, (PFNWP)SplitbarWndProc,
  42.             CS_MOVENOTIFY | CS_SYNCPAINT, 0))
  43.         return(FALSE);
  44.  
  45.     InitMDIPointers();
  46.  
  47.     pfnMainFrameWndProc = WinSubclassWindow(hwndMDIFrame,
  48.             (PFNWP)MainFrameWndProc);
  49.  
  50.     hps = WinGetPS(hwndMDI);
  51.  
  52.     if (SetupMenuStuff(hps) == FALSE)
  53.         return(FALSE);
  54.  
  55.     WinReleasePS(hps);
  56.  
  57.     InitSplitbars();
  58.  
  59.     InitInitialDocPlacement();
  60.  
  61.     return(TRUE);
  62. }
  63.  
  64.  
  65. VOID InitInitialDocPlacement(VOID)
  66. {
  67.     RECTL rclDesktop;
  68.  
  69.     /*
  70.      * New documents will be 2/3 the width of the
  71.      * screen and 1/2 the height of the screen.
  72.      */
  73.     cxNewDoc = (cxScreen * 2) / 3;
  74.     cyNewDoc = cyScreen / 2;
  75.  
  76.     WinQueryWindowRect(hwndMDI, &rclDesktop);
  77.     xNextNewDoc = 0;
  78.     yNextNewDoc = (SHORT)rclDesktop.yTop - cyNewDoc;
  79.  
  80.     xCascadeInc = cxSizeBorder + (cxMinmaxButton / 2);
  81.     yCascadeInc = cySizeBorder + cyTitlebar - cyBorder;
  82.  
  83.     xCascadeSlot = 0;
  84. }
  85.  
  86.  
  87. VOID InitSplitbars()
  88. {
  89.     /*
  90.      * Calculate the values cxVertSplitbar and cyHorzSplitbar.
  91.      *
  92.      * The horzontal splitbar is 1/3 the height of the vertical
  93.      * scrollbar arrow.  We use the aspect ratio of the display
  94.      * to determine the width of the vertical splitbar.
  95.      */
  96.     cyHorzSplitbar = cyVScrollArrow / 3;
  97.     cxVertSplitbar = (USHORT)(cyHorzSplitbar *
  98.             rglDevCaps[CAPS_HORIZONTAL_RESOLUTION] /
  99.             rglDevCaps[CAPS_VERTICAL_RESOLUTION]);
  100. }
  101.  
  102.  
  103. VOID InitMDIPointers(VOID)
  104. {
  105.     hptrHorzSplit = WinLoadPointer(HWND_DESKTOP, NULL, IDP_HSPLIT);
  106.     hptrVertSplit = WinLoadPointer(HWND_DESKTOP, NULL, IDP_VSPLIT);
  107.     hptrHVSplit = WinLoadPointer(HWND_DESKTOP, NULL, IDP_HVSPLIT);
  108.     hptrArrow = WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, TRUE);
  109. }
  110.  
  111.  
  112. BOOL SetupMenuStuff(HPS hps)
  113. {
  114.     BITMAPINFOHEADER bmpNew, bmpCurrent;
  115.     SIZEL gsize;
  116.     RECTL rclSrc;
  117.     POINTL ptlDst;
  118.     DRIVDATA driv;
  119.     DEVOPENSTRUC dop;
  120.  
  121.     HWND hwndMenu;   /* This is the hwnd of the initial menu bar */
  122.  
  123.     hbmChildSysMenu = WinGetSysBitmap(HWND_DESKTOP, SBMP_CHILDSYSMENU);
  124.  
  125.     GpiQueryFontMetrics(hps, (ULONG)sizeof(FONTMETRICS),
  126.             (PFONTMETRICS)&fmSystemFont);
  127.  
  128.     GpiQueryBitmapParameters(hbmChildSysMenu, &bmpCurrent);
  129.     bmpNew.cbFix = sizeof(BITMAPINFOHEADER);
  130.     bmpNew.cx = bmpCurrent.cx + (((bmpCurrent.cx - cxBorder) / 4) * 2);
  131.     bmpNew.cy = bmpCurrent.cy;
  132.     bmpNew.cPlanes = bmpCurrent.cPlanes;
  133.     bmpNew.cBitCount = bmpCurrent.cBitCount;
  134.     hbmAabChildSysMenu = GpiCreateBitmap(hps, &bmpNew, 0L, NULL, NULL);
  135.  
  136.     driv.cb = sizeof(ULONG) * 11;
  137.     driv.lVersion = 0;
  138.     driv.szDeviceName[0] = 0;
  139.     driv.abGeneralData[0] = 0L;
  140.  
  141.     dop.pszDriverName = NULL;
  142.     dop.pdriv = (PDRIVDATA)&driv;
  143.  
  144.     dop.pszLogAddress =
  145.     dop.pszDataType =
  146.     dop.pszComment =
  147.     dop.pszQueueProcName =
  148.     dop.pszQueueProcParams =
  149.     dop.pszSpoolerParams =
  150.     dop.pszNetworkParams = NULL;
  151.  
  152.     gsize.cx = bmpNew.cx;
  153.     gsize.cy = bmpNew.cy;
  154.  
  155.     hdcMem = DevOpenDC(hps, OD_MEMORY, "*", 8L, (PDEVOPENDATA)&dop, NULL);
  156.     hpsMem = GpiCreatePS(NULL, hdcMem, (PSIZEL)&gsize,
  157.             PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC);
  158.     GpiSetBitmap(hpsMem, hbmAabChildSysMenu);
  159.  
  160.     rclSrc.xLeft = 0;
  161.     rclSrc.yBottom = 0;
  162.     rclSrc.xRight = bmpNew.cx;
  163.     rclSrc.yTop = bmpNew.cy;
  164.     WinFillRect(hpsMem, (PRECTL)&rclSrc, CLR_FALSE);
  165.  
  166.     rclSrc.xRight = bmpCurrent.cx - cxBorder;
  167.     rclSrc.yTop = bmpCurrent.cy;
  168.     ptlDst.x = (bmpCurrent.cx - cxBorder) / 4;
  169.     ptlDst.y = 0;
  170.     WinDrawBitmap(hpsMem, hbmChildSysMenu, (PRECTL)&rclSrc, (PPOINTL)&ptlDst,
  171.             CLR_TRUE, CLR_FALSE, DBM_NORMAL);
  172.  
  173.     GpiSetBitmap(hpsMem, NULL);
  174.     GpiDestroyPS(hpsMem);
  175.     DevCloseDC(hdcMem);
  176.  
  177.     /*
  178.      * Get menu window handles.
  179.      */
  180.  
  181.     hwndMenu = WinWindowFromID(hwndMDIFrame, FID_MENU);
  182.  
  183. /*
  184.     ** Must not remember the hwnd of the submenu for the list of doc window's
  185.     ** since it will change as the menu bar changes
  186.  
  187.  
  188.     WinSendMsg(hwndMenu, MM_QUERYITEM, MPFROM2SHORT(IDM_WINDOW, FALSE),
  189.                MPFROMP(&mi));
  190.     hwndWindowMenu = mi.hwndSubMenu;
  191. */
  192.  
  193.     hwndSysMenu = WinWindowFromID(hwndMDIFrame, FID_SYSMENU);
  194.  
  195. /*
  196.     hwndAppMenu = WinWindowFromID(hwndMDIFrame, FID_MENU);
  197. */
  198.  
  199.     /* set up menuitem for application menu bar sysmenu */
  200.     WinSendMsg(hwndMenu, MM_QUERYITEM, MPFROM2SHORT(IDM_AABDOCSYSMENU, FALSE),
  201.                MPFROMP(&miAabSysMenu));
  202.     miAabSysMenu.hItem = (ULONG)hbmAabChildSysMenu;
  203.     WinSendMsg(hwndMenu, MM_REMOVEITEM, MPFROM2SHORT(IDM_AABDOCSYSMENU, FALSE),
  204.                (MPARAM)NULL);
  205.  
  206.     return(TRUE);
  207. }
  208.  
  209.  
  210. VOID MDITerminate(VOID)
  211. {
  212. BOOL fAabSysMenu;
  213. NPDOC npdoc;
  214.  
  215.     fAabSysMenu=FALSE;
  216.     npdoc=npdocFirst;
  217.  
  218.     while ((npdoc!=NULL) && (!fAabSysMenu)) {
  219.         fAabSysMenu=npdoc->fAabSysMenu;
  220.         npdoc=npdoc->npdocNext;
  221.         }
  222.  
  223.     /*
  224.      * Only destroy the AabSysMenu if it isn't already in *any* AAB.
  225.      * If it is we don't need to destroy it since the frame window
  226.      * manager will.
  227.      */
  228.  
  229.   /*  if (fAabSysMenu == FALSE) ????????????????????????  */
  230.  
  231.     if (WinIsWindow(hab,miAabSysMenu.hwndSubMenu)) {
  232.         WinDestroyWindow(miAabSysMenu.hwndSubMenu);
  233.         }
  234.  
  235.     GpiDeleteBitmap(hbmChildSysMenu);
  236.     GpiDeleteBitmap(hbmAabChildSysMenu);
  237.  
  238.     WinDestroyPointer(hptrHorzSplit);
  239.     WinDestroyPointer(hptrVertSplit);
  240.     WinDestroyPointer(hptrHVSplit);
  241.     WinDestroyPointer(hptrArrow);
  242. }
  243.