windows-nt/Source/XPSP1/NT/base/mvdm/wow16/user/msutil.c
2020-09-26 16:20:57 +08:00

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