/*++ * * 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