|
|
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.