windows-nt/Source/XPSP1/NT/sdktools/setedit/status.c
2020-09-26 16:20:57 +08:00

298 lines
8.1 KiB
C

#include "setedit.h"
#include "status.h" // External declarations for this file
#include <stdio.h> // for sprintf.
#include <stdarg.h> // For ANSI variable args. Dont use UNIX <varargs.h>
#include "perfmops.h" // for SmallFileSizeString
#include "utils.h"
//================================//
// Options for PaintStatusBar //
//================================//
#define PaintText 1
#define PaintIcons 2
#define PaintBoundary 4
#define PaintAll (PaintText + PaintIcons + PaintBoundary)
//==========================================================================//
// Constants //
//==========================================================================//
#define szStatusClass TEXT("PerfmonStatusClass")
#define dwStatusClassStyle (CS_HREDRAW | CS_VREDRAW | CS_OWNDC)
#define iStatusClassExtra (0)
#define iStatusWindowExtra (0)
#define dwStatusWindowStyle (WS_CHILD | WS_VISIBLE)
//==========================================================================//
// Local Data //
//==========================================================================//
HDC hStatusDC ; // for OWN_DC
int yStatusHeight ;
int szStatusLineLen ; // no. of char. in szStatusLine
TCHAR szStatusLine [MessageLen+ResourceStringLen] ;
// TCHAR szCurrentActivity [ResourceStringLen] ;
// TCHAR szStatusFormat [ResourceStringLen] ;
TCHAR szStatusFormat2 [ResourceStringLen] ;
//==========================================================================//
// Macros //
//==========================================================================//
#define StatusTopMargin() (2)
#define StatusLeftMargin() (2)
//==========================================================================//
// Local Functions //
//==========================================================================//
//==========================================================================//
// Message Handlers //
//==========================================================================//
void static OnCreate (HWND hWnd)
/*
Effect: Perform any actions needed when a status window is created.
In particular, set the instance data to initial values,
determine the size and placement of the various elements
of the status display.
Called By: StatusWndProc only, in response to a WM_CREATE message.
*/
{ // OnCreate
HDC hDC ;
hDC = hStatusDC = GetDC (hWnd) ;
SelectFont (hDC, hFontScales) ;
SetBkColor (hDC, ColorBtnFace) ;
SetTextAlign (hDC, TA_LEFT) ;
SetBkMode (hDC, OPAQUE) ;
yStatusHeight = 2 * StatusTopMargin () +
FontHeight (hDC, TRUE) +
2 * ThreeDPad ;
// StringLoad (IDS_CURRENTACTIVITY, szCurrentActivity) ;
// StringLoad (IDS_STATUSFORMAT, szStatusFormat) ;
StringLoad (IDS_STATUSFORMAT2, szStatusFormat2) ;
StatusLineReady (hWnd) ;
} // OnCreate
void static OnDestroy (HWND hWnd)
{
ReleaseDC (hWnd, hStatusDC) ;
} // OnDestroy
void static PaintStatusBar (HWND hWnd, HDC hDC, int PaintOptions)
/*
Effect: Paint the invalid surface of hWnd. Draw each label, each
recessed value box, and each value.
Called By: StatusWndProc only, in response to a WM_PAINT message.
*/
{
RECT rectClient ;
if (bPerfmonIconic) {
// no need to draw anything if iconic
return ;
}
GetClientRect (hWnd, &rectClient) ;
RectContract (&rectClient, StatusTopMargin (), StatusLeftMargin ()) ;
if (PaintOptions == PaintAll) {
ThreeDConcave1 (hDC,
rectClient.left, rectClient.top,
rectClient.right, rectClient.bottom) ;
}
rectClient.left += StatusLeftMargin () ;
if (PaintOptions & PaintText) {
rectClient.left += 1 ;
rectClient.top += 1 ;
rectClient.right -= 1 ;
rectClient.bottom -= 1 ;
ExtTextOut (hDC, rectClient.left, rectClient.top, ETO_CLIPPED | ETO_OPAQUE,
&rectClient, szStatusLine, szStatusLineLen, NULL) ;
}
} // PaintStatusBar
LRESULT
APIENTRY
StatusWndProc (
HWND hWnd,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{ // StatusWndProc
BOOL bCallDefProc ;
LRESULT lReturnValue ;
HDC hDC ;
PAINTSTRUCT ps ;
bCallDefProc = FALSE ;
lReturnValue = 0L ;
switch (wMsg) { // switch
case WM_PAINT:
hDC = BeginPaint (hWnd, &ps) ;
PaintStatusBar (hWnd, hDC, PaintAll) ;
EndPaint (hWnd, &ps) ;
break ;
case WM_CREATE:
OnCreate (hWnd) ;
break ;
case WM_DESTROY:
OnDestroy (hWnd) ;
break ;
default:
bCallDefProc = TRUE ;
} // switch
if (bCallDefProc)
lReturnValue = DefWindowProc (hWnd, wMsg, wParam, lParam) ;
return (lReturnValue);
} // StatusWndProc
int StatusHeight (HWND hWnd)
/*
Effect: A status window has a preferred height, based on the font
used in its display. Return the preferred height, determined
when the window was created.
Assert: OnCreate has already been called, and it set
StatusData.yHeight.
*/
{
return (yStatusHeight) ;
}
HWND CreatePMStatusWindow (HWND hWnd)
{
return (CreateWindow (szStatusClass, // class
NULL, // caption
dwStatusWindowStyle, // window style
0, 0, // position
0, 0, // size
hWnd, // parent window
NULL, // menu
hInstance, // program instance
NULL)) ; // user-supplied data
} // CreateStatusWindow
BOOL StatusInitializeApplication (void)
/*
Called By: InitializeApplication only
*/
{
WNDCLASS wc ;
wc.style = dwStatusClassStyle ;
wc.lpfnWndProc = StatusWndProc ;
wc.hInstance = hInstance ;
wc.cbClsExtra = iStatusClassExtra ;
wc.cbWndExtra = iStatusWindowExtra ;
wc.hIcon = NULL ;
wc.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wc.hbrBackground = hbLightGray ;
wc.lpszMenuName = NULL ;
wc.lpszClassName = szStatusClass ;
return (RegisterClass (&wc)) ;
}
BOOL _cdecl StatusLine (HWND hWnd,
WORD wStringID, ...)
{
TCHAR szFormat [MessageLen] ;
va_list vaList ;
if (wStringID == 0) {
return (TRUE) ;
}
strclr (szStatusLine) ;
if (LoadString (hInstance, wStringID, szFormat, MessageLen)) {
va_start (vaList, wStringID) ;
wvsprintf (szStatusLine, szFormat, vaList) ;
va_end (vaList) ;
dwCurrentMenuID = MenuIDToHelpID (wStringID) ;
szStatusLineLen = lstrlen (szStatusLine) ;
} else {
dwCurrentMenuID = 0 ;
szStatusLineLen = 0 ;
}
PaintStatusBar (hWndStatus, hStatusDC, PaintText + PaintIcons) ;
return (TRUE) ;
} // StatusLine
void StatusLineReady (HWND hWnd)
{
LPTSTR pFileName = NULL ;
pFileName = pChartFileName ;
if (pFileName) {
TSPRINTF (szStatusLine, szStatusFormat2, pFileName) ;
} else {
szStatusLine[0] = TEXT('\0') ;
}
szStatusLineLen = lstrlen (szStatusLine) ;
PaintStatusBar (hWndStatus, hStatusDC, PaintText + PaintIcons) ;
}
void StatusUpdateIcons (HWND hWndStatus)
{
PaintStatusBar (hWndStatus, hStatusDC, PaintIcons) ;
}