|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.