333 lines
8.5 KiB
C
333 lines
8.5 KiB
C
|
/*++
|
||
|
*
|
||
|
* WOW v1.0
|
||
|
*
|
||
|
* Copyright (c) 1991, Microsoft Corporation
|
||
|
*
|
||
|
* MSUTIL.C
|
||
|
* WOW16 misc. routines
|
||
|
*
|
||
|
* History:
|
||
|
*
|
||
|
* Created 28-May-1991 by Jeff Parsons (jeffpar)
|
||
|
* Copied from WIN31 and edited (as little as possible) for WOW16.
|
||
|
* At this time, all we want is GetCharDimensions(), which the edit
|
||
|
* controls use.
|
||
|
--*/
|
||
|
|
||
|
/****************************************************************************/
|
||
|
/* */
|
||
|
/* MSUTIL.C - */
|
||
|
/* */
|
||
|
/* Miscellaneous Messaging Routines */
|
||
|
/* */
|
||
|
/****************************************************************************/
|
||
|
|
||
|
#include "user.h"
|
||
|
|
||
|
#ifndef WOW
|
||
|
#include "winmgr.h"
|
||
|
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* CancelMode() - */
|
||
|
/* */
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
void FAR PASCAL CancelMode(hwnd)
|
||
|
|
||
|
register HWND hwnd;
|
||
|
|
||
|
{
|
||
|
if (hwnd != NULL)
|
||
|
{
|
||
|
if (hwnd != hwndCapture)
|
||
|
CancelMode(hwndCapture);
|
||
|
SendMessage(hwnd, WM_CANCELMODE, 0, 0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* BcastCopyString() - */
|
||
|
/* */
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
/* Copy strings which are going to be Broadcast into USER's DS to prevent
|
||
|
* EMS problems when switching tasks.
|
||
|
*/
|
||
|
|
||
|
HANDLE FAR PASCAL BcastCopyString(lParam)
|
||
|
|
||
|
LONG lParam;
|
||
|
|
||
|
{
|
||
|
LPSTR ptrbuf;
|
||
|
register int len;
|
||
|
register HANDLE hMem;
|
||
|
|
||
|
len = lstrlen((LPSTR)lParam) + 1;
|
||
|
|
||
|
if ((hMem = GlobalAlloc(GMEM_FIXED | GMEM_LOWER, (LONG)len)) == NULL)
|
||
|
return(NULL);
|
||
|
|
||
|
/* Get the address of the allocated block. */
|
||
|
ptrbuf = GlobalLock(hMem);
|
||
|
LCopyStruct((LPSTR)lParam, ptrbuf, len);
|
||
|
|
||
|
return(hMem);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* SendSizeMessages() - */
|
||
|
/* */
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
void FAR PASCAL SendSizeMessage(hwnd, cmdSize)
|
||
|
|
||
|
register HWND hwnd;
|
||
|
WORD cmdSize;
|
||
|
|
||
|
{
|
||
|
DWORD lParam;
|
||
|
|
||
|
lParam = MAKELONG(hwnd->rcClient.right - hwnd->rcClient.left,
|
||
|
hwnd->rcClient.bottom - hwnd->rcClient.top);
|
||
|
SendMessage(hwnd, WM_SIZE, cmdSize, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* AdjustWindowRect() - */
|
||
|
/* */
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
void USERENTRY AdjustWindowRect(lprc, style, fMenu)
|
||
|
|
||
|
LPRECT lprc;
|
||
|
LONG style;
|
||
|
BOOL fMenu;
|
||
|
|
||
|
{
|
||
|
AdjustWindowRectEx(lprc, style, fMenu, (DWORD)0);
|
||
|
}
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* AdjustWindowRectEx() - */
|
||
|
/* */
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
void USERENTRY AdjustWindowRectEx(lprc, style, fMenu, dwExStyle)
|
||
|
|
||
|
LPRECT lprc;
|
||
|
LONG style;
|
||
|
BOOL fMenu;
|
||
|
DWORD dwExStyle;
|
||
|
|
||
|
{
|
||
|
register int cx;
|
||
|
register int cy;
|
||
|
|
||
|
cx = cxBorder;
|
||
|
cy = cyBorder;
|
||
|
|
||
|
if (fMenu)
|
||
|
lprc->top -= rgwSysMet[SM_CYMENU];
|
||
|
|
||
|
/* Let us first decide if it is no-border, single border or dlg border */
|
||
|
|
||
|
/* Check if the WS_EX_DLGMODALFRAME bit is set, if so Dlg border */
|
||
|
if(dwExStyle & WS_EX_DLGMODALFRAME)
|
||
|
{
|
||
|
cx *= (CLDLGFRAME + 2*CLDLGFRAMEWHITE + 1);
|
||
|
cy *= (CLDLGFRAME + 2*CLDLGFRAMEWHITE + 1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* C6.0 will not generate jump table for this switch because of the
|
||
|
* range of values tested in case statemts;
|
||
|
*/
|
||
|
switch (HIWORD(style) & HIWORD(WS_CAPTION))
|
||
|
{
|
||
|
case HIWORD(WS_CAPTION):
|
||
|
case HIWORD(WS_BORDER):
|
||
|
break; /* Single border */
|
||
|
|
||
|
case HIWORD(WS_DLGFRAME):
|
||
|
cx *= (CLDLGFRAME + 2*CLDLGFRAMEWHITE + 1);
|
||
|
cy *= (CLDLGFRAME + 2*CLDLGFRAMEWHITE + 1);
|
||
|
break; /* Dlg Border */
|
||
|
|
||
|
default: /* case 0 */
|
||
|
cx = 0; /* No border */
|
||
|
cy = 0;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if((HIWORD(style) & HIWORD(WS_CAPTION)) == HIWORD(WS_CAPTION))
|
||
|
lprc->top -= (cyCaption - cyBorder);
|
||
|
|
||
|
if(cx || cy)
|
||
|
InflateRect(lprc, cx, cy);
|
||
|
|
||
|
/* Shouldn't we check if it has DLG frame and if so skip the following ?? */
|
||
|
if (style & WS_SIZEBOX)
|
||
|
InflateRect(lprc, cxSzBorder, cySzBorder);
|
||
|
}
|
||
|
#endif // WOW
|
||
|
|
||
|
/*----------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* GetCharDimensions(hDC, lpTextMetrics) */
|
||
|
/* */
|
||
|
/* This function loads the Textmetrics of the font currently */
|
||
|
/* selected into the hDC and returns the Average char width of the */
|
||
|
/* font; Pl Note that the AveCharWidth value returned by the Text */
|
||
|
/* metrics call is wrong for proportional fonts. So, we compute them */
|
||
|
/* On return, lpTextMetrics contains the text metrics of the */
|
||
|
/* currently selected font. */
|
||
|
/* */
|
||
|
/*----------------------------------------------------------------------*/
|
||
|
|
||
|
int FAR PASCAL GetCharDimensions(HDC hDC, LPTEXTMETRIC lpTextMetrics)
|
||
|
{
|
||
|
int cxWidth;
|
||
|
int i;
|
||
|
char AveCharWidthData[52];
|
||
|
|
||
|
/* Store the System Font metrics info. */
|
||
|
GetTextMetrics(hDC, lpTextMetrics);
|
||
|
|
||
|
if (!(lpTextMetrics -> tmPitchAndFamily & 1)) /* If !variable_width font */
|
||
|
cxWidth = lpTextMetrics -> tmAveCharWidth;
|
||
|
else
|
||
|
{
|
||
|
/* Change from tmAveCharWidth. We will calculate a true average as
|
||
|
opposed to the one returned by tmAveCharWidth. This works better
|
||
|
when dealing with proportional spaced fonts. */
|
||
|
|
||
|
for (i=0;i<=25;i++)
|
||
|
AveCharWidthData[i] = (char)(i+(int)'a');
|
||
|
for (i=0;i<=25;i++)
|
||
|
AveCharWidthData[i+26] = (char)(i+(int)'A');
|
||
|
cxWidth = LOWORD(GetTextExtent(hDC,AveCharWidthData,52)) / 26;
|
||
|
|
||
|
cxWidth = (cxWidth + 1) / 2; // round up
|
||
|
|
||
|
#if 0
|
||
|
{
|
||
|
char buf[80];
|
||
|
wsprintf(buf, "cxWidth = %d tmAveCharWidth %d\r\n", cxWidth, lpTextMetrics -> tmAveCharWidth);
|
||
|
OutputDebugString(buf);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
return(cxWidth);
|
||
|
}
|
||
|
|
||
|
#ifndef WOW
|
||
|
/*----------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* GetAveCharWidth(hDC) */
|
||
|
/* */
|
||
|
/* This function loads the Textmetrics of the font currently */
|
||
|
/* selected into the hDC and returns the Average char width of the */
|
||
|
/* font; Pl Note that the AveCharWidth value returned by the Text */
|
||
|
/* metrics call is wrong for proportional fonts. So, we compute them */
|
||
|
/* On return, lpTextMetrics contains the text metrics of the */
|
||
|
/* currently selected font. */
|
||
|
/* */
|
||
|
/*----------------------------------------------------------------------*/
|
||
|
|
||
|
int FAR PASCAL GetAveCharWidth(hDC)
|
||
|
|
||
|
HDC hDC;
|
||
|
|
||
|
{
|
||
|
TEXTMETRIC TextMetric;
|
||
|
|
||
|
return(GetCharDimensions(hDC, &TextMetric));
|
||
|
}
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* MB_FindLongestString() - */
|
||
|
/* */
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
WORD FAR PASCAL MB_FindLongestString()
|
||
|
|
||
|
{
|
||
|
int i;
|
||
|
int iMaxLen = 0;
|
||
|
int iNewMaxLen;
|
||
|
PSTR *pszCurStr;
|
||
|
PSTR szMaxStr;
|
||
|
HDC hdc;
|
||
|
WORD wRetVal;
|
||
|
|
||
|
hdc = (HDC)GetScreenDC();
|
||
|
|
||
|
for(i = 0, pszCurStr = AllMBbtnStrings; i < MAX_SEB_STYLES; i++, pszCurStr++)
|
||
|
{
|
||
|
if((iNewMaxLen = lstrlen((LPSTR)*pszCurStr)) > iMaxLen)
|
||
|
{
|
||
|
iMaxLen = iNewMaxLen;
|
||
|
szMaxStr = *pszCurStr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Find the longest string */
|
||
|
|
||
|
wRetVal = ((WORD)PSMGetTextExtent(hdc, (LPSTR)szMaxStr, lstrlen((LPSTR)szMaxStr))
|
||
|
+ ((int)PSGetTextExtent(hdc, (LPSTR)szOneChar, 1) << 1));
|
||
|
|
||
|
InternalReleaseDC(hdc);
|
||
|
|
||
|
return(wRetVal);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
/* */
|
||
|
/* InitPwSB() - */
|
||
|
/* */
|
||
|
/*--------------------------------------------------------------------------*/
|
||
|
|
||
|
int * FAR PASCAL InitPwSB(hwnd)
|
||
|
|
||
|
register HWND hwnd;
|
||
|
|
||
|
{
|
||
|
register int *pw;
|
||
|
|
||
|
if (hwnd->rgwScroll)
|
||
|
/* If memory is already allocated, don't bother to do it again.
|
||
|
*/
|
||
|
return(hwnd->rgwScroll);
|
||
|
|
||
|
if ((hwnd->rgwScroll = pw = (int *)UserLocalAlloc(ST_WND, LPTR, 7 * sizeof(int))) != NULL)
|
||
|
{
|
||
|
/* rgw[0] = 0; */ /* LPTR zeros all 6 words */
|
||
|
/* rgw[1] = 0; */
|
||
|
/* rgw[3] = 0; */
|
||
|
/* rgw[4] = 0; */
|
||
|
/* rgw[6] = 0; Enable/Disable Flags */
|
||
|
pw[2] = pw[5] = 100;
|
||
|
}
|
||
|
|
||
|
return(pw);
|
||
|
}
|
||
|
|
||
|
#endif // WOW
|