textout.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 9k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /*
  2. **------------------------------------------------------------------------------
  3. ** Module:  Disk Cleanup Applet
  4. ** File:    textout.cpp
  5. **
  6. ** Purpose: Print functions
  7. ** Notes:   
  8. ** Mod Log: Created by Jason Cobb (2/97)
  9. **
  10. ** Copyright (c)1997 Microsoft Corporation, All Rights Reserved
  11. **------------------------------------------------------------------------------
  12. */
  13. /*
  14. **------------------------------------------------------------------------------
  15. ** Project include files
  16. **------------------------------------------------------------------------------
  17. */
  18. #include "common.h"
  19. #include "textout.h"
  20. /*
  21.  * DEFINITIONS ________________________________________________________________
  22.  *
  23.  */
  24.          typedef struct
  25.             {
  26.             HWND     hWnd;
  27.             LONG     style;
  28.             TCHAR    *pszText;    // Buffer for text
  29.             size_t   cbMaxText; // Length of text buffer
  30.             HFONT    hf;       // Current font
  31.             HBITMAP  bmp;       // Off-screen bitmap for NO FLICKER
  32.             RECT     rBmp;       // Size of 'bmp'
  33.             } TextOutInfo;
  34. /*
  35.  * VARIABLES __________________________________________________________________
  36.  *
  37.  */
  38.          static HINSTANCE     l_hInst = NULL;
  39. /*
  40.  * PROTOTYPES _________________________________________________________________
  41.  *
  42.  */
  43.          LRESULT APIENTRY TextOutProc         (HWND, UINT, WPARAM, LPARAM);
  44.          void             TextOutPaint        (TextOutInfo *, HDC, RECT *);
  45.          BOOL             TextOutMakeBitmap   (TextOutInfo *);
  46.          BOOL             TextOutSetText      (TextOutInfo *, LPCTSTR);
  47.          void             TextOutRedraw       (TextOutInfo *, BOOL = TRUE);
  48. /*
  49.  * ROUTINES ___________________________________________________________________
  50.  *
  51.  */
  52. /*
  53. void RegisterTextOutClass (HINSTANCE hInst)
  54. {
  55.    WNDCLASS  wc;
  56.    if (hInst == NULL)
  57.       return;
  58.    l_hInst = hInst;
  59.    
  60.    wc.style = 0;
  61.    wc.lpfnWndProc    = TextOutProc;
  62.    wc.cbClsExtra     = 0;
  63.    wc.cbWndExtra     = sizeof (void *);
  64.    wc.hInstance      = hInst;
  65.    wc.hIcon          = NULL;
  66.    wc.hCursor        = LoadCursor (NULL, IDC_ARROW);
  67.    wc.hbrBackground  = NULL;
  68.    wc.lpszMenuName   = NULL;
  69.    wc.lpszClassName  = szTextOutCLASS;
  70.    RegisterClass (&wc);
  71. }
  72. void UnregisterTextOutClass (void)
  73. {
  74.    // Unregister from windows
  75.    if (l_hInst)
  76.       UnregisterClass (szTextOutCLASS, l_hInst);
  77.    l_hInst = NULL;
  78. }
  79. LRESULT APIENTRY TextOutProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
  80. {
  81.    TextOutInfo   *ptoi;
  82.    PAINTSTRUCT    ps;
  83.    HDC            hdc;
  84.    if (msg == WM_CREATE)
  85.       {
  86.       if ((ptoi = (TextOutInfo *)GlobalAlloc (GMEM_FIXED, sizeof(*ptoi))) == 0)
  87.          {
  88.          //OutOfMemory();
  89.          return -1;
  90.          }
  91.       SetWindowLongPtr (hWnd, 0, (LPARAM)ptoi);
  92.       ptoi->hWnd        = hWnd;
  93.       ptoi->style       = ((LPCREATESTRUCT)lp)->style;
  94.       ptoi->pszText     = NULL;
  95.       ptoi->cbMaxText   = 0;
  96.       ptoi->hf          = (HFONT) GetStockObject (DEFAULT_GUI_FONT);
  97.       ptoi->bmp         = NULL;
  98.       if (!TextOutMakeBitmap (ptoi))
  99.          return -1;
  100.       if (!TextOutSetText (ptoi, ((LPCREATESTRUCT)lp)->lpszName ))
  101.          return -1;
  102.       TextOutRedraw (ptoi);
  103.       }
  104.    else if ((ptoi = (TextOutInfo *)GetWindowLongPtr (hWnd, 0)) == NULL)
  105.       {
  106.       return DefWindowProc (hWnd, msg, wp, lp);
  107.       }
  108.    switch (msg)
  109.       {
  110.       case WM_DESTROY:  if (ptoi->pszText != NULL)
  111.                            GlobalFree (ptoi->pszText);
  112.                         if (ptoi->bmp != NULL)
  113.                            DeleteObject (ptoi->bmp);
  114.                         GlobalFree (ptoi);
  115.                         SetWindowLongPtr (hWnd, 0, 0L);
  116.                        break;
  117.       case WM_USER:     TextOutRedraw (ptoi, FALSE);
  118.                        break;
  119.       case WM_PAINT:    hdc = BeginPaint (hWnd, &ps);
  120.                         TextOutPaint (ptoi, hdc, &ps.rcPaint);
  121.                         EndPaint (hWnd, &ps);
  122.                         return 0;
  123.                        break;
  124.       case WM_SETTEXT:  TextOutSetText (ptoi, (LPCTSTR)lp);
  125.                         TextOutRedraw (ptoi);
  126.                        break;
  127.       case WM_GETFONT:  return (LRESULT)ptoi->hf;
  128.                        break;
  129.       case WM_SETFONT:  if ((ptoi->hf = (HFONT)wp) == NULL)
  130.                            {
  131.                            ptoi->hf = (HFONT) GetStockObject (DEFAULT_GUI_FONT);
  132.                            }
  133.                         if (LOWORD(lp) != 0)
  134.                            {
  135.                            TextOutRedraw (ptoi);
  136.                            }
  137.                        break;
  138.       case WM_SIZE:     TextOutMakeBitmap (ptoi);
  139.                        break;
  140.       case WM_ERASEBKGND:
  141.                         return (LRESULT)1;
  142.                        break;
  143.       }
  144.    return DefWindowProc (hWnd, msg, wp, lp);
  145. }
  146. void TextOutPaint (TextOutInfo *ptoi, HDC hdcTrg, RECT *pr)
  147. {
  148.    RECT     r;
  149.    HDC      hdcSrc;
  150.    HBITMAP  bmpSrc;
  151.    if (ptoi->bmp == NULL) // No bitmap?
  152.       return; // No paint.
  153.    if (pr == NULL)
  154.       {
  155.       GetClientRect (ptoi->hWnd, pr = &r);
  156.       }
  157.    hdcSrc = CreateCompatibleDC (hdcTrg);
  158.    bmpSrc = (HBITMAP) SelectObject (hdcSrc, (HGDIOBJ)ptoi->bmp);
  159.    BitBlt (hdcTrg, pr->left, pr->top, pr->right -pr->left, pr->bottom -pr->top,
  160.            hdcSrc, pr->left, pr->top, SRCCOPY);
  161.    SelectObject (hdcSrc, (HGDIOBJ)bmpSrc);
  162.    DeleteDC (hdcSrc);
  163. }
  164. BOOL TextOutMakeBitmap (TextOutInfo *ptoi)
  165. {
  166.    HDC      hdc, hdcMem;
  167.    RECT     r;
  168.    GetClientRect (ptoi->hWnd, &r);
  169.    if (ptoi->bmp != NULL)
  170.       {
  171.       if ( ((ptoi->rBmp.right - ptoi->rBmp.left) > (r.right - r.left)) ||
  172.            ((ptoi->rBmp.bottom - ptoi->rBmp.top) > (r.bottom - r.top)) )
  173.          {
  174.          DeleteObject (ptoi->bmp);
  175.          ptoi->bmp = NULL;
  176.          }
  177.       }
  178.    if (ptoi->bmp == NULL)
  179.       {
  180.       hdc = GetDC (ptoi->hWnd);
  181.       hdcMem = CreateCompatibleDC (hdc);
  182.       ptoi->bmp = CreateCompatibleBitmap (hdc, r.right, r.bottom);
  183.       ptoi->rBmp = r;
  184.       DeleteDC (hdcMem);
  185.       ReleaseDC (ptoi->hWnd, hdc);
  186.       }
  187.    if (ptoi->bmp == NULL)
  188.       {
  189.       //OutOfMemory();
  190.       return FALSE;
  191.       }
  192.    return TRUE;
  193. }
  194. BOOL TextOutSetText (TextOutInfo *ptoi, LPCTSTR psz)
  195. {
  196.    size_t  cb;
  197.    if (psz == NULL)
  198.       {
  199.       if (ptoi->pszText != NULL)
  200.          ptoi->pszText[0] = 0;
  201.       return TRUE;
  202.       }
  203.    cb = 1+ lstrlen(psz);
  204.    if (cb > (ptoi->cbMaxText))
  205.       {
  206.       if (ptoi->pszText != NULL)
  207.          {
  208.          GlobalFree (ptoi->pszText);
  209.          ptoi->pszText = NULL;
  210.          }
  211.       if ((ptoi->pszText = (TCHAR *)GlobalAlloc (GMEM_FIXED, cb * sizeof( TCHAR ))) == NULL)
  212.          {
  213.          ptoi->cbMaxText = 0;
  214.          //OutOfMemory();
  215.          return FALSE;
  216.          }
  217.       ptoi->cbMaxText = cb;
  218.       }
  219.    StrCpy(ptoi->pszText, psz);
  220.    return TRUE;
  221. }
  222. void TextOutRedraw (TextOutInfo *ptoi, BOOL fRepaint)
  223. {
  224.    HBRUSH   hbr;
  225.    HDC      hdc, hdcMem;
  226.    HBITMAP  bmpOld;
  227.    RECT     r;
  228.    WPARAM   wp;
  229.    LPARAM   lp;
  230.    HFONT    hfOld = NULL;
  231.    if (ptoi->bmp == NULL)
  232.       return;
  233.    hdc = GetDC (ptoi->hWnd);
  234.    hdcMem = CreateCompatibleDC (hdc);
  235.    bmpOld = (HBITMAP) SelectObject (hdcMem, (HGDIOBJ)ptoi->bmp);
  236.    wp = (WPARAM)hdcMem;
  237.    lp = (LPARAM)ptoi->hWnd;
  238.    hbr = (HBRUSH)SendMessage (GetParent(ptoi->hWnd), WM_CTLCOLORSTATIC, wp,lp);
  239.    if (hbr == NULL)
  240.       {
  241.       SetTextColor (hdc, GetSysColor (COLOR_BTNTEXT));
  242.       SetBkColor (hdc, GetSysColor (COLOR_BTNFACE));
  243.       hbr = CreateSolidBrush (GetSysColor (COLOR_BTNFACE));
  244.       }
  245.    GetClientRect (ptoi->hWnd, &r);
  246.    FillRect (hdcMem, &r, hbr);
  247.    if (ptoi->pszText != NULL)
  248.       {
  249.       if (ptoi->hf != NULL)
  250.          hfOld = (HFONT) SelectObject (hdcMem, ptoi->hf);
  251.       UINT fDrawFlags = DT_EXPANDTABS |  DT_WORDBREAK;
  252.       if (ptoi->style & SS_RIGHT)
  253.          fDrawFlags |= DT_RIGHT;
  254.       else if (ptoi->style & SS_CENTER)
  255.          fDrawFlags |= DT_CENTER;
  256.       else
  257.          fDrawFlags |= DT_LEFT;
  258.       DrawText (  hdcMem,
  259.                   ptoi->pszText,
  260.                   lstrlen(ptoi->pszText),
  261.                   &r,
  262.                   fDrawFlags ); 
  263.        
  264.       if (hfOld != NULL)
  265.          SelectObject (hdcMem, hfOld);
  266.       }
  267.    DeleteObject (hbr);
  268.    SelectObject (hdcMem, bmpOld);
  269.    DeleteDC (hdcMem);
  270.    ReleaseDC (ptoi->hWnd, hdc);
  271.    if (fRepaint)
  272.       {
  273.       InvalidateRect (ptoi->hWnd, NULL, TRUE);
  274.       UpdateWindow (ptoi->hWnd);
  275.       }
  276. }
  277. */