Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

274 lines
5.3 KiB

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
Util.c
Abstract:
This module contains miscellaneous utility functions.
Author:
David J. Gilman (davegi) 11-Sep-1992
Environment:
User Mode
--*/
#include <string.h>
#include "wintools.h"
LPCWSTR
BaseNameW(
IN LPCWSTR Name
)
/*++
Routine Description:
Returns the base portion of a file name if it exists.
Arguments:
Name - Supplies the name where the base name should be extracted
from.
Return Value:
LPCWSTR - Returns the base name.
--*/
{
LPWSTR String;
DbgPointerAssert( Name );
//
// If the name exists, look for the last '\' character and return the
// remaining part of name.
//
if( Name ) {
String = wcsrchr( Name, L'\\' );
return( String ) ? String + 1 : Name;
}
//
// No name, return NULL.
//
return NULL;
}
BOOL
GetCharMetricsW(
IN HDC hDC,
IN LPLONG CharWidth,
IN LPLONG CharHeight
)
/*++
Routine Description:
Return the width and height of a character.
Arguments:
hDC - Supplies a handle to the DC where the characters are to be
displayed.
CharWidth - Supplies a pointer where the character width is returned.
CharHeight - Supplies a pointer where the character height is returned.
Return Value:
BOOL - Returns TRUE if the character height and width are returned.
--*/
{
BOOL Success;
TEXTMETRICW TextMetric;
DbgHandleAssert( hDC );
DbgPointerAssert( CharWidth );
DbgPointerAssert( CharHeight );
//
// Attempt to retrieve the text metrics for the supplied DC.
//
Success = GetTextMetricsW( hDC, &TextMetric );
DbgAssert( Success );
if( Success ) {
//
// Compute the character width and height.
//
*CharWidth = TextMetric.tmAveCharWidth;
*CharHeight = TextMetric.tmHeight
+ TextMetric.tmExternalLeading;
}
return Success;
}
BOOL
GetClientSize(
IN HWND hWnd,
IN LPLONG ClientWidth,
IN LPLONG ClientHeight
)
/*++
Routine Description:
Return the width and height of the client area of a window.
Arguments:
hWnd - Supplies ahdnle to the window whose cient area size is of
interest
ClientWidth - Supplies a pointer where the window's client area width
is returned.
ClientHeight - Supplies a pointer where the window's client area height
is returned.
Return Value:
BOOL - Returns TRUE if the character height and width are
returned.
--*/
{
RECT Rect;
BOOL Success;
DbgHandleAssert( hWnd );
DbgPointerAssert( ClientWidth );
DbgPointerAssert( ClientHeight );
//
// Attempt to retrieve the clieant area size for the supplied window.
//
Success = GetClientRect( hWnd, &Rect );
DbgAssert( Success == TRUE );
if( Success == TRUE ) {
//
// Return the client area width and height.
//
*ClientWidth = Rect.right;
*ClientHeight = Rect.bottom;
}
return Success;
}
BOOL
SetScrollPosEx(
IN HWND hWnd,
IN INT fnBar,
IN INT nPos,
IN BOOL fRedraw,
OUT PINT pnOldPos
)
/*++
Routine Description:
An extended version of the SetScrollPos API, that tests of the supplied
window has scroll bars before positioning them and accounts for an
ambiguity in the return value.
Arguments:
hWnd - See the SetScrollPos API.
fnBar - See the SetScrollPos API.
nPos - See the SetScrollPos API.
fRedraw - See the SetScrollPos API.
pnOldPos - Supplies an optional pointer which if present will be set to
the old scroll bar position.
Return Value:
BOOL - Returns TRUE if the scroll bar was successfully scrolled.
--*/
{
INT OldPos;
LONG Style;
//
// Get the window style to see if it has scroll bars to position.
//
Style = GetWindowLong( hWnd, GWL_STYLE );
DbgAssert( Style != 0 );
if( Style == 0 ) {
return FALSE;
}
//
// If the scroll bat being position is a control or if the supplied
// windiw has scroll bars...
//
if( ( fnBar == SB_CTL )
|| (( fnBar == SB_HORZ ) && ( Style & WS_HSCROLL ))
|| (( fnBar == SB_VERT ) && ( Style & WS_VSCROLL ))) {
//
// Position the scroll bar.
//
OldPos = SetScrollPos(
hWnd,
fnBar,
nPos,
fRedraw
);
//
// SetScrollPos has an ambiguity in that it returns 0 for error which
// means it can't be distinguished from an old position of 0. Therefore
// special case the scenario of changing positions from 0->0 or 0->1.
//
if(( OldPos == 0 ) && (( nPos == 0 ) || ( nPos == 1 ))) {
return TRUE;
}
DbgAssert( OldPos != 0 );
if( OldPos == 0 ) {
return FALSE;
}
//
// If requested return the old position.
//
if( ARGUMENT_PRESENT( pnOldPos )) {
*pnOldPos = OldPos;
}
}
return TRUE;
}