/* **------------------------------------------------------------------------------ ** Module: Disk Cleanup Applet ** File: textout.cpp ** ** Purpose: Print functions ** Notes: ** Mod Log: Created by Jason Cobb (2/97) ** ** Copyright (c)1997 Microsoft Corporation, All Rights Reserved **------------------------------------------------------------------------------ */ /* **------------------------------------------------------------------------------ ** Project include files **------------------------------------------------------------------------------ */ #include "common.h" #include "textout.h" /* * DEFINITIONS ________________________________________________________________ * */ typedef struct { HWND hWnd; LONG style; TCHAR *pszText; // Buffer for text size_t cbMaxText; // Length of text buffer HFONT hf; // Current font HBITMAP bmp; // Off-screen bitmap for NO FLICKER RECT rBmp; // Size of 'bmp' } TextOutInfo; /* * VARIABLES __________________________________________________________________ * */ static HINSTANCE l_hInst = NULL; /* * PROTOTYPES _________________________________________________________________ * */ LRESULT APIENTRY TextOutProc (HWND, UINT, WPARAM, LPARAM); void TextOutPaint (TextOutInfo *, HDC, RECT *); BOOL TextOutMakeBitmap (TextOutInfo *); BOOL TextOutSetText (TextOutInfo *, LPCTSTR); void TextOutRedraw (TextOutInfo *, BOOL = TRUE); /* * ROUTINES ___________________________________________________________________ * */ /* void RegisterTextOutClass (HINSTANCE hInst) { WNDCLASS wc; if (hInst == NULL) return; l_hInst = hInst; wc.style = 0; wc.lpfnWndProc = TextOutProc; wc.cbClsExtra = 0; wc.cbWndExtra = sizeof (void *); wc.hInstance = hInst; wc.hIcon = NULL; wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = szTextOutCLASS; RegisterClass (&wc); } void UnregisterTextOutClass (void) { // Unregister from windows if (l_hInst) UnregisterClass (szTextOutCLASS, l_hInst); l_hInst = NULL; } LRESULT APIENTRY TextOutProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { TextOutInfo *ptoi; PAINTSTRUCT ps; HDC hdc; if (msg == WM_CREATE) { if ((ptoi = (TextOutInfo *)GlobalAlloc (GMEM_FIXED, sizeof(*ptoi))) == 0) { //OutOfMemory(); return -1; } SetWindowLongPtr (hWnd, 0, (LPARAM)ptoi); ptoi->hWnd = hWnd; ptoi->style = ((LPCREATESTRUCT)lp)->style; ptoi->pszText = NULL; ptoi->cbMaxText = 0; ptoi->hf = (HFONT) GetStockObject (DEFAULT_GUI_FONT); ptoi->bmp = NULL; if (!TextOutMakeBitmap (ptoi)) return -1; if (!TextOutSetText (ptoi, ((LPCREATESTRUCT)lp)->lpszName )) return -1; TextOutRedraw (ptoi); } else if ((ptoi = (TextOutInfo *)GetWindowLongPtr (hWnd, 0)) == NULL) { return DefWindowProc (hWnd, msg, wp, lp); } switch (msg) { case WM_DESTROY: if (ptoi->pszText != NULL) GlobalFree (ptoi->pszText); if (ptoi->bmp != NULL) DeleteObject (ptoi->bmp); GlobalFree (ptoi); SetWindowLongPtr (hWnd, 0, 0L); break; case WM_USER: TextOutRedraw (ptoi, FALSE); break; case WM_PAINT: hdc = BeginPaint (hWnd, &ps); TextOutPaint (ptoi, hdc, &ps.rcPaint); EndPaint (hWnd, &ps); return 0; break; case WM_SETTEXT: TextOutSetText (ptoi, (LPCTSTR)lp); TextOutRedraw (ptoi); break; case WM_GETFONT: return (LRESULT)ptoi->hf; break; case WM_SETFONT: if ((ptoi->hf = (HFONT)wp) == NULL) { ptoi->hf = (HFONT) GetStockObject (DEFAULT_GUI_FONT); } if (LOWORD(lp) != 0) { TextOutRedraw (ptoi); } break; case WM_SIZE: TextOutMakeBitmap (ptoi); break; case WM_ERASEBKGND: return (LRESULT)1; break; } return DefWindowProc (hWnd, msg, wp, lp); } void TextOutPaint (TextOutInfo *ptoi, HDC hdcTrg, RECT *pr) { RECT r; HDC hdcSrc; HBITMAP bmpSrc; if (ptoi->bmp == NULL) // No bitmap? return; // No paint. if (pr == NULL) { GetClientRect (ptoi->hWnd, pr = &r); } hdcSrc = CreateCompatibleDC (hdcTrg); bmpSrc = (HBITMAP) SelectObject (hdcSrc, (HGDIOBJ)ptoi->bmp); BitBlt (hdcTrg, pr->left, pr->top, pr->right -pr->left, pr->bottom -pr->top, hdcSrc, pr->left, pr->top, SRCCOPY); SelectObject (hdcSrc, (HGDIOBJ)bmpSrc); DeleteDC (hdcSrc); } BOOL TextOutMakeBitmap (TextOutInfo *ptoi) { HDC hdc, hdcMem; RECT r; GetClientRect (ptoi->hWnd, &r); if (ptoi->bmp != NULL) { if ( ((ptoi->rBmp.right - ptoi->rBmp.left) > (r.right - r.left)) || ((ptoi->rBmp.bottom - ptoi->rBmp.top) > (r.bottom - r.top)) ) { DeleteObject (ptoi->bmp); ptoi->bmp = NULL; } } if (ptoi->bmp == NULL) { hdc = GetDC (ptoi->hWnd); hdcMem = CreateCompatibleDC (hdc); ptoi->bmp = CreateCompatibleBitmap (hdc, r.right, r.bottom); ptoi->rBmp = r; DeleteDC (hdcMem); ReleaseDC (ptoi->hWnd, hdc); } if (ptoi->bmp == NULL) { //OutOfMemory(); return FALSE; } return TRUE; } BOOL TextOutSetText (TextOutInfo *ptoi, LPCTSTR psz) { size_t cb; if (psz == NULL) { if (ptoi->pszText != NULL) ptoi->pszText[0] = 0; return TRUE; } cb = 1+ lstrlen(psz); if (cb > (ptoi->cbMaxText)) { if (ptoi->pszText != NULL) { GlobalFree (ptoi->pszText); ptoi->pszText = NULL; } if ((ptoi->pszText = (TCHAR *)GlobalAlloc (GMEM_FIXED, cb * sizeof( TCHAR ))) == NULL) { ptoi->cbMaxText = 0; //OutOfMemory(); return FALSE; } ptoi->cbMaxText = cb; } StrCpy(ptoi->pszText, psz); return TRUE; } void TextOutRedraw (TextOutInfo *ptoi, BOOL fRepaint) { HBRUSH hbr; HDC hdc, hdcMem; HBITMAP bmpOld; RECT r; WPARAM wp; LPARAM lp; HFONT hfOld = NULL; if (ptoi->bmp == NULL) return; hdc = GetDC (ptoi->hWnd); hdcMem = CreateCompatibleDC (hdc); bmpOld = (HBITMAP) SelectObject (hdcMem, (HGDIOBJ)ptoi->bmp); wp = (WPARAM)hdcMem; lp = (LPARAM)ptoi->hWnd; hbr = (HBRUSH)SendMessage (GetParent(ptoi->hWnd), WM_CTLCOLORSTATIC, wp,lp); if (hbr == NULL) { SetTextColor (hdc, GetSysColor (COLOR_BTNTEXT)); SetBkColor (hdc, GetSysColor (COLOR_BTNFACE)); hbr = CreateSolidBrush (GetSysColor (COLOR_BTNFACE)); } GetClientRect (ptoi->hWnd, &r); FillRect (hdcMem, &r, hbr); if (ptoi->pszText != NULL) { if (ptoi->hf != NULL) hfOld = (HFONT) SelectObject (hdcMem, ptoi->hf); UINT fDrawFlags = DT_EXPANDTABS | DT_WORDBREAK; if (ptoi->style & SS_RIGHT) fDrawFlags |= DT_RIGHT; else if (ptoi->style & SS_CENTER) fDrawFlags |= DT_CENTER; else fDrawFlags |= DT_LEFT; DrawText ( hdcMem, ptoi->pszText, lstrlen(ptoi->pszText), &r, fDrawFlags ); if (hfOld != NULL) SelectObject (hdcMem, hfOld); } DeleteObject (hbr); SelectObject (hdcMem, bmpOld); DeleteDC (hdcMem); ReleaseDC (ptoi->hWnd, hdc); if (fRepaint) { InvalidateRect (ptoi->hWnd, NULL, TRUE); UpdateWindow (ptoi->hWnd); } } */