home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / video / vidcap / status.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  9KB  |  335 lines

  1. /**************************************************************************
  2.  *
  3.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4.  *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5.  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6.  *  PURPOSE.
  7.  *
  8.  *  Copyright (C) 1992 - 1997 Microsoft Corporation.  All Rights Reserved.
  9.  *
  10.  **************************************************************************/
  11. /****************************************************************************
  12.  *
  13.  *   status.c: Status bar window
  14.  *
  15.  *   Vidcap32 Source code
  16.  *
  17.  ***************************************************************************/
  18.  
  19. #include <windows.h>
  20. #include <windowsx.h>
  21. //#include <win32.h>
  22. #include <mmsystem.h>
  23. #include "status.h"
  24.  
  25. /* for compiling under win3.0 - we don't have this attribute */
  26. #ifndef COLOR_BTNHIGHLIGHT
  27. #define COLOR_BTNHIGHLIGHT 20
  28. #endif
  29.  
  30. #ifdef _WIN32
  31. typedef WNDPROC LPWNDPROC;
  32. #else
  33. typedef long (FAR PASCAL *LPWNDPROC)();
  34. #endif
  35.  
  36.  
  37.  
  38. // class names for status bar and static text windows
  39. char    szStatusClass[] = "StatusClass";
  40. char    szText[]   = "SText";
  41. int gStatusStdHeight;   // based on font metrics
  42.  
  43. static HANDLE ghFont;
  44. static HBRUSH ghbrHL, ghbrShadow;
  45.  
  46.  
  47. /* Function Prototypes */
  48. LONG FAR PASCAL statusWndProc(HWND hwnd, unsigned msg,
  49.                         UINT wParam, LONG lParam);
  50. LONG FAR PASCAL fnText(HWND, unsigned, UINT, LONG);
  51. static VOID NEAR PASCAL PaintText(HWND hwnd, HDC hdc);
  52.  
  53.  
  54.  
  55.  
  56. /*
  57.  * create the brushes we need
  58.  */
  59. void
  60. statusCreateTools(void)
  61. {
  62.     HDC hdc;
  63.     TEXTMETRIC tm;
  64.     HFONT hfont;
  65.  
  66.     ghbrHL = CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));
  67.     ghbrShadow = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
  68.  
  69.     /* Create the font we'll use for the status bar - use system as default */
  70.     ghFont = CreateFont(12, 0,        // height, width
  71.                 0, 0,            // escapement, orientation
  72.                 FW_NORMAL,        // weight,
  73.                 FALSE, FALSE, FALSE,    // attributes
  74.                 ANSI_CHARSET,        // charset
  75.                 OUT_DEFAULT_PRECIS,    // output precision
  76.                 CLIP_DEFAULT_PRECIS,    // clip precision
  77.                 DEFAULT_QUALITY,    // quality
  78.                 VARIABLE_PITCH | FF_MODERN,
  79.                 "Helv");
  80.  
  81.     if (ghFont == NULL) {
  82.         ghFont = GetStockObject(SYSTEM_FONT);
  83.     }
  84.  
  85.     // find the char size to calc standard status bar height
  86.     hdc = GetDC(NULL);
  87.     hfont = SelectObject(hdc, ghFont);
  88.     GetTextMetrics(hdc, &tm);
  89.     SelectObject(hdc, hfont);
  90.     ReleaseDC(NULL, hdc);
  91.  
  92.     gStatusStdHeight = tm.tmHeight * 3 / 2;
  93.  
  94. }
  95.  
  96. void
  97. statusDeleteTools(void)
  98. {
  99.     DeleteObject(ghbrHL);
  100.     DeleteObject(ghbrShadow);
  101.  
  102.     DeleteObject(ghFont);
  103. }
  104.  
  105.  
  106.  
  107.  
  108. /*--------------------------------------------------------------+
  109. | statusInit - initialize for status window, register the    |
  110. |           Window's class.                    |
  111. |                                |
  112. +--------------------------------------------------------------*/
  113. #pragma alloc_text(INIT_TEXT, statusInit)
  114. BOOL statusInit(HANDLE hInst, HANDLE hPrev)
  115. {
  116.   WNDCLASS  cls;
  117.  
  118.   statusCreateTools();
  119.  
  120.   if (!hPrev){
  121.       cls.hCursor        = LoadCursor(NULL, IDC_ARROW);
  122.       cls.hIcon        = NULL;
  123.       cls.lpszMenuName    = NULL;
  124.       cls.lpszClassName    = szStatusClass;
  125.       cls.hbrBackground     = (HBRUSH) (COLOR_BTNFACE + 1);
  126.       cls.hInstance        = hInst;
  127.       cls.style        = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  128.       cls.lpfnWndProc    = statusWndProc;
  129.       cls.cbClsExtra    = 0;
  130.       cls.cbWndExtra    = 0;
  131.     
  132.       if (!RegisterClass(&cls))
  133.           return FALSE;
  134.  
  135.       cls.hCursor        = LoadCursor(NULL,IDC_ARROW);
  136.       cls.hIcon          = NULL;
  137.       cls.lpszMenuName   = NULL;
  138.       cls.lpszClassName  = (LPSTR)szText;
  139.       cls.hbrBackground  = (HBRUSH) (COLOR_BTNFACE + 1);
  140.       cls.hInstance      = hInst;
  141.       cls.style          = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  142.       cls.lpfnWndProc    = (LPWNDPROC)fnText;
  143.       cls.cbClsExtra     = 0;
  144.       cls.cbWndExtra     = 0;
  145.       if (!RegisterClass(&cls))
  146.         return FALSE;
  147.   }
  148.  
  149.  
  150.   return TRUE;
  151. }
  152.  
  153. /*
  154.  * returns the recommended height for a status bar based on the
  155.  * character dimensions of the font used
  156.  */
  157. int
  158. statusGetHeight(void)
  159. {
  160.     return(gStatusStdHeight);
  161. }
  162.  
  163.  
  164. /*--------------------------------------------------------------+
  165. | statusUpdateStatus - update the status line            |
  166. |                                |
  167. | The argument can either be NULL, a string, or a resource ID    |
  168. | cast to a LPCSTR with MAKEINTRESOURCE.            |
  169. +--------------------------------------------------------------*/
  170. void statusUpdateStatus(HWND hwnd, LPCSTR lpsz)
  171. {
  172.     char    ach[80];
  173.     HWND hwndtext;
  174.  
  175.     if ((lpsz != NULL) && (HIWORD((DWORD) lpsz) == 0)) {
  176.     LoadString(GetWindowInstance(hwnd), LOWORD((DWORD) lpsz), ach, sizeof(ach));
  177.     lpsz = ach;
  178.     }
  179.  
  180.     hwndtext = GetDlgItem(hwnd, 1);
  181.     if (!lpsz || *lpsz == '\0') {
  182.     SetWindowText(hwndtext,"");
  183.     } else {
  184.     SetWindowText(hwndtext, lpsz);
  185.     }
  186. }
  187.  
  188. /*--------------------------------------------------------------+
  189. | statusWndProc - window proc for status window            |
  190. |                                |
  191. +--------------------------------------------------------------*/
  192. LONG FAR PASCAL 
  193. statusWndProc(HWND hwnd, unsigned msg, UINT wParam, LONG lParam)
  194. {
  195.   PAINTSTRUCT    ps;
  196.   HDC        hdc;
  197.   HWND          hwndSText;
  198.  
  199.   switch(msg){
  200.     case WM_CREATE:
  201.     
  202.         /* we need to create the static text control for the status bar */
  203.         hwndSText = CreateWindow(
  204.                             szText,
  205.                             "",
  206.                             WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
  207.                     0, 0, 0, 0,
  208.                             hwnd,
  209.                             (HMENU) 1,  // child id
  210.                             GetWindowInstance(hwnd),
  211.                             NULL);
  212.  
  213.         if (!hwndSText) {
  214.             return -1;
  215.             }
  216.         break;
  217.     
  218.     case WM_DESTROY:
  219.             statusDeleteTools();
  220.         break;
  221.     
  222.     case WM_SIZE:
  223.         {
  224.             RECT rc;
  225.  
  226.             GetClientRect(hwnd, &rc);
  227.  
  228.             MoveWindow(
  229.                 GetDlgItem(hwnd, 1),    // get child window handle
  230.                 2, 1,                   // xy just inside
  231.                 rc.right - 4,
  232.                 rc.bottom - 2,
  233.                 TRUE);
  234.  
  235.         break;
  236.         }
  237.  
  238.     case WM_PAINT:
  239.         hdc = BeginPaint(hwnd, &ps);
  240.  
  241.             // only the background and the child window need painting
  242.  
  243.         EndPaint(hwnd, &ps);
  244.         break;
  245.  
  246.     case WM_SYSCOLORCHANGE:
  247.         statusDeleteTools();
  248.         statusCreateTools();
  249.         break;
  250.  
  251.     case WM_ERASEBKGND:
  252.         break;
  253.  
  254.   }
  255.   return DefWindowProc(hwnd, msg, wParam, lParam);
  256. }
  257.  
  258. /*
  259.  * window proc for static text window
  260.  */
  261. LONG FAR PASCAL 
  262. fnText(HWND hwnd, UINT msg, UINT wParam, LONG lParam )
  263. {
  264.     PAINTSTRUCT ps;
  265.  
  266.     switch (msg) {
  267.     case WM_SETTEXT:
  268.         DefWindowProc(hwnd, msg, wParam, lParam);
  269.         InvalidateRect(hwnd,NULL,FALSE);
  270.         UpdateWindow(hwnd);
  271.         return 0L;
  272.  
  273.     case WM_ERASEBKGND:
  274.         return 0L;
  275.  
  276.     case WM_PAINT:
  277.         BeginPaint(hwnd, &ps);
  278.         PaintText(hwnd, ps.hdc);
  279.         EndPaint(hwnd, &ps);
  280.         return 0L;
  281.         }
  282.  
  283.     return DefWindowProc(hwnd, msg, wParam, lParam);
  284. }
  285.  
  286. /*--------------------------------------------------------------+
  287. | PaintText - paint the shadowed static text field.        |
  288. |                                |
  289. +--------------------------------------------------------------*/
  290. VOID NEAR PASCAL
  291. PaintText(HWND hwnd, HDC hdc)
  292. {
  293.   RECT rc;
  294.   char        ach[128];
  295.   int  len;
  296.   int    dx, dy;
  297.   RECT    rcFill;
  298.   HFONT    hfontOld;
  299.   HBRUSH hbrSave;
  300.  
  301.   GetClientRect(hwnd, &rc);
  302.  
  303.   len = GetWindowText(hwnd,ach,sizeof(ach));
  304.  
  305.   SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
  306.   SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT));
  307.  
  308.   hfontOld = SelectObject(hdc, ghFont);
  309.  
  310.   rcFill.left = rc.left + 1;
  311.   rcFill.right = rc.right - 1;
  312.   rcFill.top = rc.top + 1;
  313.   rcFill.bottom = rc.bottom - 1;
  314.  
  315.   /* move in some and do background and text in one swoosh */
  316.   ExtTextOut(hdc,4,1,ETO_OPAQUE,&rcFill,ach,len,NULL);
  317.  
  318.   dx = rc.right - rc.left;
  319.   dy = rc.bottom - rc.top;
  320.  
  321.   hbrSave = SelectObject(hdc, ghbrShadow);
  322.   PatBlt(hdc, rc.left, rc.top, 1, dy, PATCOPY);
  323.   PatBlt(hdc, rc.left, rc.top, dx, 1, PATCOPY);
  324.  
  325.   SelectObject(hdc, ghbrHL);
  326.   PatBlt(hdc, rc.right-1, rc.top+1, 1, dy-1, PATCOPY);
  327.   PatBlt(hdc, rc.left+1, rc.bottom -1, dx-1, 1,  PATCOPY);
  328.  
  329.   if (hfontOld)
  330.       SelectObject(hdc, hfontOld);
  331.   if (hbrSave)
  332.       SelectObject(hdc, hbrSave);
  333.   return ;
  334. }
  335.