|
|
Microsoft OS/2 SDK PM 02-24-1989
/***************************************************************************\
* mdiinit.c - MDI initialization funtions.
*
* Created by Microsoft Corporation, 1989
\***************************************************************************/
#define INCL_WINSYS
#define INCL_WINCOMMON
#define INCL_WINMESSAGEMGR
#define INCL_WINPOINTERS
#define INCL_WININPUT
#define INCL_WINMENUS
#define INCL_WINFRAMEMGR
#define INCL_WINWINDOWMGR
#define INCL_WINRECTANGLES
#define INCL_WINHEAP
#define INCL_GPIBITMAPS
#define INCL_GPILCIDS
#define INCL_DEV
#include <os2.h>
#include "app.h"
#include "appdata.h"
#include "mdi.h"
#include "mdidata.h"
/* Function prototypes */
VOID InitMDIPointers(VOID);
BOOL SetupMenuStuff(HPS hps);
VOID InitSplitbars(VOID);
VOID InitInitialDocPlacement(VOID);
BOOL MDIInit(VOID)
{
HPS hps;
/*
* Register the splitbar window class.
*/
if (!WinRegisterClass(NULL, szSplitbarClass, (PFNWP)SplitbarWndProc,
CS_MOVENOTIFY | CS_SYNCPAINT, 0))
return(FALSE);
InitMDIPointers();
pfnMainFrameWndProc = WinSubclassWindow(hwndMDIFrame,
(PFNWP)MainFrameWndProc);
hps = WinGetPS(hwndMDI);
if (SetupMenuStuff(hps) == FALSE)
return(FALSE);
WinReleasePS(hps);
InitSplitbars();
InitInitialDocPlacement();
return(TRUE);
}
VOID InitInitialDocPlacement(VOID)
{
RECTL rclDesktop;
/*
* New documents will be 2/3 the width of the
* screen and 1/2 the height of the screen.
*/
cxNewDoc = (cxScreen * 2) / 3;
cyNewDoc = cyScreen / 2;
WinQueryWindowRect(hwndMDI, &rclDesktop);
xNextNewDoc = 0;
yNextNewDoc = (SHORT)rclDesktop.yTop - cyNewDoc;
xCascadeInc = cxSizeBorder + (cxMinmaxButton / 2);
yCascadeInc = cySizeBorder + cyTitlebar - cyBorder;
xCascadeSlot = 0;
}
VOID InitSplitbars()
{
/*
* Calculate the values cxVertSplitbar and cyHorzSplitbar.
*
* The horzontal splitbar is 1/3 the height of the vertical
* scrollbar arrow. We use the aspect ratio of the display
* to determine the width of the vertical splitbar.
*/
cyHorzSplitbar = cyVScrollArrow / 3;
cxVertSplitbar = (USHORT)(cyHorzSplitbar *
rglDevCaps[CAPS_HORIZONTAL_RESOLUTION] /
rglDevCaps[CAPS_VERTICAL_RESOLUTION]);
}
VOID InitMDIPointers(VOID)
{
hptrHorzSplit = WinLoadPointer(HWND_DESKTOP, NULL, IDP_HSPLIT);
hptrVertSplit = WinLoadPointer(HWND_DESKTOP, NULL, IDP_VSPLIT);
hptrHVSplit = WinLoadPointer(HWND_DESKTOP, NULL, IDP_HVSPLIT);
hptrArrow = WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, TRUE);
}
BOOL SetupMenuStuff(HPS hps)
{
MENUITEM mi;
BITMAPINFOHEADER bmpNew, bmpCurrent;
SIZEL gsize;
RECTL rclSrc;
POINTL ptlDst;
DRIVDATA driv;
DEVOPENSTRUC dop;
hbmChildSysMenu = WinGetSysBitmap(HWND_DESKTOP, SBMP_CHILDSYSMENU);
GpiQueryFontMetrics(hps, (ULONG)sizeof(FONTMETRICS),
(PFONTMETRICS)&fmSystemFont);
GpiQueryBitmapParameters(hbmChildSysMenu, &bmpCurrent);
bmpNew.cbFix = sizeof(BITMAPINFOHEADER);
bmpNew.cx = bmpCurrent.cx + (((bmpCurrent.cx - cxBorder) / 4) * 2);
bmpNew.cy = bmpCurrent.cy;
bmpNew.cPlanes = bmpCurrent.cPlanes;
bmpNew.cBitCount = bmpCurrent.cBitCount;
hbmAabChildSysMenu = GpiCreateBitmap(hps, &bmpNew, 0L, NULL, NULL);
driv.cb = sizeof(ULONG) * 11;
driv.lVersion = 0;
driv.szDeviceName[0] = 0;
driv.abGeneralData[0] = 0L;
dop.pszDriverName = NULL;
dop.pdriv = (PDRIVDATA)&driv;
dop.pszLogAddress =
dop.pszDataType =
dop.pszComment =
dop.pszQueueProcName =
dop.pszQueueProcParams =
dop.pszSpoolerParams =
dop.pszNetworkParams = NULL;
gsize.cx = bmpNew.cx;
gsize.cy = bmpNew.cy;
hdcMem = DevOpenDC(hps, OD_MEMORY, "*", 8L, (PDEVOPENDATA)&dop, NULL);
hpsMem = GpiCreatePS(NULL, hdcMem, (PSIZEL)&gsize,
PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC);
GpiSetBitmap(hpsMem, hbmAabChildSysMenu);
rclSrc.xLeft = 0;
rclSrc.yBottom = 0;
rclSrc.xRight = bmpNew.cx;
rclSrc.yTop = bmpNew.cy;
WinFillRect(hpsMem, (PRECTL)&rclSrc, CLR_FALSE);
rclSrc.xRight = bmpCurrent.cx - cxBorder;
rclSrc.yTop = bmpCurrent.cy;
ptlDst.x = (bmpCurrent.cx - cxBorder) / 4;
ptlDst.y = 0;
WinDrawBitmap(hpsMem, hbmChildSysMenu, (PRECTL)&rclSrc, (PPOINTL)&ptlDst,
CLR_TRUE, CLR_FALSE, DBM_NORMAL);
GpiSetBitmap(hpsMem, NULL);
GpiDestroyPS(hpsMem);
DevCloseDC(hdcMem);
/*
* Get menu window handles.
*/
hwndMainMenu = WinWindowFromID(hwndMDIFrame, FID_MENU);
WinSendMsg(hwndMainMenu, MM_QUERYITEM, MPFROM2SHORT(IDM_WINDOW, FALSE),
MPFROMP(&mi));
hwndWindowMenu = mi.hwndSubMenu;
hwndSysMenu = WinWindowFromID(hwndMDIFrame, FID_SYSMENU);
hwndAppMenu = WinWindowFromID(hwndMDIFrame, FID_MENU);
/* set up menuitem for application menu bar sysmenu */
WinSendMsg(hwndMainMenu, MM_QUERYITEM, MPFROM2SHORT(IDM_AABDOCSYSMENU, FALSE),
MPFROMP(&miAabSysMenu));
miAabSysMenu.hItem = (ULONG)hbmAabChildSysMenu;
WinSendMsg(hwndMainMenu, MM_REMOVEITEM, MPFROM2SHORT(IDM_AABDOCSYSMENU, FALSE),
(MPARAM)NULL);
return(TRUE);
}
VOID MDITerminate(VOID)
{
/*
* Only destroy the AabSysMenu if it isn't already in the AAB.
* If it is we don't need to destroy it since the frame window
* manager will.
*/
if (fAabSysMenu == FALSE)
WinDestroyWindow(miAabSysMenu.hwndSubMenu);
GpiDeleteBitmap(hbmChildSysMenu);
GpiDeleteBitmap(hbmAabChildSysMenu);
WinDestroyPointer(hptrHorzSplit);
WinDestroyPointer(hptrVertSplit);
WinDestroyPointer(hptrHVSplit);
WinDestroyPointer(hptrArrow);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.