|
|
/**************************************************************************
* * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR * PURPOSE. * * Copyright (c) 1992 - 1995 Microsoft Corporation. All Rights Reserved. * **************************************************************************/ /****************************************************************************
* * status.c: Status bar window * * Vidcap32 Source code * ***************************************************************************/
#include <windows.h>
#include <windowsx.h>
//#include <win32.h>
#include <mmsystem.h>
#include "status.h"
/* for compiling under win3.0 - we don't have this attribute */ #ifndef COLOR_BTNHIGHLIGHT
#define COLOR_BTNHIGHLIGHT 20
#endif
#ifdef _WIN32
typedef WNDPROC LPWNDPROC; #else
typedef long (FAR PASCAL *LPWNDPROC)(); #endif
// class names for status bar and static text windows
TCHAR szStatusClass[] = "StatusClass"; TCHAR szText[] = "SText"; int gStatusStdHeight; // based on font metrics
static HBRUSH ghbrBackground; static HANDLE ghFont; static HBRUSH ghbrHL, ghbrShadow;
/* Function Prototypes */ LRESULT FAR PASCAL statusWndProc(HWND hwnd, unsigned msg, WPARAM wParam, LPARAM lParam); LRESULT FAR PASCAL fnText(HWND, unsigned, WPARAM, LPARAM); static VOID NEAR PASCAL PaintText(HWND hwnd, HDC hdc);
/*
* create the brushes we need */ void statusCreateTools(void) { HDC hdc; TEXTMETRIC tm; HFONT hfont;
ghbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); ghbrHL = CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT)); ghbrShadow = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
/* Create the font we'll use for the status bar - use system as default */ ghFont = CreateFont(12, 0, // height, width
0, 0, // escapement, orientation
FW_NORMAL, // weight,
FALSE, FALSE, FALSE, // attributes
ANSI_CHARSET, // charset
OUT_DEFAULT_PRECIS, // output precision
CLIP_DEFAULT_PRECIS, // clip precision
DEFAULT_QUALITY, // quality
VARIABLE_PITCH | FF_MODERN, "Helv");
if (ghFont == NULL) { ghFont = GetStockObject(SYSTEM_FONT); }
// find the char size to calc standard status bar height
hdc = GetDC(NULL); hfont = SelectObject(hdc, ghFont); GetTextMetrics(hdc, &tm); SelectObject(hdc, hfont); ReleaseDC(NULL, hdc);
gStatusStdHeight = tm.tmHeight * 3 / 2;
}
void statusDeleteTools(void) { DeleteObject(ghbrBackground); DeleteObject(ghbrHL); DeleteObject(ghbrShadow);
DeleteObject(ghFont); }
/*--------------------------------------------------------------+
| statusInit - initialize for status window, register the | | Window's class. | | | +--------------------------------------------------------------*/ #pragma alloc_text(INIT_TEXT, statusInit)
BOOL statusInit(HANDLE hInst, HANDLE hPrev) { WNDCLASS cls;
statusCreateTools();
if (!hPrev){ cls.hCursor = LoadCursor(NULL, IDC_ARROW); cls.hIcon = NULL; cls.lpszMenuName = NULL; cls.lpszClassName = szStatusClass; cls.hbrBackground = ghbrBackground; cls.hInstance = hInst; cls.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; cls.lpfnWndProc = statusWndProc; cls.cbClsExtra = 0; cls.cbWndExtra = 0; if (!RegisterClass(&cls)) return FALSE;
cls.hCursor = LoadCursor(NULL,IDC_ARROW); cls.hIcon = NULL; cls.lpszMenuName = NULL; cls.lpszClassName = (LPSTR)szText; cls.hbrBackground = ghbrBackground; cls.hInstance = hInst; cls.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; cls.lpfnWndProc = (LPWNDPROC)fnText; cls.cbClsExtra = 0; cls.cbWndExtra = 0; if (!RegisterClass(&cls)) return FALSE; }
return TRUE; }
/*
* returns the recommended height for a status bar based on the * character dimensions of the font used */ int statusGetHeight(void) { return(gStatusStdHeight); }
/*--------------------------------------------------------------+
| statusUpdateStatus - update the status line | | | | The argument can either be NULL, a string, or a resource ID | | cast to a LPCSTR with MAKEINTRESOURCE. | +--------------------------------------------------------------*/ void statusUpdateStatus(HWND hwnd, LPCTSTR lpsz) { TCHAR ach[80]; HWND hwndtext;
if ((lpsz != NULL) && (HIWORD((DWORD) (DWORD_PTR) lpsz) == 0)) { LoadString(GetWindowInstance(hwnd), LOWORD((DWORD) (DWORD_PTR) lpsz), ach, sizeof(ach)); lpsz = ach; }
hwndtext = GetDlgItem(hwnd, 1); if (!lpsz || *lpsz == '\0') { SetWindowText(hwndtext,""); } else { SetWindowText(hwndtext, lpsz); } }
/*--------------------------------------------------------------+
| statusWndProc - window proc for status window | | | +--------------------------------------------------------------*/ LRESULT FAR PASCAL statusWndProc(HWND hwnd, unsigned msg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; HWND hwndSText;
switch(msg){ case WM_CREATE: /* we need to create the static text control for the status bar */ hwndSText = CreateWindow( szText, "", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 0, 0, 0, 0, hwnd, (HMENU) 1, // child id
GetWindowInstance(hwnd), NULL);
if (!hwndSText) { return -1; } break; case WM_DESTROY: statusDeleteTools(); break; case WM_SIZE: { RECT rc;
GetClientRect(hwnd, &rc);
MoveWindow( GetDlgItem(hwnd, 1), // get child window handle
2, 1, // xy just inside
rc.right - 4, rc.bottom - 2, TRUE);
break; }
case WM_PAINT: hdc = BeginPaint(hwnd, &ps);
// only the background and the child window need painting
EndPaint(hwnd, &ps); break;
case WM_SYSCOLORCHANGE: statusDeleteTools(); statusCreateTools(); #ifdef _WIN32
SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG_PTR) ghbrBackground); #else
SetClassWord(hwnd, GCW_HBRBACKGROUND, (WORD) ghbrBackground); #endif
break;
case WM_ERASEBKGND: break;
} return DefWindowProc(hwnd, msg, wParam, lParam); }
/*
* window proc for static text window */ LRESULT FAR PASCAL fnText(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT ps;
switch (msg) { case WM_SETTEXT: DefWindowProc(hwnd, msg, wParam, lParam); InvalidateRect(hwnd,NULL,FALSE); UpdateWindow(hwnd); return 0L;
case WM_ERASEBKGND: return 0L;
case WM_PAINT: BeginPaint(hwnd, &ps); PaintText(hwnd, ps.hdc); EndPaint(hwnd, &ps); return 0L; }
return DefWindowProc(hwnd, msg, wParam, lParam); }
/*--------------------------------------------------------------+
| PaintText - paint the shadowed static text field. | | | +--------------------------------------------------------------*/ VOID NEAR PASCAL PaintText(HWND hwnd, HDC hdc) { RECT rc; TCHAR ach[128]; int len; int dx, dy; RECT rcFill; HFONT hfontOld; HBRUSH hbrSave;
GetClientRect(hwnd, &rc);
len = GetWindowText(hwnd,ach,sizeof(ach));
SetBkColor(hdc, GetSysColor(COLOR_BTNFACE)); SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT));
hfontOld = SelectObject(hdc, ghFont);
rcFill.left = rc.left + 1; rcFill.right = rc.right - 1; rcFill.top = rc.top + 1; rcFill.bottom = rc.bottom - 1;
/* move in some and do background and text in one swoosh */ ExtTextOut(hdc,4,1,ETO_OPAQUE,&rcFill,ach,len,NULL);
dx = rc.right - rc.left; dy = rc.bottom - rc.top;
hbrSave = SelectObject(hdc, ghbrShadow); PatBlt(hdc, rc.left, rc.top, 1, dy, PATCOPY); PatBlt(hdc, rc.left, rc.top, dx, 1, PATCOPY);
SelectObject(hdc, ghbrHL); PatBlt(hdc, rc.right-1, rc.top+1, 1, dy-1, PATCOPY); PatBlt(hdc, rc.left+1, rc.bottom -1, dx-1, 1, PATCOPY);
if (hfontOld) SelectObject(hdc, hfontOld); if (hbrSave) SelectObject(hdc, hbrSave); return ; }
|