// // YOWFNCS - Yow! PIZZA? no, support functions! // // Version: 1.0 Copyright (C) 1991, Lantern Corp. // Author: Edward Hutchins // Revisions: // 09/11/91 removed dependence on file dll - Ed. // #include "yow.h" // // globals // IMPORT HANDLE hAppInst FROM( yow.c ); IMPORT HWND hAppWnd FROM( yow.c ); IMPORT CHAR szAppName[8] FROM( yow.c ); IMPORT CHAR szDBase[FILENAME_SIZE] FROM( yow.c ); IMPORT CHAR szEndChar[2] FROM( yow.c ); // // IsLastLine - return true if this line is marked as the "last" one // BOOL NEAR PASCAL IsLastLine( NPSTR npszLine ) { if (!szEndChar[0]) return( TRUE ); while (*npszLine) { if (*npszLine == szEndChar[0]) { *npszLine = '\0'; return( TRUE ); } ++npszLine; } return( FALSE ); } // // ReadYowLine - get another buffer full of text // INT NEAR PASCAL ReadYowLine( INT hFile, NPSTR npszBuff, INT nBuffSize, NPSTR npszLine, INT nLineSize ) { NPSTR npBuff = npszBuff; NPSTR npStart = npszBuff; NPSTR npEnd = npszBuff + nBuffSize - 1; INT nRead = 0; while (npBuff <= npEnd) switch (*npBuff) { case '\0': { INT nCnt = npEnd - npBuff; nCnt = (INT)_lread( hFile, npBuff, nCnt ); if (nCnt > 0) npBuff[nCnt] = '\0'; } if (*npBuff == '\0') goto Done; break; case '\x0d': case '\x0a': ++nRead; *npBuff++ = *npszLine++ = '\0'; if (*npBuff == '\x0a' || *npBuff == '\x0d') *npBuff++ = '\0'; goto Done; default: if (--nLineSize <= 0) goto Done; *npszLine++ = *npBuff++; break; } Done: while (npBuff <= npEnd) *npStart++ = *npBuff++; *npStart = *npszLine = '\0'; return( nRead ); } // // GetYowLine - get a line from the lines database // BOOL NEAR PASCAL GetYowLine( NPSTR npBuff, INT nSize ) { INT hFile = _lopen( szDBase, OF_READ ); LONG lSize; LOCAL LONG lPos; BOOL bSuccess = FALSE; INT nCnt, nLine; CHAR szLineBuff[256]; CHAR szLine[256]; *npBuff = '\0'; if (hFile == -1) return( FALSE ); lSize = _llseek( hFile, 0, 2 ); if (lSize < 2) goto Abort; for (nCnt = 10; nCnt; --nCnt) { lPos = (lPos << 1) ^ GetCurrentTime() ^ MAKELONG( rand(), rand() ); lPos %= lSize; if (_llseek( hFile, lPos, 0 ) != lPos) break; szLineBuff[0] = '\0'; while (ReadYowLine( hFile, szLineBuff, sizeof(szLineBuff), szLine, sizeof(szLine) ) > 0) { if (IsLastLine( szLine )) break; } nLine = 0; while (ReadYowLine( hFile, szLineBuff, sizeof(szLineBuff), szLine, sizeof(szLine) ) > 0) { NPSTR npCpy = szLine; bSuccess = IsLastLine( szLine ); if (nLine++) { *npBuff++ = '\x0d'; *npBuff++ = '\x0a'; nSize -= 2; } while (isspace(*npCpy)) ++npCpy; while (*npCpy && --nSize > 0) *npBuff++ = *npCpy++; *npBuff = '\0'; if (bSuccess) goto Abort; } } Abort: if (hFile != -1) _lclose( hFile ); return( bSuccess ); } // // InRect - move a rectangle in by one // VOID NEAR PASCAL InRect( NPRECT npRect ) { RECT rect = *npRect; ++rect.top; ++rect.left; --rect.bottom; --rect.right; *npRect = rect; } // // TransRect - move a rectangle along the diagonal // VOID NEAR PASCAL TransRect( NPRECT npRect, INT nDist ) { RECT rect = *npRect; rect.top += nDist; rect.left += nDist; rect.bottom += nDist; rect.right += nDist; *npRect = rect; } // // ShadowRect - draw a shadow rect // VOID NEAR PASCAL ShadowRect( HDC hDC, NPRECT npRect, HPEN hTL, HPEN hBR ) { RECT rect = *npRect; --rect.bottom; --rect.right; SelectObject( hDC, hTL ); MoveTo( hDC, rect.right, rect.top ); LineTo( hDC, rect.left, rect.top ); LineTo( hDC, rect.left, rect.bottom ); SelectObject( hDC, hBR ); LineTo( hDC, rect.right, rect.bottom ); LineTo( hDC, rect.right, rect.top ); ++rect.top; ++rect.left; *npRect = rect; } // // DrawYowBorder - draw a shaded rectangle around the yow display // VOID NEAR PASCAL DrawYowBorder( HDC hDC, NPRECT npRect ) { HPEN hHiPen = GetStockObject( WHITE_PEN ); HPEN hBlackPen = GetStockObject( BLACK_PEN ); HPEN hLoPen = CreatePen( 0, 1, RGB( 128, 128, 128 ) ); RECT rect = *npRect; SelectObject( hDC, GetStockObject( NULL_BRUSH ) ); ShadowRect( hDC, &rect, hHiPen, hLoPen ); ShadowRect( hDC, &rect, hHiPen, hLoPen ); InRect( &rect ); InRect( &rect ); ShadowRect( hDC, &rect, hLoPen, hHiPen ); ShadowRect( hDC, &rect, hBlackPen, hBlackPen ); ShadowRect( hDC, &rect, hHiPen, hLoPen ); if (hLoPen) DeleteObject( hLoPen ); } // // SwapBitmaps - switch bitmaps around // VOID NEAR PASCAL SwapBitmaps( HDC hDC, HDC hdcMem, INT x, INT y, INT cx, INT cy ) { BitBlt( hdcMem, 0, 0, cx, cy, hDC, x, y, SRCINVERT ); BitBlt( hDC, x, y, cx, cy, hdcMem, 0, 0, SRCINVERT ); BitBlt( hdcMem, 0, 0, cx, cy, hDC, x, y, SRCINVERT ); } // // Yow - yow! // VOID FAR PASCAL Yow( INT nVirtKey ) { HDC hDC = CreateScreenDC(); HDC hdcMem = CreateCompatibleDC( hDC ); HBITMAP hbm = NULL, hbmOld = NULL; HFONT hfont = NULL, hfontOld = NULL; INT x, y; INT cx = GetSystemMetrics( SM_CXSCREEN ); INT cy = GetSystemMetrics( SM_CYSCREEN ); RECT rect; BOOL bSuccess = FALSE; CHAR szBuff[2048]; // fetch the data if (!GetYowLine( szBuff, sizeof(szBuff) )) { MessageBeep( 0 ); return; } hfont = CreateFont( cx / 40, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_STROKE_PRECIS, PROOF_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Tms Rmn" ); if (!hfont) goto Abort; // calculate the bounding box rect.left = 0; rect.right = cx - 56; rect.top = 0; rect.bottom = cy - 20; SetBkMode( hDC, TRANSPARENT ); hfontOld = SelectObject( hDC, hfont ); DrawText( hDC, szBuff, -1, &rect, YOW_STYLE | DT_CALCRECT ); SelectObject( hDC, hfontOld ); hfontOld = HNULL; // calculate the width and height, and the centered offset on the screen x = (cx - (56 + rect.right - rect.left)) / 2; cx = 40 + rect.right - rect.left; // kludge in some padding y = (cy - (20 + rect.bottom - rect.top)) / 2; cy = 4 + rect.bottom - rect.top; // create the offscreen bitmap hbm = CreateCompatibleBitmap( hDC, cx + 16, cy + 16 ); if (!hbm) goto Abort; hbmOld = SelectObject( hdcMem, hbm ); hfontOld = SelectObject( hdcMem, hfont ); // set up the bitmap background rect.top = rect.left = 0; rect.right = 16 + cx; rect.bottom = 16 + cy; FillRect( hdcMem, &rect, GetStockObject( LTGRAY_BRUSH ) ); DrawYowBorder( hdcMem, &rect ); // draw the fancy text SetBkMode( hdcMem, TRANSPARENT ); rect.top = rect.left = 8; rect.right = 8 + cx; rect.bottom = 8 + cy; TransRect( &rect, 2 ); SetTextColor( hdcMem, RGB(255,255,255) ); DrawText( hdcMem, szBuff, -1, &rect, YOW_STYLE ); TransRect( &rect, -2 ); SetTextColor( hdcMem, RGB(128,128,128) ); DrawText( hdcMem, szBuff, -1, &rect, YOW_STYLE ); TransRect( &rect, 1 ); SetTextColor( hdcMem, RGB(0,0,0) ); DrawText( hdcMem, szBuff, -1, &rect, YOW_STYLE ); // keep the bitmap up till the key is released SwapBitmaps( hDC, hdcMem, x, y, 16 + cx, 16 + cy ); while (GetAsyncKeyState( nVirtKey ) < 0) ; SwapBitmaps( hDC, hdcMem, x, y, 16 + cx, 16 + cy ); bSuccess = TRUE; Abort: if (hbmOld) SelectObject( hdcMem, hbmOld ); if (hfontOld) SelectObject( hdcMem, hfontOld ); if (hdcMem) DeleteDC( hdcMem ); if (hDC) DeleteDC( hDC ); if (hfont) DeleteObject( hfont ); if (hbm) DeleteObject( hbm ); if (!bSuccess) MessageBeep( 0 ); }