home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk11 / tk4 / mdi / mdiinit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-20  |  5.8 KB  |  215 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.     MENUITEM mi;
  115.     BITMAPINFOHEADER bmpNew, bmpCurrent;
  116.     SIZEL gsize;
  117.     RECTL rclSrc;
  118.     POINTL ptlDst;
  119.     DRIVDATA driv;
  120.     DEVOPENSTRUC dop;
  121.  
  122.     hbmChildSysMenu = WinGetSysBitmap(HWND_DESKTOP, SBMP_CHILDSYSMENU);
  123.  
  124.     GpiQueryFontMetrics(hps, (ULONG)sizeof(FONTMETRICS),
  125.             (PFONTMETRICS)&fmSystemFont);
  126.  
  127.     GpiQueryBitmapParameters(hbmChildSysMenu, &bmpCurrent);
  128.     bmpNew.cbFix = sizeof(BITMAPINFOHEADER);
  129.     bmpNew.cx = bmpCurrent.cx + (((bmpCurrent.cx - cxBorder) / 4) * 2);
  130.     bmpNew.cy = bmpCurrent.cy;
  131.     bmpNew.cPlanes = bmpCurrent.cPlanes;
  132.     bmpNew.cBitCount = bmpCurrent.cBitCount;
  133.     hbmAabChildSysMenu = GpiCreateBitmap(hps, &bmpNew, 0L, NULL, NULL);
  134.  
  135.     driv.cb = sizeof(ULONG) * 11;
  136.     driv.lVersion = 0;
  137.     driv.szDeviceName[0] = 0;
  138.     driv.abGeneralData[0] = 0L;
  139.  
  140.     dop.pszDriverName = NULL;
  141.     dop.pdriv = (PDRIVDATA)&driv;
  142.  
  143.     dop.pszLogAddress =
  144.     dop.pszDataType =
  145.     dop.pszComment =
  146.     dop.pszQueueProcName =
  147.     dop.pszQueueProcParams =
  148.     dop.pszSpoolerParams =
  149.     dop.pszNetworkParams = NULL;
  150.  
  151.     gsize.cx = bmpNew.cx;
  152.     gsize.cy = bmpNew.cy;
  153.  
  154.     hdcMem = DevOpenDC(hps, OD_MEMORY, "*", 8L, (PDEVOPENDATA)&dop, NULL);
  155.     hpsMem = GpiCreatePS(NULL, hdcMem, (PSIZEL)&gsize,
  156.             PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC);
  157.     GpiSetBitmap(hpsMem, hbmAabChildSysMenu);
  158.  
  159.     rclSrc.xLeft = 0;
  160.     rclSrc.yBottom = 0;
  161.     rclSrc.xRight = bmpNew.cx;
  162.     rclSrc.yTop = bmpNew.cy;
  163.     WinFillRect(hpsMem, (PRECTL)&rclSrc, CLR_FALSE);
  164.  
  165.     rclSrc.xRight = bmpCurrent.cx - cxBorder;
  166.     rclSrc.yTop = bmpCurrent.cy;
  167.     ptlDst.x = (bmpCurrent.cx - cxBorder) / 4;
  168.     ptlDst.y = 0;
  169.     WinDrawBitmap(hpsMem, hbmChildSysMenu, (PRECTL)&rclSrc, (PPOINTL)&ptlDst,
  170.             CLR_TRUE, CLR_FALSE, DBM_NORMAL);
  171.  
  172.     GpiSetBitmap(hpsMem, NULL);
  173.     GpiDestroyPS(hpsMem);
  174.     DevCloseDC(hdcMem);
  175.  
  176.     /*
  177.      * Get menu window handles.
  178.      */
  179.     hwndMainMenu = WinWindowFromID(hwndMDIFrame, FID_MENU);
  180.     WinSendMsg(hwndMainMenu, MM_QUERYITEM, MPFROM2SHORT(IDM_WINDOW, FALSE),
  181.                MPFROMP(&mi));
  182.     hwndWindowMenu = mi.hwndSubMenu;
  183.     hwndSysMenu = WinWindowFromID(hwndMDIFrame, FID_SYSMENU);
  184.     hwndAppMenu = WinWindowFromID(hwndMDIFrame, FID_MENU);
  185.  
  186.     /* set up menuitem for application menu bar sysmenu */
  187.     WinSendMsg(hwndMainMenu, MM_QUERYITEM, MPFROM2SHORT(IDM_AABDOCSYSMENU, FALSE),
  188.                MPFROMP(&miAabSysMenu));
  189.     miAabSysMenu.hItem = (ULONG)hbmAabChildSysMenu;
  190.     WinSendMsg(hwndMainMenu, MM_REMOVEITEM, MPFROM2SHORT(IDM_AABDOCSYSMENU, FALSE),
  191.                (MPARAM)NULL);
  192.  
  193.     return(TRUE);
  194. }
  195.  
  196.  
  197. VOID MDITerminate(VOID)
  198. {
  199.     /*
  200.      * Only destroy the AabSysMenu if it isn't already in the AAB.
  201.      * If it is we don't need to destroy it since the frame window
  202.      * manager will.
  203.      */
  204.     if (fAabSysMenu == FALSE)
  205.         WinDestroyWindow(miAabSysMenu.hwndSubMenu);
  206.  
  207.     GpiDeleteBitmap(hbmChildSysMenu);
  208.     GpiDeleteBitmap(hbmAabChildSysMenu);
  209.  
  210.     WinDestroyPointer(hptrHorzSplit);
  211.     WinDestroyPointer(hptrVertSplit);
  212.     WinDestroyPointer(hptrHVSplit);
  213.     WinDestroyPointer(hptrArrow);
  214. }
  215.