329 lines
11 KiB
C
329 lines
11 KiB
C
/************************************************************/
|
||
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
||
/************************************************************/
|
||
|
||
/* This routine sets up the screen position used by Word relative to the
|
||
current device. */
|
||
|
||
#define NOGDICAPMASKS
|
||
#define NOVIRTUALKEYCODES
|
||
#define NOWINSTYLES
|
||
#define NOCLIPBOARD
|
||
#define NOCTLMGR
|
||
#define NOMENUS
|
||
#define NOICON
|
||
#define NOKEYSTATE
|
||
#define NOSYSCOMMANDS
|
||
#define NOSHOWWINDOW
|
||
#define NOATOM
|
||
#define NODRAWTEXT
|
||
#define NOMSG
|
||
#define NOOPENFILE
|
||
#define NOSCROLL
|
||
#define NOSOUND
|
||
#define NOWH
|
||
#define NOWINOFFSETS
|
||
#define NOCOMM
|
||
#include <windows.h>
|
||
|
||
#include "mw.h"
|
||
#include "cmddefs.h"
|
||
#include "scrndefs.h"
|
||
#include "dispdefs.h"
|
||
#include "wwdefs.h"
|
||
#include "printdef.h"
|
||
#include "str.h"
|
||
#include "docdefs.h"
|
||
#include "propdefs.h"
|
||
#include "machdefs.h"
|
||
#include "fontdefs.h"
|
||
#include "winddefs.h"
|
||
#include <commdlg.h>
|
||
|
||
|
||
MmwWinSysChange(wm)
|
||
int wm;
|
||
{
|
||
/* This routine processes the WM_SYSCOLORCHANGE, WM_WININICHANGE,
|
||
WM_DEVMODECHANGE, and WM_FONTCHANGE messages. */
|
||
|
||
extern HDC vhDCRuler;
|
||
extern HBRUSH hbrBkgrnd;
|
||
extern long rgbBkgrnd;
|
||
extern long rgbText;
|
||
extern struct WWD rgwwd[];
|
||
extern HDC vhMDC;
|
||
extern BOOL vfMonochrome;
|
||
extern HWND hParentWw;
|
||
extern HWND vhWndPageInfo;
|
||
extern HBITMAP vhbmBitmapCache;
|
||
extern BOOL vfBMBitmapCache;
|
||
extern int vfPrinterValid;
|
||
extern CHAR szWindows[];
|
||
extern CHAR szDevices[];
|
||
extern CHAR (**hszPrinter)[];
|
||
extern CHAR (**hszPrDriver)[];
|
||
extern CHAR (**hszPrPort)[];
|
||
extern CHAR (**hszDevmodeChangeParam)[];
|
||
extern CHAR (**hszWininiChangeParam)[];
|
||
extern HFONT vhfPageInfo;
|
||
extern int docMode;
|
||
extern HWND vhWndCancelPrint;
|
||
extern BOOL vfIconic;
|
||
extern BOOL vfWarnMargins;
|
||
extern int wWininiChange;
|
||
|
||
BOOL FSetWindowColors(void);
|
||
|
||
CHAR szPrinter[cchMaxProfileSz];
|
||
CHAR (**hszPrinterSave)[];
|
||
CHAR (**hszPrDriverSave)[];
|
||
CHAR (**hszPrPortSave)[];
|
||
BOOL fNotPrinting = (vhWndCancelPrint == NULL);
|
||
RECT rc;
|
||
|
||
switch (wm)
|
||
{
|
||
case WM_SYSCOLORCHANGE:
|
||
/* Someone is changing the system colors. */
|
||
if (FSetWindowColors())
|
||
{
|
||
/* Change the colors of the ruler. */
|
||
if (vhDCRuler != NULL)
|
||
{
|
||
HPEN hpen;
|
||
|
||
/* Set the background and foreground colors of the ruler. */
|
||
SetBkColor(vhDCRuler, rgbBkgrnd);
|
||
SetTextColor(vhDCRuler, rgbText);
|
||
|
||
/* Set the pen for the ruler. */
|
||
if ((hpen = CreatePen(0, 0, rgbText)) == NULL)
|
||
{
|
||
hpen = GetStockObject(BLACK_PEN);
|
||
}
|
||
DeleteObject(SelectObject(vhDCRuler, hpen));
|
||
|
||
/* Set the background brush for the ruler. */
|
||
SelectObject(vhDCRuler, hbrBkgrnd);
|
||
}
|
||
|
||
if (wwdCurrentDoc.hDC != NULL)
|
||
{
|
||
/* Set the background and foreground colors. */
|
||
SetBkColor(wwdCurrentDoc.hDC, rgbBkgrnd);
|
||
SetTextColor(wwdCurrentDoc.hDC, rgbText);
|
||
|
||
/* Set the background brush. */
|
||
SelectObject(wwdCurrentDoc.hDC, hbrBkgrnd);
|
||
|
||
if (vhMDC != NULL && vfMonochrome)
|
||
{
|
||
/* If the display is a monochrome device, then set the text
|
||
color for the memory DC. Monochrome bitmaps will not be
|
||
converted to the foreground and background colors in this
|
||
case, we must do the conversion. */
|
||
SetTextColor(vhMDC, rgbText);
|
||
}
|
||
}
|
||
|
||
if (hParentWw != NULL)
|
||
{
|
||
/* Set the background brush for the parent window. */
|
||
DeleteObject(SelectObject(GetDC(hParentWw), hbrBkgrnd));
|
||
}
|
||
}
|
||
|
||
if (vhWndPageInfo != NULL)
|
||
{
|
||
HBRUSH hbr;
|
||
HDC hDC = GetDC(vhWndPageInfo);
|
||
|
||
/* Set the colors for the page info window. */
|
||
if ((hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOWFRAME))) ==
|
||
NULL)
|
||
{
|
||
hbr = GetStockObject(BLACK_BRUSH);
|
||
}
|
||
DeleteObject(SelectObject(hDC, hbr));
|
||
#ifdef WIN30
|
||
/* If the user has their colors set with a TextCaption color of
|
||
black then this becomes hard to read! We just hardcode this
|
||
to be white since the background defaults to being black */
|
||
SetTextColor(hDC, (DWORD) -1);
|
||
#else
|
||
SetTextColor(hDC, GetSysColor(COLOR_CAPTIONTEXT));
|
||
#endif
|
||
}
|
||
|
||
#if defined(JAPAN) & defined(IME_HIDDEN) //IME3.1J
|
||
GetImeHiddenTextColors();
|
||
#endif
|
||
|
||
/* If the bitmap cache is holding a resized metafile, then free the
|
||
cache because the bitmap might contain part of the background that might
|
||
have changed. */
|
||
if (vhbmBitmapCache != NULL && !vfBMBitmapCache)
|
||
{
|
||
FreeBitmapCache();
|
||
}
|
||
break;
|
||
|
||
case WM_WININICHANGE:
|
||
/* We only care if the "windows", "devices", or "intl" fields have
|
||
changed -- this has been taken care of already, see mmw.c */
|
||
|
||
if (wWininiChange & wWininiChangeToIntl)
|
||
{
|
||
extern HWND vhDlgRunning;
|
||
extern int utCur;
|
||
extern CHAR vchDecimal; /* decimal point character */
|
||
CHAR bufT[3]; /* to hold decimal point string */
|
||
extern CHAR szsDecimal[];
|
||
extern CHAR szsDecimalDefault[];
|
||
extern CHAR szIntl[];
|
||
extern HWND vhWndRuler;
|
||
extern int viDigits;
|
||
extern BOOL vbLZero;
|
||
|
||
if (GetProfileInt((LPSTR)szIntl, (LPSTR)"iMeasure", 1) == 1)
|
||
utCur = utInch;
|
||
else
|
||
utCur = utCm;
|
||
|
||
viDigits = GetProfileInt((LPSTR)szIntl, (LPSTR)"iDigits", 2);
|
||
vbLZero = GetProfileInt((LPSTR)szIntl, (LPSTR)"iLZero", 0);
|
||
|
||
/* Get the decimal point character from the user profile. */
|
||
GetProfileString((LPSTR)szIntl, (LPSTR)szsDecimal, (LPSTR)szsDecimalDefault,
|
||
(LPSTR)bufT, 2);
|
||
vchDecimal = *bufT;
|
||
|
||
InvalidateRect(vhWndRuler, (LPRECT)NULL, FALSE);
|
||
UpdateRuler();
|
||
}
|
||
|
||
if ((wWininiChange & wWininiChangeToDevices) ||
|
||
(wWininiChange & wWininiChangeToWindows))
|
||
{
|
||
/* Reestablish the printer from the profile in case it was the
|
||
printer that was changed. */
|
||
hszPrinterSave = hszPrinter;
|
||
hszPrDriverSave = hszPrDriver;
|
||
hszPrPortSave = hszPrPort;
|
||
|
||
if (FGetPrinterFromProfile())
|
||
{
|
||
BOOL fPrChange = FALSE;
|
||
|
||
if (hszPrinterSave == NULL || hszPrDriverSave == NULL ||
|
||
hszPrPortSave == NULL || hszPrinter == NULL || hszPrDriver ==
|
||
NULL || hszPrPort == NULL || WCompSz(&(**hszPrinter)[0],
|
||
&(**hszPrinterSave)[0]) != 0 || WCompSz(&(**hszPrDriver)[0],
|
||
&(**hszPrDriverSave)[0]) != 0 || WCompSz(&(**hszPrPort)[0],
|
||
&(**hszPrPortSave)[0]) != 0)
|
||
{
|
||
/* If we are not printing, then we can reflect the change of
|
||
the printer on the screen. */
|
||
if (!(fPrChange = fNotPrinting))
|
||
{
|
||
/* We are printing while the printer has changed, set
|
||
the flags so that the next time we get a printer DC we
|
||
will assume that it is valid. */
|
||
Assert(vfPrinterValid);
|
||
vfWarnMargins = TRUE;
|
||
}
|
||
}
|
||
|
||
/* Delete the saved copies of the printer strings. */
|
||
if (hszPrinterSave != NULL)
|
||
{
|
||
FreeH(hszPrinterSave);
|
||
}
|
||
if (hszPrDriverSave != NULL)
|
||
{
|
||
FreeH(hszPrDriverSave);
|
||
}
|
||
if (hszPrPortSave != NULL)
|
||
{
|
||
FreeH(hszPrPortSave);
|
||
}
|
||
|
||
if (fPrChange)
|
||
{
|
||
/* Get the new printer DC and update the world. */
|
||
goto GetNewPrinter;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Error(IDPMTNoMemory);
|
||
hszPrinter = hszPrinterSave;
|
||
hszPrDriver = hszPrDriverSave;
|
||
hszPrPort = hszPrPortSave;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case WM_DEVMODECHANGE:
|
||
/* The device mode for some printer has changed; check to see if it was
|
||
our printer. */
|
||
if (fNotPrinting && hszPrinter != NULL &&
|
||
(hszDevmodeChangeParam == NULL ||
|
||
(bltszx(*hszDevmodeChangeParam, (LPSTR)szPrinter ),
|
||
WCompSz(szPrinter, &(**hszPrinter)[0]) == 0)))
|
||
{
|
||
extern PRINTDLG PD; /* Common print dlg structure, initialized in the init code */
|
||
GetNewPrinter:
|
||
if (PD.hDevMode)
|
||
GlobalFree(PD.hDevMode);
|
||
if (PD.hDevNames)
|
||
GlobalFree(PD.hDevNames);
|
||
PD.hDevMode = PD.hDevNames = NULL;
|
||
|
||
/* The printer has changed, so get rid of the old one. */
|
||
FreePrinterDC();
|
||
|
||
fnPrGetDevmode();
|
||
|
||
#if defined(OLE)
|
||
ObjSetTargetDevice(TRUE);
|
||
#endif
|
||
|
||
/* The printer description has changed; assume the new printer is
|
||
valid. */
|
||
vfPrinterValid = vfWarnMargins = TRUE;
|
||
GetPrinterDC(FALSE);
|
||
ResetFontTables();
|
||
|
||
RedrawWindow:
|
||
/* Everything must be redisplayed because the world may have
|
||
changed. */
|
||
if (!vfIconic)
|
||
{
|
||
InvalidateRect(wwdCurrentDoc.wwptr, (LPRECT)NULL, FALSE);
|
||
}
|
||
}
|
||
|
||
if (hszDevmodeChangeParam != NULL)
|
||
FreeH(hszDevmodeChangeParam);
|
||
hszDevmodeChangeParam = NULL;
|
||
break;
|
||
|
||
case WM_FONTCHANGE:
|
||
/* The font used to display the page number may have changed. */
|
||
if (vhfPageInfo != NULL)
|
||
{
|
||
DeleteObject(SelectObject(GetDC(vhWndPageInfo),
|
||
GetStockObject(SYSTEM_FONT)));
|
||
vhfPageInfo = NULL;
|
||
}
|
||
docMode = docNil;
|
||
DrawMode();
|
||
|
||
ResetFontTables();
|
||
|
||
goto RedrawWindow;
|
||
} /* end switch */
|
||
}
|
||
|