Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

571 lines
12 KiB

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1995 **/
/**********************************************************************/
/*
status.c
This file contains routines for managing the status bar.
*/
#include "gopherp.h"
#pragma hdrstop
//
// Private constants.
//
#define MAX_STATUS_TEXT 128 // characters
//
// Private globals.
//
LONG _tmHeight;
LONG _tmAveCharWidth;
DWORD _dyStatus;
HWND _hwndStatus;
BOOL _fEnabled;
HFONT _hfont;
CHAR * _pszStatusClass = "ApplibStatusClass";
//
// Private prototypes.
//
LRESULT
CALLBACK
Statusp_WndProc(
HWND hwnd,
UINT nMessage,
WPARAM wParam,
LPARAM lParam
);
VOID
Statusp_OnPaint(
HWND hwnd
);
VOID
Statusp_OnSetText(
HWND hwnd,
const VOID * pszText
);
//
// Public functions.
//
/*******************************************************************
NAME: Status_Create
SYNOPSIS: Creates the status bar.
ENTRY: hwnd - Parent window handle.
fFlag - Enable/disable flag.
RETURNS: BOOL - TRUE if successful, FALSE otherwise.
********************************************************************/
BOOL
Status_Create(
HWND hwndParent,
BOOL fFlag
)
{
WNDCLASSA WndClass;
TEXTMETRICA tm;
HDC hdc;
HFONT hfontOld;
//
// Initialize & register the Status Bar Class.
//
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = (WNDPROC)Statusp_WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = _hInst;
WndClass.hIcon = NULL;
WndClass.hCursor = LoadCursor( NULL, (LPSTR)IDC_ARROW );
WndClass.hbrBackground = (HBRUSH)( COLOR_BTNFACE + 1 );
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = _pszStatusClass;
if( !RegisterClass( &WndClass ) )
{
return FALSE;
}
//
// Create the status window.
//
_fEnabled = fFlag;
_hwndStatus = CreateWindow( _pszStatusClass,
"",
WS_CHILD,
0,
0,
0,
0,
hwndParent,
(HMENU)1,
_hInst,
NULL );
if( _hwndStatus == NULL )
{
return FALSE;
}
//
// Create the font. If we cannot create our desired font,
// we'll just use the system default font.
//
_hfont = CreateFont( -10,
0,
0,
0,
FW_NORMAL,
FALSE,
FALSE,
FALSE,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE,
"MS Sans Serif" );
//
// Determine the dimensions.
//
hdc = GetDC( _hwndStatus );
if( _hfont != NULL )
{
hfontOld = SelectFont( hdc, _hfont );
}
GetTextMetrics( hdc, &tm );
if( _hfont != NULL )
{
SelectFont( hdc, hfontOld );
}
ReleaseDC( _hwndStatus, hdc );
_tmHeight = tm.tmHeight;
_tmAveCharWidth = tm.tmAveCharWidth;
_dyStatus = ( _tmHeight * 3 ) / 2 + 1;
//
// Display it.
//
ShowWindow( _hwndStatus, _fEnabled ? SW_SHOW : SW_HIDE );
return TRUE;
} // Status_Create
/*******************************************************************
NAME: Status_SetText
SYNOPSIS: Sets the text associated with the status bar.
ENTRY: msgid - The new status text. If zero, then clear
then status window.
RETURNS: BOOL - TRUE if successful, FALSE otherwise.
********************************************************************/
BOOL
Status_SetText(
MSGID msgid
)
{
const CHAR * pszText = "";
//
// Find the string. A msgid of 0 means "clear the status bar".
//
if( msgid != 0 )
{
pszText = StaticLoadString( (UINT)msgid );
if( pszText == NULL )
{
return FALSE;
}
}
//
// Set it.
//
SetWindowText( _hwndStatus, pszText );
return TRUE;
} // Status_SetText
/*******************************************************************
NAME: Status_QueryHeightInPixels
SYNOPSIS: Returns the height (in pixels) of the status bar.
RETURNS: DWORD - The height of the status bar.
********************************************************************/
DWORD
Status_QueryHeightInPixels(
VOID
)
{
return _fEnabled ? _dyStatus : 0;
} // Status_QueryHeightInPixels
/*******************************************************************
NAME: Status_Resize
SYNOPSIS: Resizes the status bar.
ENTRY: dx - The new width (pixels).
dy - The new height (pixels).
RETURNS: BOOL - TRUE if successful, FALSE otherwise.
********************************************************************/
BOOL
Status_Resize(
INT dx,
INT dy
)
{
//
// Move the status bar into its new position.
//
MoveWindow( _hwndStatus,
0,
dy - _dyStatus,
dx,
_dyStatus,
TRUE );
//
// Repaint now.
//
UpdateWindow( _hwndStatus );
return TRUE;
} // Status_Resize
/*******************************************************************
NAME: Status_Enable
SYNOPSIS: Enable/disable the status bar.
ENTRY: fFlag - Enable the status bar if TRUE, disable
otherwise.
********************************************************************/
VOID
Status_Enable(
BOOL fFlag
)
{
_fEnabled = fFlag;
ShowWindow( _hwndStatus, _fEnabled? SW_SHOW : SW_HIDE );
UpdateWindow( _hwndStatus );
} // Status_Enable
//
// Private functions.
//
/*******************************************************************
NAME: Statusp_WndProc
SYNOPSIS: Window procedure for the status bar window.
ENTRY: hwnd - Window handle.
nMessage - The message.
wParam - The first message parameter.
lParam - The second message parameter.
RETURNS: LRESULT - Depends on the actual message.
********************************************************************/
LRESULT
CALLBACK
Statusp_WndProc(
HWND hwnd,
UINT nMessage,
WPARAM wParam,
LPARAM lParam
)
{
switch( nMessage )
{
HANDLE_MSG( hwnd, WM_PAINT, Statusp_OnPaint );
HANDLE_MSG( hwnd, WM_SETTEXT, Statusp_OnSetText );
}
return DefWindowProc( hwnd, nMessage, wParam, lParam );
} // Statusp_WndProc
/*******************************************************************
NAME: Statusp_OnPaint
SYNOPSIS: Handles WM_PAINT messages.
ENTRY: hwnd - Window handle.
********************************************************************/
VOID
Statusp_OnPaint(
HWND hwnd
)
{
PAINTSTRUCT psPaint;
HDC hdc;
CHAR szText[MAX_STATUS_TEXT];
HPEN hpenBlack;
HPEN hpenWhite;
HPEN hpenGrey;
HPEN hpenOld;
RECT rect;
INT oldmode;
HFONT hfontOld;
//
// Start painting.
//
hdc = BeginPaint( hwnd, &psPaint );
if( _hfont != NULL )
{
hfontOld = SelectFont( hdc, _hfont );
}
//
// Create some GDI objects. Note that since we registered
// our window class with a grey brush, the background is
// already painted grey.
//
hpenGrey = CreatePen( PS_SOLID, 0, GetSysColor( COLOR_BTNSHADOW ) );
hpenWhite = CreatePen( PS_SOLID, 0, GetSysColor( COLOR_BTNHIGHLIGHT ) );
hpenBlack = CreatePen( PS_SOLID, 0, GetSysColor( COLOR_BTNTEXT ) );
hpenOld = SelectPen( hdc, hpenBlack );
//
// Get the window dimensions.
//
GetClientRect( hwnd, &rect );
//
// Draw the status bar borders.
//
SelectPen( hdc, hpenBlack );
MoveToEx( hdc, 0, 0, NULL );
LineTo( hdc, rect.right, 0 );
SelectPen( hdc, hpenWhite );
MoveToEx( hdc, 0, rect.bottom-1, NULL );
LineTo( hdc, 0, 1 );
LineTo( hdc, rect.right-1, 1 );
SelectPen( hdc, hpenGrey );
LineTo( hdc, rect.right-1, rect.bottom-1 );
LineTo( hdc, 0, rect.bottom-1 );
//
// Calculate the text area.
//
rect.top += ( _tmHeight / 4 ) + 1;
rect.left += _tmAveCharWidth;
rect.bottom -= ( _tmHeight / 4 );
rect.right -= _tmAveCharWidth;
//
// Display the text.
//
GetWindowText( hwnd, szText, sizeof(szText) / sizeof(szText[0]) );
//
// Always draw the text in transparent mode.
//
oldmode = SetBkMode( hdc, TRANSPARENT );
DrawText( hdc,
szText,
-1,
&rect,
DT_LEFT );
SetBkMode( hdc, oldmode );
#if 0
//
// Draw the text border.
//
InflateRect( &rect, _tmAveCharWidth / 2, 1 );
SelectPen( hdc, hpenGrey );
MoveToEx( hdc, rect.left, rect.bottom, NULL );
LineTo( hdc, rect.left, rect.top );
LineTo( hdc, rect.right, rect.top );
SelectPen( hdc, hpenWhite );
LineTo( hdc, rect.right, rect.bottom );
LineTo( hdc, rect.left, rect.bottom );
#endif
//
// Cleanup.
//
if( _hfont != NULL )
{
SelectFont( hdc, hfontOld );
}
SelectPen( hdc, hpenOld );
DeletePen( hpenBlack );
DeletePen( hpenWhite );
DeletePen( hpenGrey );
EndPaint( hwnd, &psPaint );
} // Statusp_OnPaint
/*******************************************************************
NAME: Statusp_OnSetText
SYNOPSIS: Handles WM_SETTEXT messages.
ENTRY: hwnd - Window handle.
pszText - The new window text.
********************************************************************/
VOID
Statusp_OnSetText(
HWND hwnd,
const VOID * pszText
)
{
COLORREF oldbk;
HDC hdc;
RECT rect;
RECT rectText;
INT oldmode;
HFONT hfontOld;
//
// Let DefWindowProc do its dirty work.
//
FORWARD_WM_SETTEXT( hwnd, pszText, DefWindowProc );
if( _fEnabled )
{
//
// Redraw the text.
//
GetClientRect( hwnd, &rect );
rect.top += ( _tmHeight / 4 ) + 1;
rect.left += _tmAveCharWidth;
rect.bottom -= ( _tmHeight / 4 );
rect.right -= _tmAveCharWidth;
hdc = GetDC( hwnd );
if( _hfont != NULL )
{
hfontOld = SelectFont( hdc, _hfont );
}
oldmode = SetBkMode( hdc, OPAQUE );
oldbk = SetBkColor( hdc, RGB( 192, 192, 192 ) );
rectText = rect;
DrawText( hdc,
pszText,
-1,
&rectText,
DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_CALCRECT );
DrawText( hdc,
pszText,
-1,
&rect,
DT_LEFT | DT_SINGLELINE | DT_NOPREFIX );
rect.left = rectText.right;
FillRect( hdc,
&rect,
GetStockObject( LTGRAY_BRUSH ) );
if( _hfont != NULL )
{
SelectFont( hdc, hfontOld );
}
SetBkColor( hdc, oldbk );
SetBkMode( hdc, oldmode );
ReleaseDC( hwnd, hdc );
}
} // Statusp_OnSetText