mirror of https://github.com/lianthony/NT4.0
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
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
|
|
|