// Not sure which of these includes are/will be needed - t-gregti #include //#include #include // CRT includes #include #include #include #include #include #include #include #include #include #include // RL TOOLS SET includes #include "windefs.h" #include "restok.h" #include "wincomon.h" int LoadStrIntoAnsiBuf( HINSTANCE hinst, UINT idResource, LPSTR lpszBuffer, int cbBuffer ) { int rc; #ifdef RLRES32 WCHAR tszTmpBuf[256]; rc = LoadString( hinst, idResource, tszTmpBuf, TCHARSIN( sizeof( tszTmpBuf))); _WCSTOMBS( lpszBuffer, tszTmpBuf, cbBuffer, lstrlen( tszTmpBuf ) + 1 ); #else rc = LoadString( hinst, idResource, lpszBuffer, cbBuffer ); #endif return( rc); } /** * Function: GetFileNameFromBrowse. * Uses the commdlg.dll GetOpenFileName function to prompt the user * file name. * * Arguments: * hDlg, Owner for browse dialog. * pszFileName, // buffer to insert file name * cbFilePath, // Max length of file path buffer. * szTitle, // Working directory * szFilter, // filters string. * szDefExt // Default extension to file name * * Returns: * TRUE, pszFileName contains file name. * FALSE, GetFileName aborted. * * History: * 9/91 Copied from NotePad sources. TerryRu. **/ BOOL GetFileNameFromBrowse(HWND hDlg, PSTR pszFileName, UINT cbFilePath, PSTR szTitle, PSTR szFilter, PSTR szDefExt) { OPENFILENAMEA ofn; // Structure used to init dialog. CHAR szBrowserDir[128]; // Directory to start browsing from. szBrowserDir[0] = '\0'; // By default use CWD. // initalize ofn to NULLS memset( (void *)&ofn, 0, sizeof( OPENFILENAMEA ) ); /* fill in non-variant fields of OPENFILENAMEA struct. */ ofn.lStructSize = sizeof(OPENFILENAMEA); ofn.lpstrCustomFilter = szCustFilterSpec; ofn.nMaxCustFilter = MAXCUSTFILTER; ofn.nFilterIndex = 1; ofn.lpstrFile = pszFileName; ofn.nMaxFile = MAXFILENAME; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = MAXFILENAME; ofn.lpTemplateName = NULL; ofn.lpfnHook = NULL; // Setup info for comm dialog. ofn.hwndOwner = hDlg; ofn.lpstrInitialDir = szBrowserDir; ofn.Flags = OFN_HIDEREADONLY; ofn.lpstrDefExt = szDefExt; ofn.lpstrFileTitle = szFileTitle; ofn.lpstrTitle = szTitle; ofn.lpstrFilter = szFilter; // Get a filename from the dialog. return GetOpenFileNameA(&ofn); } #define MAX_STATUS_FIELDS 5 #define MAXBUFFERSIZE 80 /**************************************************************************** *Procedure: StatusWndProc * *Inputs: * *Returns: * depends on message * *History: * 7/92 - created - t-gregti * *Comments: * More general than strictly neccesary for the RL tools, but * it makes adding new fields to the status line really easy. * For WM_FMTSTATLINE the lParam should be a string with length/type pairs * much like a printf format, e.g. "10s5i10s20i". * For WM_UPDSTATLINE the wParam contains the field to change and the lParam * contains a pointer to a string or int to display. * *****************************************************************************/ INT_PTR APIENTRY StatusWndProc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT ps; HDC hDC; static HFONT hFontCourier; static UINT cFields = 0; static UINT aiSize[MAX_STATUS_FIELDS]; static TCHAR aszStatusStrings[MAX_STATUS_FIELDS][MAXBUFFERSIZE]; static BOOL abIntegers[MAX_STATUS_FIELDS]; switch( wMsg ) { case WM_CREATE: { LOGFONT lf; memset( (void *)&lf, 0, sizeof(LOGFONT) ); // Intialize font info lf.lfWeight = 400; //Normal lf.lfCharSet = ANSI_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = PROOF_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; lf.lfHeight = 14; lf.lfWidth = 0; lf.lfUnderline = 0; lstrcpy ( lf.lfFaceName, TEXT("Courier")); // Get a handle to the courier font hFontCourier = CreateFontIndirect( (void *)& lf ); break; } case WM_DESTROY: DeleteObject((HGDIOBJ)hFontCourier); break; case WM_FMTSTATLINE: { TCHAR *psz; #ifdef RLRES32 CHAR sz[MAXBUFFERSIZE]; #endif cFields = 0; for (psz = (LPTSTR)lParam; *psz; psz++) { cFields++; #ifdef RLRES32 _WCSTOMBS( sz, psz, ACHARSIN( sizeof( sz)), lstrlen( psz) + 1); aiSize[cFields-1] = atoi(sz); #else aiSize[cFields-1] = atoi(psz); #endif while(_istdigit(*psz)) { psz++; } switch(*psz) { case 'i': abIntegers[cFields-1] = TRUE; break; case 's': abIntegers[cFields-1] = FALSE; break; default: cFields = 0; return(FALSE); } } return(TRUE); } case WM_UPDSTATLINE: // intialize status line info, and force it to be painted if (wParam > cFields) { return(FALSE); } if (abIntegers[wParam]) // Is it for an integer field? { #ifdef RLRES32 char sz[MAXBUFFERSIZE] = ""; _itoa((INT)lParam, sz, 10); _MBSTOWCS( aszStatusStrings[ wParam], sz, WCHARSIN( sizeof( sz)), ACHARSIN( lstrlenA( sz)+1)); #else _itoa(lParam, aszStatusStrings[wParam], 10); #endif } else { #ifdef RLWIN32 CopyMemory( aszStatusStrings[ wParam], (LPTSTR)lParam, min( MAXBUFFERSIZE, MEMSIZE( lstrlen( (LPTSTR)lParam) + 1))); aszStatusStrings[ wParam][ MAXBUFFERSIZE - 1] = TEXT('\0'); #else _fstrncpy(aszStatusStrings[wParam], (LPTSTR)lParam, MAXBUFFERSIZE-1); #endif aszStatusStrings[wParam][MAXBUFFERSIZE-1] = 0; } InvalidateRect( hWnd, NULL, TRUE ); break; case WM_PAINT: { RECT r; HFONT hOldFont; HBRUSH hbrOld, hbrFace, hbrHilite, hbrShadow; TEXTMETRIC tm; int iWidth, iHeight; UINT i; /* Obtain a handle to the device context */ memset((void *)&ps, 0x00, sizeof(PAINTSTRUCT)); hDC = BeginPaint(hWnd, &ps); GetTextMetrics(hDC, &tm); GetClientRect( hWnd, &r ); iWidth = r.right - r.left; iHeight = r.bottom - r.top; // Create the brushes for the 3D effect hbrFace = CreateSolidBrush(RGB(0xC0, 0xC0, 0xC0)); hbrHilite = CreateSolidBrush(RGB(0xFF, 0xFF, 0xFF)); hbrShadow = CreateSolidBrush(RGB(0x80, 0x80, 0x80)); // Paint outer 3D effect for raised slab hbrOld = (HBRUSH)SelectObject(hDC, (HGDIOBJ)hbrHilite); PatBlt(hDC, r.left, r.top, iWidth, 1, PATCOPY); PatBlt(hDC, r.left, r.top+1, 1, iHeight-2, PATCOPY); SelectObject(hDC, (HGDIOBJ)hbrShadow); PatBlt(hDC, r.left, r.bottom-1, iWidth, 1, PATCOPY); PatBlt(hDC, r.right-1, r.top+1, 1, iHeight-2, PATCOPY); // Paint surface of slab r.left += 1; r.top += 1; r.right -= 1; r.bottom -= 1; iWidth -= 2; iHeight -= 2; SelectObject(hDC, (HGDIOBJ)hbrFace); PatBlt(hDC, r.left, r.top, iWidth, iHeight, PATCOPY); // Get Courier font hOldFont = (HFONT)SelectObject( hDC, (HGDIOBJ)hFontCourier ); SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0)); // Paint inner 3D effect for tray carved into slab and write text r.left += 9; r.right -= 9; r.top += 3; r.bottom -= 3; iHeight = r.bottom - r.top; for (i = 0; i < cFields; i++) { iWidth = tm.tmMaxCharWidth * aiSize[i]; r.right = r.left + iWidth - 2; SelectObject(hDC, (HGDIOBJ)hbrShadow); PatBlt(hDC, r.left-1, r.top-1, iWidth, 1, PATCOPY); PatBlt(hDC, r.left-1, r.top, 1, iHeight-2, PATCOPY); SelectObject(hDC, (HGDIOBJ)hbrHilite); PatBlt(hDC, r.left-1, r.bottom, iWidth, 1, PATCOPY); PatBlt(hDC, r.left + iWidth-1, r.top, 1, iHeight-2, PATCOPY); DrawText(hDC, aszStatusStrings[i], STRINGSIZE( lstrlen( aszStatusStrings[i])), &r, DT_SINGLELINE); r.left += iWidth + 8; } // Put old brush back and delete the rest SelectObject(hDC, (HGDIOBJ)hbrOld); DeleteObject((HGDIOBJ)hbrFace); DeleteObject((HGDIOBJ)hbrHilite); DeleteObject((HGDIOBJ)hbrShadow); SelectObject(hDC,(HGDIOBJ)hOldFont); EndPaint ( hWnd, (CONST PAINTSTRUCT *)&ps ); break; /* End of WM_PAINT */ } } return( DefWindowProc( hWnd, wMsg, wParam, lParam )); } /** * Function: cwCenter * Centers Dialog boxes in main window. * **/ void cwCenter( HWND hWnd, int top ) { POINT pt; RECT swp; RECT rParent; int iwidth; int iheight; GetWindowRect(hWnd, &swp); GetWindowRect(hMainWnd, &rParent); /* calculate the height and width for MoveWindow */ iwidth = swp.right - swp.left; iheight = swp.bottom - swp.top; /* find the center point */ pt.x = (rParent.right - rParent.left) / 2; pt.y = (rParent.bottom - rParent.top) / 2; /* calculate the new x, y starting point */ pt.x = pt.x - (iwidth / 2); pt.y = pt.y - (iheight / 2); ClientToScreen(hMainWnd,&pt); /* top will adjust the window position, up or down */ if(top) pt.y = pt.y + top; if (pt.x < 0) pt.x=0; else if (pt.x + iwidth > GetSystemMetrics(SM_CXSCREEN)) pt.x = GetSystemMetrics(SM_CXSCREEN)-iwidth; /* move the window */ MoveWindow(hWnd, pt.x, pt.y, iwidth, iheight, FALSE); } /** * Function: szFilterSpecFromSz1Sz2 * Returns a filter spec with the format "%s\0%s\0\0" suitable for * use with the Windows 3.1 standard load dialog box. * * Arguments: * sz, destination buffer * sz1, first string * sz2, second string * * Returns: * result in sz * * Error Codes: * none * * Comments: * Performs no bounds checking. sz is assumed to be large enough to * accomidate the filter string. * * History: * 2/92, Implemented SteveBl */ void szFilterSpecFromSz1Sz2(CHAR *sz,CHAR *sz1, CHAR *sz2) { int i1 = 0; int i2 = 0; while (sz[i1++] = sz1[i2++]); i2 = 0; while (sz[i1++] = sz2[i2++]); sz[i1]=0; } /** * Function: CatSzFilterSpecs * Concatonates two szFilterSpecs (double null terminated strings) * and returns a buffer with the result. * * Arguments: * sz, destination buffer * sz1, first Filter Spec * sz2, second Filter Spec * * Returns: * result in sz * * Error Codes: * none * * Comments: * performs no bounds checking * * History: * 3/92, initial implementation -- SteveBl */ void CatSzFilterSpecs(CHAR *sz,CHAR *sz1,CHAR *sz2) { int i1 = 0; int i2 = 0; while (sz1[i2] || sz1[i2+1]) // looking for double byte { sz[i1++]=sz1[i2++]; } sz[i1++] = '\0'; i2 = 0; while (sz2[i2] || sz2[i2+1]) { sz[i1++]=sz2[i2++]; } sz[i1++] = '\0'; sz[i1++] = '\0'; }