1487 lines
35 KiB
C
1487 lines
35 KiB
C
|
/*
|
|||
|
==============================================================================
|
|||
|
|
|||
|
Application:
|
|||
|
|
|||
|
Microsoft Windows NT (TM) Performance Monitor
|
|||
|
|
|||
|
File:
|
|||
|
utils.c -- miscellaneous utility routines.
|
|||
|
|
|||
|
This file contains miscellaneous utiltity routines, mostly
|
|||
|
low-level windows helpers. These routines are not specific
|
|||
|
to the perfmon utillity.
|
|||
|
|
|||
|
Copyright 1992, Microsoft Corporation. All Rights Reserved.
|
|||
|
Microsoft Confidential.
|
|||
|
==============================================================================
|
|||
|
*/
|
|||
|
|
|||
|
//==========================================================================//
|
|||
|
// Includes //
|
|||
|
//==========================================================================//
|
|||
|
|
|||
|
#include <stdarg.h> // For ANSI variable args. Dont use UNIX <varargs.h>
|
|||
|
#include <stdlib.h> // For itoa
|
|||
|
#include <stdio.h> // for vsprintf.
|
|||
|
#include <string.h> // for strtok
|
|||
|
#include <wchar.h> // for swscanf
|
|||
|
|
|||
|
#include "perfmon.h"
|
|||
|
#include "pmemory.h" // for MemoryXXX (mallloc-type) routines
|
|||
|
#include "utils.h"
|
|||
|
#include "pmhelpid.h" // IDs for WinHelp
|
|||
|
#include "perfmops.h" // for ConvertDecimalPoint() & ReconvertDecimalPoint()
|
|||
|
#include "sizes.h"
|
|||
|
|
|||
|
//==========================================================================//
|
|||
|
// Constants //
|
|||
|
//==========================================================================//
|
|||
|
|
|||
|
|
|||
|
#define DOS_FILES 0x0000 // Ordinary files
|
|||
|
#define DOS_READONLY 0x0001 // Read-only files
|
|||
|
#define DOS_HIDDEN 0x0002 // Hidden files
|
|||
|
#define DOS_SYSTEM 0x0004 // System files
|
|||
|
#define DOS_SUBDIRECTORIES 0x0010 // Subdirectories
|
|||
|
#define DOS_ARCHIVES 0x0020 // Archives
|
|||
|
#define DOS_LIB_DIR 0x2000 // LB_DIR flag
|
|||
|
#define DOS_DRIVES 0x4000 // Drives
|
|||
|
#define DOS_EXCLUSIVE 0x8000 // Exclusive bit
|
|||
|
#define DOS_DRIVES_DIRECTORIES 0xC010 // Find drives and directories only
|
|||
|
|
|||
|
|
|||
|
#define WILD_ONE '?'
|
|||
|
#define WILD_ANY '*'
|
|||
|
|
|||
|
|
|||
|
//==========================================================================//
|
|||
|
// Local Functions //
|
|||
|
//==========================================================================//
|
|||
|
|
|||
|
void
|
|||
|
ClientRectToScreen (
|
|||
|
HWND hWnd,
|
|||
|
LPRECT lpRect
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Remaps lpRect from client coordinates to screen
|
|||
|
coordinates. Analogous to ClientToScreen for rectangles.
|
|||
|
|
|||
|
Note: To convert a rectangle from the client coordinates of
|
|||
|
Wnd1 to the client coordinates of Wnd2, call:
|
|||
|
|
|||
|
ClientRectToScreen (hWnd1, &rect) ;
|
|||
|
ScreenRectToClient (hWnd2, &rect) ;
|
|||
|
|
|||
|
See Also: ClientToScreen (windows), ScreenRectToClient.
|
|||
|
|
|||
|
Internals: Since a rectangle is really only two points, let
|
|||
|
windows do the work with ClientToScreen.
|
|||
|
*/
|
|||
|
{
|
|||
|
POINT pt1, pt2 ;
|
|||
|
|
|||
|
pt1.x = lpRect->left ;
|
|||
|
pt1.y = lpRect->top ;
|
|||
|
|
|||
|
pt2.x = lpRect->right ;
|
|||
|
pt2.y = lpRect->bottom ;
|
|||
|
|
|||
|
ClientToScreen (hWnd, &pt1) ;
|
|||
|
ClientToScreen (hWnd, &pt2) ;
|
|||
|
|
|||
|
lpRect->left = pt1.x ;
|
|||
|
lpRect->top = pt1.y ;
|
|||
|
|
|||
|
lpRect->right = pt2.x ;
|
|||
|
lpRect->bottom = pt2.y ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
ScreenRectToClient (
|
|||
|
HWND hWnd,
|
|||
|
LPRECT lpRect
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Remaps lpRect from screen coordinates to client
|
|||
|
coordinates. Analogous to ScreenToClient for rectangles.
|
|||
|
|
|||
|
Note: To convert a rectangle from the client coordinates of
|
|||
|
Wnd1 to the client coordinates of Wnd2, call:
|
|||
|
|
|||
|
ClientRectToScreen (hWnd1, &rect) ;
|
|||
|
ScreenRectToClient (hWnd2, &rect) ;
|
|||
|
|
|||
|
See Also: ScreenToClient (windows), ClientRectToScreen.
|
|||
|
|
|||
|
Internals: Since a rectangle is really only two points, let
|
|||
|
windows do the work with ScreenToClient.
|
|||
|
*/
|
|||
|
{
|
|||
|
POINT pt1, pt2 ;
|
|||
|
|
|||
|
pt1.x = lpRect->left ;
|
|||
|
pt1.y = lpRect->top ;
|
|||
|
|
|||
|
pt2.x = lpRect->right ;
|
|||
|
pt2.y = lpRect->bottom ;
|
|||
|
|
|||
|
ScreenToClient (hWnd, &pt1) ;
|
|||
|
ScreenToClient (hWnd, &pt2) ;
|
|||
|
|
|||
|
lpRect->left = pt1.x ;
|
|||
|
lpRect->top = pt1.y ;
|
|||
|
|
|||
|
lpRect->right = pt2.x ;
|
|||
|
lpRect->bottom = pt2.y ;
|
|||
|
} // ScreenRectToClient
|
|||
|
|
|||
|
|
|||
|
//==========================================================================//
|
|||
|
// Exported Functions //
|
|||
|
//==========================================================================//
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
Line (
|
|||
|
HDC hDC,
|
|||
|
HPEN hPen,
|
|||
|
int x1,
|
|||
|
int y1,
|
|||
|
int x2,
|
|||
|
int y2
|
|||
|
)
|
|||
|
{
|
|||
|
HPEN hPenPrevious = NULL;
|
|||
|
|
|||
|
if (hPen)
|
|||
|
hPenPrevious = SelectPen (hDC, hPen) ;
|
|||
|
MoveToEx (hDC, x1, y1, NULL) ;
|
|||
|
LineTo (hDC, x2, y2) ;
|
|||
|
if (hPen)
|
|||
|
SelectObject (hDC, hPenPrevious) ;
|
|||
|
}
|
|||
|
|
|||
|
#ifdef KEEP_UTIL
|
|||
|
void
|
|||
|
Fill (
|
|||
|
HDC hDC,
|
|||
|
DWORD rgbColor,
|
|||
|
LPRECT lpRect
|
|||
|
)
|
|||
|
{
|
|||
|
HBRUSH hBrush ;
|
|||
|
|
|||
|
hBrush = CreateSolidBrush (rgbColor) ;
|
|||
|
|
|||
|
FillRect (hDC, lpRect, hBrush) ;
|
|||
|
|
|||
|
DeleteBrush (hBrush) ;
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
ThreeDConvex (
|
|||
|
HDC hDC,
|
|||
|
int x1,
|
|||
|
int y1,
|
|||
|
int x2,
|
|||
|
int y2
|
|||
|
)
|
|||
|
{
|
|||
|
HBRUSH hBrushPrevious ;
|
|||
|
POINT aPoints [8] ;
|
|||
|
DWORD aCounts [2] ;
|
|||
|
HPEN hPenPrevious ;
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Face <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
hBrushPrevious = SelectBrush (hDC, hBrushFace) ;
|
|||
|
PatBlt (hDC,
|
|||
|
x1 + ThreeDPad, y1 + ThreeDPad,
|
|||
|
x2 - x1 - ThreeDPad, y2 - y1 - ThreeDPad,
|
|||
|
PATCOPY) ;
|
|||
|
SelectBrush (hDC, hBrushPrevious) ;
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Highlight <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if (hPenHighlight)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenHighlight) ;
|
|||
|
|
|||
|
aPoints [0].x = x1 ;
|
|||
|
aPoints [0].y = y2 - 1 ; // this works slightly diff. than Line ??
|
|||
|
aPoints [1].x = x1 ;
|
|||
|
aPoints [1].y = y1 ;
|
|||
|
aPoints [2].x = x2 ;
|
|||
|
aPoints [2].y = y1 ;
|
|||
|
|
|||
|
aPoints [3].x = x1 + 1 ;
|
|||
|
aPoints [3].y = y2 - 1 ;
|
|||
|
aPoints [4].x = x1 + 1 ;
|
|||
|
aPoints [4].y = y1 + 1 ;
|
|||
|
aPoints [5].x = x2 - 1 ;
|
|||
|
aPoints [5].y = y1 + 1 ;
|
|||
|
|
|||
|
aCounts [0] = 3 ;
|
|||
|
aCounts [1] = 3 ;
|
|||
|
|
|||
|
PolyPolyline (hDC, aPoints, aCounts, 2) ;
|
|||
|
|
|||
|
|
|||
|
if (hPenHighlight)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenPrevious) ;
|
|||
|
|
|||
|
// HLine (hDC, hPenHighlight, x1, x2, y1) ; // outside top line
|
|||
|
// HLine (hDC, hPenHighlight, x1 + 1, x2 - 1, y1 + 1) ; // inside top line
|
|||
|
// VLine (hDC, hPenHighlight, x1, y1, y2) ; // outside left line
|
|||
|
// VLine (hDC, hPenHighlight, x1 + 1, y1 + 1, y2 - 1) ; // inside left line
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Shadow <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if (hPenShadow)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenShadow) ;
|
|||
|
|
|||
|
aPoints [0].x = x1 + 1 ;
|
|||
|
aPoints [0].y = y2 - 1 ;
|
|||
|
aPoints [1].x = x2 ;
|
|||
|
aPoints [1].y = y2 - 1 ;
|
|||
|
aPoints [2].x = x2 ;
|
|||
|
aPoints [2].y = y2 - 2 ;
|
|||
|
aPoints [3].x = x1 + 2 ;
|
|||
|
aPoints [3].y = y2 - 2 ;
|
|||
|
|
|||
|
aPoints [4].x = x2 - 1 ;
|
|||
|
aPoints [4].y = y1 ;
|
|||
|
aPoints [5].x = x2 - 1 ;
|
|||
|
aPoints [5].y = y2 - 1;
|
|||
|
aPoints [6].x = x2 - 2 ;
|
|||
|
aPoints [6].y = y2 - 1 ;
|
|||
|
aPoints [7].x = x2 - 2 ;
|
|||
|
aPoints [7].y = y1 ;
|
|||
|
|
|||
|
aCounts [0] = 4 ;
|
|||
|
aCounts [1] = 4 ;
|
|||
|
|
|||
|
PolyPolyline (hDC, aPoints, aCounts, 2) ;
|
|||
|
|
|||
|
|
|||
|
if (hPenShadow)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenPrevious) ;
|
|||
|
|
|||
|
// HLine (hDC, hPenShadow, x1 + 1, x2, y2 - 1) ; // outside bottom line
|
|||
|
// HLine (hDC, hPenShadow, x1 + 2, x2, y2 - 2) ; // inside bottom line
|
|||
|
// VLine (hDC, hPenShadow, x2 - 1, y1 + 1, y2) ; // outside right line
|
|||
|
// VLine (hDC, hPenShadow, x2 - 2, y1 + 2, y2) ; // inside right line
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
ThreeDConcave (
|
|||
|
HDC hDC,
|
|||
|
int x1,
|
|||
|
int y1,
|
|||
|
int x2,
|
|||
|
int y2,
|
|||
|
BOOL bFace
|
|||
|
)
|
|||
|
{
|
|||
|
HBRUSH hBrushPrevious ;
|
|||
|
POINT aPoints [6] ;
|
|||
|
DWORD aCounts [2] ;
|
|||
|
HPEN hPenPrevious ;
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Face <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if (bFace) {
|
|||
|
hBrushPrevious = SelectBrush (hDC, hBrushFace) ;
|
|||
|
PatBlt (hDC,
|
|||
|
x1 + ThreeDPad, y1 + ThreeDPad,
|
|||
|
x2 - x1 - ThreeDPad, y2 - y1 - ThreeDPad,
|
|||
|
PATCOPY) ;
|
|||
|
SelectBrush (hDC, hBrushPrevious) ;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Shadow <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#if 1
|
|||
|
if (hPenShadow)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenShadow) ;
|
|||
|
|
|||
|
aPoints [0].x = x1 ;
|
|||
|
aPoints [0].y = y2 - 1 ;
|
|||
|
aPoints [1].x = x1 ;
|
|||
|
aPoints [1].y = y1 ;
|
|||
|
aPoints [2].x = x2 ;
|
|||
|
aPoints [2].y = y1 ;
|
|||
|
|
|||
|
aPoints [3].x = x1 + 1 ;
|
|||
|
aPoints [3].y = y2 - 1 ;
|
|||
|
aPoints [4].x = x1 + 1 ;
|
|||
|
aPoints [4].y = y1 + 1 ;
|
|||
|
aPoints [5].x = x2 - 1 ;
|
|||
|
aPoints [5].y = y1 + 1 ;
|
|||
|
|
|||
|
aCounts [0] = 3 ;
|
|||
|
aCounts [1] = 3 ;
|
|||
|
|
|||
|
PolyPolyline (hDC, aPoints, aCounts, 2) ;
|
|||
|
|
|||
|
if (hPenShadow)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenPrevious) ;
|
|||
|
|
|||
|
#else
|
|||
|
HLine (hDC, hPenShadow, x1, x2, y1) ; // outside top line
|
|||
|
HLine (hDC, hPenShadow, x1 + 1, x2 - 1, y1 + 1) ; // inside top line
|
|||
|
VLine (hDC, hPenShadow, x1, y1, y2) ; // outside left line
|
|||
|
VLine (hDC, hPenShadow, x1 + 1, y1 + 1, y2 - 1) ; // inside left line
|
|||
|
#endif
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Highlight <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#if 1
|
|||
|
if (hPenHighlight)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenHighlight) ;
|
|||
|
|
|||
|
aPoints [0].x = x1 + 1 ;
|
|||
|
aPoints [0].y = y2 - 1 ;
|
|||
|
aPoints [1].x = x2 ;
|
|||
|
aPoints [1].y = y2 - 1 ;
|
|||
|
|
|||
|
aPoints [2].x = x2 - 1 ;
|
|||
|
aPoints [2].y = y2 - 1 ;
|
|||
|
aPoints [3].x = x2 - 1 ;
|
|||
|
aPoints [3].y = y1 ;
|
|||
|
|
|||
|
aCounts [0] = 2 ;
|
|||
|
aCounts [1] = 2 ;
|
|||
|
|
|||
|
PolyPolyline (hDC, aPoints, aCounts, 2) ;
|
|||
|
|
|||
|
if (hPenHighlight)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenPrevious) ;
|
|||
|
|
|||
|
#else
|
|||
|
HLine (hDC, hPenHighlight, x1 + 1, x2, y2 - 1) ; // outside bottom line
|
|||
|
VLine (hDC, hPenHighlight, x2 - 1, y1 + 1, y2) ; // outside right line
|
|||
|
#endif
|
|||
|
}
|
|||
|
#endif // KEEP_UTIL
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
ThreeDConvex1 (
|
|||
|
HDC hDC,
|
|||
|
int x1,
|
|||
|
int y1,
|
|||
|
int x2,
|
|||
|
int y2
|
|||
|
)
|
|||
|
{
|
|||
|
HBRUSH hBrushPrevious ;
|
|||
|
POINT aPoints [6] ;
|
|||
|
DWORD aCounts [2] ;
|
|||
|
HPEN hPenPrevious = NULL;
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Face <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
#if 1
|
|||
|
hBrushPrevious = SelectBrush (hDC, hBrushFace) ;
|
|||
|
PatBlt (hDC,
|
|||
|
x1 + 1, y1 + 1,
|
|||
|
x2 - x1 - 1, y2 - y1 - 1,
|
|||
|
PATCOPY) ;
|
|||
|
SelectBrush (hDC, hBrushPrevious) ;
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Highlight <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
if (hPenHighlight)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenHighlight) ;
|
|||
|
|
|||
|
aPoints [0].x = x1 ;
|
|||
|
aPoints [0].y = y2 - 1 ;
|
|||
|
aPoints [1].x = x1 ;
|
|||
|
aPoints [1].y = y1 ;
|
|||
|
aPoints [2].x = x2 ;
|
|||
|
aPoints [2].y = y1 ;
|
|||
|
|
|||
|
Polyline (hDC, aPoints, 3) ;
|
|||
|
|
|||
|
if (hPenHighlight)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenPrevious) ;
|
|||
|
|
|||
|
#else
|
|||
|
HLine (hDC, hPenHighlight, x1, x2, y1) ; // outside top line
|
|||
|
VLine (hDC, hPenHighlight, x1, y1, y2) ; // outside left line
|
|||
|
#endif
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Shadow <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#if 1
|
|||
|
if (hPenShadow)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenShadow) ;
|
|||
|
|
|||
|
aPoints [0].x = x1 + 1 ;
|
|||
|
aPoints [0].y = y2 - 1 ;
|
|||
|
aPoints [1].x = x2 ;
|
|||
|
aPoints [1].y = y2 - 1 ;
|
|||
|
|
|||
|
aPoints [2].x = x2 - 1 ;
|
|||
|
aPoints [2].y = y2 - 1 ;
|
|||
|
aPoints [3].x = x2 - 1 ;
|
|||
|
aPoints [3].y = y1 ;
|
|||
|
|
|||
|
aCounts [0] = 2 ;
|
|||
|
aCounts [1] = 2 ;
|
|||
|
|
|||
|
PolyPolyline (hDC, aPoints, aCounts, 2) ;
|
|||
|
|
|||
|
if (hPenShadow)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenPrevious) ;
|
|||
|
#else
|
|||
|
HLine (hDC, hPenShadow, x1 + 1, x2, y2 - 1) ; // outside bottom line
|
|||
|
VLine (hDC, hPenShadow, x2 - 1, y1 + 1, y2) ; // outside right line
|
|||
|
#endif
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
ThreeDConcave1 (
|
|||
|
HDC hDC,
|
|||
|
int x1,
|
|||
|
int y1,
|
|||
|
int x2,
|
|||
|
int y2
|
|||
|
)
|
|||
|
{
|
|||
|
HBRUSH hBrushPrevious ;
|
|||
|
POINT aPoints [6] ;
|
|||
|
DWORD aCounts [2] ;
|
|||
|
HPEN hPenPrevious = NULL;
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Face <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
hBrushPrevious = SelectBrush (hDC, hBrushFace) ;
|
|||
|
PatBlt (hDC,
|
|||
|
x1 + 1, y1 + 1,
|
|||
|
x2 - x1 - 1, y2 - y1 - 1,
|
|||
|
PATCOPY) ;
|
|||
|
SelectBrush (hDC, hBrushPrevious) ;
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Shadow <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#if 1
|
|||
|
if (hPenShadow)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenShadow) ;
|
|||
|
|
|||
|
aPoints [0].x = x1 ;
|
|||
|
aPoints [0].y = y2 - 1 ;
|
|||
|
aPoints [1].x = x1 ;
|
|||
|
aPoints [1].y = y1 ;
|
|||
|
aPoints [2].x = x2 ;
|
|||
|
aPoints [2].y = y1 ;
|
|||
|
|
|||
|
Polyline (hDC, aPoints, 3) ;
|
|||
|
|
|||
|
if (hPenShadow)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenPrevious) ;
|
|||
|
#else
|
|||
|
HLine (hDC, hPenShadow, x1, x2, y1) ; // outside top line
|
|||
|
VLine (hDC, hPenShadow, x1, y1, y2) ; // outside left line
|
|||
|
#endif
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
//<2F> Draw Highlight <20>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
#if 1
|
|||
|
if (hPenHighlight)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenHighlight) ;
|
|||
|
|
|||
|
aPoints [0].x = x1 + 1 ;
|
|||
|
aPoints [0].y = y2 - 1 ;
|
|||
|
aPoints [1].x = x2 ;
|
|||
|
aPoints [1].y = y2 - 1 ;
|
|||
|
|
|||
|
aPoints [2].x = x2 - 1 ;
|
|||
|
aPoints [2].y = y2 - 2 ;
|
|||
|
aPoints [3].x = x2 - 1 ;
|
|||
|
aPoints [3].y = y1 ;
|
|||
|
|
|||
|
aCounts [0] = 2 ;
|
|||
|
aCounts [1] = 2 ;
|
|||
|
|
|||
|
PolyPolyline (hDC, aPoints, aCounts, 2) ;
|
|||
|
|
|||
|
if (hPenHighlight)
|
|||
|
hPenPrevious = SelectPen (hDC, hPenPrevious) ;
|
|||
|
#else
|
|||
|
HLine (hDC, hPenHighlight, x1 + 1, x2, y2 - 1) ; // outside bottom line
|
|||
|
VLine (hDC, hPenHighlight, x2 - 1, y1 + 1, y2) ; // outside right line
|
|||
|
#endif
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
TextWidth (
|
|||
|
HDC hDC,
|
|||
|
LPTSTR lpszText
|
|||
|
)
|
|||
|
{
|
|||
|
SIZE size ;
|
|||
|
|
|||
|
if (!lpszText)
|
|||
|
return (0) ;
|
|||
|
|
|||
|
GetTextExtentPoint (hDC, lpszText, lstrlen (lpszText), &size) ;
|
|||
|
return (size.cx) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
_cdecl
|
|||
|
DlgErrorBox (
|
|||
|
HWND hDlg,
|
|||
|
UINT id,
|
|||
|
...
|
|||
|
)
|
|||
|
{
|
|||
|
TCHAR szMessageFmt [FilePathLen + 1] ;
|
|||
|
TCHAR szBuffer [FilePathLen * 2] ;
|
|||
|
va_list vaList ;
|
|||
|
int NumOfChar ;
|
|||
|
TCHAR szApplication [WindowCaptionLen] ;
|
|||
|
|
|||
|
NumOfChar = StringLoad (id, szMessageFmt) ;
|
|||
|
|
|||
|
if (NumOfChar) {
|
|||
|
va_start (vaList, id) ;
|
|||
|
TSPRINTF (szBuffer, szMessageFmt, va_arg(vaList, LPTSTR)) ;
|
|||
|
va_end (vaList) ;
|
|||
|
|
|||
|
StringLoad (IDS_APPNAME, szApplication) ;
|
|||
|
|
|||
|
MessageBox (hDlg, szBuffer, szApplication,
|
|||
|
MB_OK | MB_ICONSTOP | MB_TASKMODAL) ;
|
|||
|
}
|
|||
|
|
|||
|
return (0) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
FontHeight (
|
|||
|
HDC hDC,
|
|||
|
BOOL bIncludeLeading
|
|||
|
)
|
|||
|
{
|
|||
|
TEXTMETRIC tm ;
|
|||
|
|
|||
|
GetTextMetrics (hDC, &tm) ;
|
|||
|
if (bIncludeLeading)
|
|||
|
return (tm.tmHeight + tm.tmExternalLeading) ;
|
|||
|
else
|
|||
|
return (tm.tmHeight) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
TextAvgWidth (
|
|||
|
HDC hDC,
|
|||
|
int iNumChars
|
|||
|
)
|
|||
|
{
|
|||
|
TEXTMETRIC tm ;
|
|||
|
int xAvgWidth ;
|
|||
|
|
|||
|
GetTextMetrics (hDC, &tm) ;
|
|||
|
|
|||
|
xAvgWidth = iNumChars * tm.tmAveCharWidth ;
|
|||
|
|
|||
|
// add 10% slop
|
|||
|
return (MulDiv (xAvgWidth, 11, 10)) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
WindowCenter (
|
|||
|
HWND hWnd
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Center the window hWnd in the center of the screen.
|
|||
|
Physically update the windows appearance as well.
|
|||
|
|
|||
|
Globals: xScreenWidth, yScreenHeight.
|
|||
|
*/
|
|||
|
{
|
|||
|
RECT rectWindow ;
|
|||
|
int xWindowWidth, yWindowHeight ;
|
|||
|
|
|||
|
GetWindowRect (hWnd, &rectWindow) ;
|
|||
|
xWindowWidth = rectWindow.right - rectWindow.left ;
|
|||
|
yWindowHeight = rectWindow.bottom - rectWindow.top ;
|
|||
|
|
|||
|
MoveWindow (hWnd,
|
|||
|
(xScreenWidth - xWindowWidth) / 2,
|
|||
|
(yScreenHeight - yWindowHeight) / 2,
|
|||
|
xWindowWidth,
|
|||
|
yWindowHeight,
|
|||
|
TRUE) ;
|
|||
|
}
|
|||
|
|
|||
|
BOOL
|
|||
|
DialogMove (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID,
|
|||
|
int xPos,
|
|||
|
int yPos,
|
|||
|
int xWidth,
|
|||
|
int yHeight
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Move the control identified by wControlID in the dialog
|
|||
|
hDlg to the new position (xPos, yPos), and resize to
|
|||
|
(xWidth, yHeight). If any of these values are NOCHANGE, retain
|
|||
|
the current value.
|
|||
|
|
|||
|
Examples: DialogMove (hDlg, IDD_FOO, 10, 20, NOCHANGE, NOCHANGE)
|
|||
|
moves control but does not resize it
|
|||
|
|
|||
|
DialogMove (hDlg, IDD_FOO, NOCHANGE, NOCHANGE, 100, NOCHANGE)
|
|||
|
sets width of control to 100
|
|||
|
*/
|
|||
|
{
|
|||
|
HWND hWndControl ;
|
|||
|
RECT rectControl ;
|
|||
|
|
|||
|
hWndControl = DialogControl (hDlg, wControlID) ;
|
|||
|
if (!hWndControl)
|
|||
|
return (FALSE) ;
|
|||
|
GetWindowRect (hWndControl, &rectControl) ;
|
|||
|
ScreenRectToClient (hDlg, &rectControl) ;
|
|||
|
|
|||
|
MoveWindow (hWndControl,
|
|||
|
(xPos == NOCHANGE) ? rectControl.left : xPos,
|
|||
|
(yPos == NOCHANGE) ? rectControl.top : yPos,
|
|||
|
(xWidth == NOCHANGE) ? rectControl.right - rectControl.left : xWidth,
|
|||
|
(yHeight == NOCHANGE) ? rectControl.bottom - rectControl.top : yHeight,
|
|||
|
TRUE) ;
|
|||
|
|
|||
|
return (TRUE) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
DialogWidth (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID
|
|||
|
)
|
|||
|
{
|
|||
|
HWND hWndControl ;
|
|||
|
RECT rectControl ;
|
|||
|
|
|||
|
hWndControl = DialogControl (hDlg, wControlID) ;
|
|||
|
if (!hWndControl)
|
|||
|
return (0) ;
|
|||
|
|
|||
|
GetWindowRect (hWndControl, &rectControl) ;
|
|||
|
return (rectControl.right - rectControl.left) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
DialogHeight (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID
|
|||
|
)
|
|||
|
{
|
|||
|
HWND hWndControl ;
|
|||
|
RECT rectControl ;
|
|||
|
|
|||
|
hWndControl = DialogControl (hDlg, wControlID) ;
|
|||
|
if (!hWndControl)
|
|||
|
return (0) ;
|
|||
|
|
|||
|
GetWindowRect (hWndControl, &rectControl) ;
|
|||
|
return (rectControl.bottom - rectControl.top) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
DialogXPos (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID
|
|||
|
)
|
|||
|
{
|
|||
|
HWND hWndControl ;
|
|||
|
RECT rectControl ;
|
|||
|
|
|||
|
hWndControl = DialogControl (hDlg, wControlID) ;
|
|||
|
if (!hWndControl)
|
|||
|
return (0) ;
|
|||
|
|
|||
|
GetWindowRect (hWndControl, &rectControl) ;
|
|||
|
ScreenRectToClient (hDlg, &rectControl) ;
|
|||
|
|
|||
|
return (rectControl.left) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
DialogYPos (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID
|
|||
|
)
|
|||
|
{
|
|||
|
HWND hWndControl ;
|
|||
|
RECT rectControl ;
|
|||
|
|
|||
|
hWndControl = DialogControl (hDlg, wControlID) ;
|
|||
|
if (!hWndControl)
|
|||
|
return (0) ;
|
|||
|
|
|||
|
GetWindowRect (hWndControl, &rectControl) ;
|
|||
|
ScreenRectToClient (hDlg, &rectControl) ;
|
|||
|
|
|||
|
return (rectControl.top) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
DialogEnable (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wID,
|
|||
|
BOOL bEnable
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Enable or disable (based on bEnable) the control
|
|||
|
identified by wID in dialog hDlg.
|
|||
|
|
|||
|
See Also: DialogShow.
|
|||
|
*/
|
|||
|
{
|
|||
|
HCONTROL hControl ;
|
|||
|
|
|||
|
hControl = GetDlgItem (hDlg, wID) ;
|
|||
|
if (hControl)
|
|||
|
EnableWindow (hControl, bEnable) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
DialogShow (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wID,
|
|||
|
BOOL bShow
|
|||
|
)
|
|||
|
{
|
|||
|
HCONTROL hControl ;
|
|||
|
|
|||
|
hControl = GetDlgItem (hDlg, wID) ;
|
|||
|
if (hControl)
|
|||
|
ShowWindow (hControl, bShow ? SW_SHOW : SW_HIDE) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
_cdecl
|
|||
|
DialogSetText (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID,
|
|||
|
WORD wStringID,
|
|||
|
...
|
|||
|
)
|
|||
|
{
|
|||
|
TCHAR szFormat [ControlStringLen] ;
|
|||
|
TCHAR szText [ControlStringLen] ;
|
|||
|
va_list vaList ;
|
|||
|
|
|||
|
if (LoadString (hInstance, wStringID,
|
|||
|
szFormat, ControlStringLen - 1)) {
|
|||
|
va_start (vaList, wStringID) ;
|
|||
|
TSPRINTF (szText, szFormat, va_arg(vaList, LPTSTR)) ;
|
|||
|
va_end (vaList) ;
|
|||
|
|
|||
|
SetDlgItemText (hDlg, wControlID, szText) ;
|
|||
|
return (TRUE) ;
|
|||
|
} else {
|
|||
|
return (FALSE) ;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// Bug - lpszFormat could contain % in it
|
|||
|
#if 0
|
|||
|
BOOL
|
|||
|
_cdecl
|
|||
|
DialogSetString (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID,
|
|||
|
LPTSTR lpszFormat,
|
|||
|
...
|
|||
|
)
|
|||
|
{
|
|||
|
TCHAR szText [ControlStringLen] ;
|
|||
|
va_list vaList ;
|
|||
|
|
|||
|
va_start (vaList, lpszFormat) ;
|
|||
|
TSPRINTF (szText, lpszFormat, va_arg(vaList, LPTSTR)) ;
|
|||
|
va_end (vaList) ;
|
|||
|
|
|||
|
SetDlgItemText (hDlg, wControlID, szText) ;
|
|||
|
return (TRUE) ;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
LPTSTR
|
|||
|
LongToCommaString (
|
|||
|
LONG lNumber,
|
|||
|
LPTSTR lpszText
|
|||
|
)
|
|||
|
{
|
|||
|
BOOL bNegative ;
|
|||
|
TCHAR szTemp1 [40] ;
|
|||
|
TCHAR szTemp2 [40] ;
|
|||
|
LPTSTR lpsz1 ;
|
|||
|
LPTSTR lpsz2 ;
|
|||
|
int i ;
|
|||
|
int iDigit ;
|
|||
|
|
|||
|
// 1. Convert the number to a reversed string.
|
|||
|
lpsz1 = szTemp1 ;
|
|||
|
bNegative = (lNumber < 0) ;
|
|||
|
lNumber = labs (lNumber) ;
|
|||
|
|
|||
|
if (lNumber)
|
|||
|
while (lNumber) {
|
|||
|
iDigit = (int) (lNumber % 10L) ;
|
|||
|
lNumber /= 10L ;
|
|||
|
*lpsz1++ = (TCHAR) (TEXT('0') + iDigit) ;
|
|||
|
} else
|
|||
|
*lpsz1++ = TEXT('0') ;
|
|||
|
*lpsz1++ = TEXT('\0') ;
|
|||
|
|
|||
|
|
|||
|
// 2. reverse the string and add commas
|
|||
|
lpsz1 = szTemp1 + lstrlen (szTemp1) - 1 ;
|
|||
|
lpsz2 = szTemp2 ;
|
|||
|
|
|||
|
if (bNegative)
|
|||
|
*lpsz2++ = TEXT('-') ;
|
|||
|
|
|||
|
for (i = lstrlen (szTemp1) - 1; i >= 0; i--) {
|
|||
|
*lpsz2++ = *lpsz1-- ;
|
|||
|
if (i && !(i % 3))
|
|||
|
*lpsz2++ = TEXT(',') ;
|
|||
|
}
|
|||
|
*lpsz2++ = TEXT('\0') ;
|
|||
|
|
|||
|
return (lstrcpy (lpszText, szTemp2)) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
MenuSetPopup (
|
|||
|
HWND hWnd,
|
|||
|
int iPosition,
|
|||
|
WORD wControlID,
|
|||
|
LPTSTR lpszResourceID
|
|||
|
)
|
|||
|
{
|
|||
|
HMENU hMenuMain ;
|
|||
|
HMENU hMenuPopup ;
|
|||
|
TCHAR szTopChoice [MenuStringLen + 1] ;
|
|||
|
|
|||
|
hMenuMain = GetMenu (hWnd) ;
|
|||
|
if (!hMenuMain)
|
|||
|
return (FALSE);
|
|||
|
hMenuPopup = LoadMenu (hInstance, lpszResourceID) ;
|
|||
|
|
|||
|
if (!hMenuPopup) {
|
|||
|
DestroyMenu(hMenuMain);
|
|||
|
return (FALSE) ;
|
|||
|
}
|
|||
|
|
|||
|
StringLoad (wControlID, szTopChoice) ;
|
|||
|
return (ModifyMenu (hMenuMain, iPosition, MF_BYPOSITION | MF_POPUP,
|
|||
|
(UINT_PTR) hMenuPopup, szTopChoice)) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LPTSTR
|
|||
|
FileCombine (
|
|||
|
LPTSTR lpszFileSpec,
|
|||
|
LPTSTR lpszFileDirectory,
|
|||
|
LPTSTR lpszFileName
|
|||
|
)
|
|||
|
{
|
|||
|
int stringLen ;
|
|||
|
TCHAR DIRECTORY_DELIMITER[2] ;
|
|||
|
|
|||
|
DIRECTORY_DELIMITER[0] = TEXT('\\') ;
|
|||
|
DIRECTORY_DELIMITER[1] = TEXT('\0') ;
|
|||
|
|
|||
|
lstrcpy (lpszFileSpec, lpszFileDirectory) ;
|
|||
|
|
|||
|
stringLen = lstrlen (lpszFileSpec) ;
|
|||
|
if (stringLen > 0 &&
|
|||
|
lpszFileSpec [stringLen - 1] != DIRECTORY_DELIMITER [0])
|
|||
|
lstrcat (lpszFileSpec, DIRECTORY_DELIMITER) ;
|
|||
|
|
|||
|
lstrcat (lpszFileSpec, lpszFileName) ;
|
|||
|
|
|||
|
return (lpszFileSpec) ;
|
|||
|
}
|
|||
|
|
|||
|
// This routine extract the filename portion from a given full-path filename
|
|||
|
LPTSTR
|
|||
|
ExtractFileName (
|
|||
|
LPTSTR pFileSpec
|
|||
|
)
|
|||
|
{
|
|||
|
LPTSTR pFileName = NULL ;
|
|||
|
TCHAR DIRECTORY_DELIMITER1 = TEXT('\\') ;
|
|||
|
TCHAR DIRECTORY_DELIMITER2 = TEXT(':') ;
|
|||
|
|
|||
|
if (pFileSpec) {
|
|||
|
pFileName = pFileSpec + lstrlen (pFileSpec) ;
|
|||
|
|
|||
|
while (*pFileName != DIRECTORY_DELIMITER1 &&
|
|||
|
*pFileName != DIRECTORY_DELIMITER2) {
|
|||
|
if (pFileName == pFileSpec) {
|
|||
|
// done when no directory delimiter is found
|
|||
|
break ;
|
|||
|
}
|
|||
|
pFileName-- ;
|
|||
|
}
|
|||
|
|
|||
|
if (*pFileName == DIRECTORY_DELIMITER1 ||
|
|||
|
*pFileName == DIRECTORY_DELIMITER2) {
|
|||
|
// directory delimiter found, point the
|
|||
|
// filename right after it
|
|||
|
pFileName++ ;
|
|||
|
}
|
|||
|
}
|
|||
|
return pFileName ;
|
|||
|
}
|
|||
|
|
|||
|
int
|
|||
|
CBAddInt (
|
|||
|
HWND hWndCB,
|
|||
|
int iValue
|
|||
|
)
|
|||
|
{
|
|||
|
TCHAR szValue [ShortTextLen + 1] ;
|
|||
|
CHAR szCharValue [ShortTextLen + 1] ;
|
|||
|
|
|||
|
_itoa (iValue, (LPSTR)szCharValue, 10) ;
|
|||
|
#ifdef UNICODE
|
|||
|
mbstowcs (szValue, (LPSTR)szCharValue, strlen((LPSTR)szCharValue)+1) ;
|
|||
|
return (CBAdd (hWndCB, szValue)) ;
|
|||
|
#else
|
|||
|
return (CBAdd (hWndCB, szCharValue)) ;
|
|||
|
#endif
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
DialogSetInterval (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID,
|
|||
|
int IntervalMSec
|
|||
|
)
|
|||
|
{
|
|||
|
TCHAR szValue [MiscTextLen] ;
|
|||
|
|
|||
|
TSPRINTF (szValue, TEXT("%3.3f"),
|
|||
|
(FLOAT)(IntervalMSec / 1000)) ;
|
|||
|
ConvertDecimalPoint (szValue) ;
|
|||
|
SetDlgItemText (hDlg, wControlID, szValue) ;
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
DialogSetFloat (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID,
|
|||
|
FLOAT eValue
|
|||
|
)
|
|||
|
{
|
|||
|
TCHAR szValue [40] ;
|
|||
|
FLOAT tempValue = eValue ;
|
|||
|
|
|||
|
if (tempValue < (FLOAT) 0.0) {
|
|||
|
tempValue = - tempValue ;
|
|||
|
}
|
|||
|
|
|||
|
if (tempValue < (FLOAT) 1.0E+8) {
|
|||
|
TSPRINTF (szValue, TEXT("%1.4f"), eValue) ;
|
|||
|
} else {
|
|||
|
TSPRINTF (szValue, TEXT("%14.6e"), eValue) ;
|
|||
|
}
|
|||
|
ConvertDecimalPoint (szValue) ;
|
|||
|
|
|||
|
SetDlgItemText (hDlg, wControlID, szValue) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
FLOAT
|
|||
|
DialogFloat (
|
|||
|
HDLG hDlg,
|
|||
|
WORD wControlID,
|
|||
|
BOOL *pbOK
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Return a floating point representation of the string
|
|||
|
value found in the control wControlID of hDlg.
|
|||
|
|
|||
|
Internals: We use sscanf instead of atof becuase atof returns a
|
|||
|
double. This may or may not be the right thing to do.
|
|||
|
*/
|
|||
|
{
|
|||
|
TCHAR szValue [ShortTextLen+1] ;
|
|||
|
FLOAT eValue ;
|
|||
|
int iNumScanned ;
|
|||
|
|
|||
|
DialogText (hDlg, wControlID, szValue) ;
|
|||
|
ReconvertDecimalPoint (szValue) ;
|
|||
|
iNumScanned = swscanf (szValue, TEXT("%e"), &eValue) ;
|
|||
|
|
|||
|
if (pbOK)
|
|||
|
*pbOK = (iNumScanned == 1) ;
|
|||
|
|
|||
|
return (eValue) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LPTSTR
|
|||
|
StringAllocate (
|
|||
|
LPTSTR lpszText1
|
|||
|
)
|
|||
|
{
|
|||
|
LPTSTR lpszText2 = NULL;
|
|||
|
DWORD dwStrLen;
|
|||
|
|
|||
|
if (lpszText1 != NULL) {
|
|||
|
if (*lpszText1 != 0) {
|
|||
|
dwStrLen = (lstrlen (lpszText1)+1) * sizeof (TCHAR);
|
|||
|
lpszText2 = MemoryAllocate (dwStrLen) ;
|
|||
|
if (lpszText2 != NULL) {
|
|||
|
lstrcpy (lpszText2, lpszText1) ;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return (lpszText2) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
DivRound (
|
|||
|
int iNumerator,
|
|||
|
int iDenominator
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Return the quotient (iNumerator / iDenominator).
|
|||
|
Round the quotient to the nearest integer.
|
|||
|
This function is similar to normal integer division (/),
|
|||
|
but normal division always rounds down.
|
|||
|
|
|||
|
Note: Surely there must already be a runtime version of this,
|
|||
|
but I couldn't find it.
|
|||
|
|
|||
|
Note: This function originally used the runtime div function
|
|||
|
instead of (/ and %), but the div runtime function is
|
|||
|
now broken (build 265).
|
|||
|
*/
|
|||
|
{
|
|||
|
int iQuotient ;
|
|||
|
int iRemainder ;
|
|||
|
|
|||
|
|
|||
|
iQuotient = iNumerator / iDenominator ;
|
|||
|
iRemainder = iNumerator % iDenominator ;
|
|||
|
|
|||
|
if (iRemainder >= (iDenominator / 2))
|
|||
|
iQuotient++ ;
|
|||
|
|
|||
|
return (iQuotient) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
MenuEnableItem (
|
|||
|
HMENU hMenu,
|
|||
|
WORD wID,
|
|||
|
BOOL bEnable
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Enable or disable, depending on bEnable, the menu item
|
|||
|
associated with id wID in the menu hMenu.
|
|||
|
|
|||
|
Any disabled menu items are displayed grayed out.
|
|||
|
|
|||
|
See Also: EnableMenuItem (windows).
|
|||
|
*/
|
|||
|
{
|
|||
|
return (EnableMenuItem (hMenu, wID,
|
|||
|
bEnable ?
|
|||
|
(MF_ENABLED | MF_BYCOMMAND) :
|
|||
|
(MF_GRAYED | MF_BYCOMMAND))) ;
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
BitmapDimemsion (
|
|||
|
HBITMAP hBitmap,
|
|||
|
int *pHeight,
|
|||
|
int *pWidth
|
|||
|
)
|
|||
|
{
|
|||
|
BITMAP bm ;
|
|||
|
|
|||
|
GetObject (hBitmap, sizeof (BITMAP), (LPSTR) &bm) ;
|
|||
|
if (pHeight)
|
|||
|
*pHeight = bm.bmHeight ;
|
|||
|
if (pWidth)
|
|||
|
*pWidth = bm.bmWidth ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
WindowHeight (
|
|||
|
HWND hWnd
|
|||
|
)
|
|||
|
{
|
|||
|
RECT rectWindow ;
|
|||
|
|
|||
|
GetWindowRect (hWnd, &rectWindow) ;
|
|||
|
return (rectWindow.bottom - rectWindow.top) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#ifdef KEEP_UTIL
|
|||
|
int
|
|||
|
WindowWidth (
|
|||
|
HWND hWnd
|
|||
|
)
|
|||
|
{
|
|||
|
RECT rectWindow ;
|
|||
|
|
|||
|
GetWindowRect (hWnd, &rectWindow) ;
|
|||
|
return (rectWindow.right - rectWindow.left) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
WindowResize (
|
|||
|
HWND hWnd,
|
|||
|
int xWidth,
|
|||
|
int yHeight
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Change the size of the window hWnd, leaving the
|
|||
|
starting position intact. Redraw the window.
|
|||
|
|
|||
|
If either xWidth or yHeight is NULL, keep the
|
|||
|
corresponding dimension unchanged.
|
|||
|
|
|||
|
Internals: Since hWnd may be a child of another parent, we need
|
|||
|
to scale the MoveWindow arguments to be in the client
|
|||
|
coordinates of the parent.
|
|||
|
|
|||
|
*/
|
|||
|
{
|
|||
|
RECT rectWindow ;
|
|||
|
HWND hWndParent ;
|
|||
|
|
|||
|
GetWindowRect (hWnd, &rectWindow) ;
|
|||
|
hWndParent = WindowParent (hWnd) ;
|
|||
|
|
|||
|
if (hWndParent)
|
|||
|
ScreenRectToClient (hWndParent, &rectWindow) ;
|
|||
|
|
|||
|
MoveWindow (hWnd,
|
|||
|
rectWindow.left,
|
|||
|
rectWindow.top,
|
|||
|
xWidth ? xWidth : rectWindow.right - rectWindow.left,
|
|||
|
yHeight ? yHeight : rectWindow.bottom - rectWindow.top,
|
|||
|
TRUE) ;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
WindowSetTopmost (
|
|||
|
HWND hWnd,
|
|||
|
BOOL bTopmost
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Set or clear the "topmost" attribute of hWnd. If a window
|
|||
|
is "topmost", it remains ontop of other windows, even ones
|
|||
|
that have the focus.
|
|||
|
*/
|
|||
|
{
|
|||
|
SetWindowPos (hWnd, bTopmost ? HWND_TOPMOST : HWND_NOTOPMOST,
|
|||
|
0, 0, 0, 0,
|
|||
|
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
WindowEnableTitle (
|
|||
|
HWND hWnd,
|
|||
|
BOOL bTitle
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD dwStyle ;
|
|||
|
|
|||
|
|
|||
|
dwStyle = WindowStyle (hWnd) ;
|
|||
|
|
|||
|
if (bTitle)
|
|||
|
dwStyle = WS_TILEDWINDOW | dwStyle ;
|
|||
|
else
|
|||
|
dwStyle =
|
|||
|
dwStyle &
|
|||
|
~ (WS_DLGFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) ;
|
|||
|
|
|||
|
if (!bTitle)
|
|||
|
SetMenu (hWnd, NULL) ;
|
|||
|
|
|||
|
WindowSetStyle (hWnd, dwStyle) ;
|
|||
|
SetWindowPos (hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE |
|
|||
|
SWP_NOZORDER | SWP_FRAMECHANGED );
|
|||
|
}
|
|||
|
|
|||
|
#ifdef PERFMON_DEBUG
|
|||
|
|
|||
|
#define MikeBufferSize 256
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
_cdecl
|
|||
|
mike (
|
|||
|
TCHAR *szFormat,
|
|||
|
...
|
|||
|
)
|
|||
|
/*
|
|||
|
Note: This function returns a value so that it can more easily
|
|||
|
be used in conditional expressions.
|
|||
|
*/
|
|||
|
{
|
|||
|
TCHAR szBuffer [MikeBufferSize] ;
|
|||
|
va_list vaList ;
|
|||
|
|
|||
|
va_start (vaList, szFormat) ;
|
|||
|
TSPRINTF (szBuffer, szFormat, va_arg(vaList, LPTSTR)) ;
|
|||
|
va_end (vaList) ;
|
|||
|
|
|||
|
MessageBox (NULL, szBuffer, TEXT("Debug"), MB_OK | MB_TASKMODAL) ;
|
|||
|
return (0) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
_cdecl
|
|||
|
mike1 (
|
|||
|
TCHAR *szFormat,
|
|||
|
...
|
|||
|
)
|
|||
|
/*
|
|||
|
Note: This function returns a value so that it can more easily
|
|||
|
be used in conditional expressions.
|
|||
|
*/
|
|||
|
{
|
|||
|
TCHAR szBuffer [MikeBufferSize] ;
|
|||
|
va_list vaList ;
|
|||
|
HDC hDC ;
|
|||
|
RECT rect ;
|
|||
|
|
|||
|
va_start (vaList, szFormat) ;
|
|||
|
TSPRINTF (szBuffer, szFormat, va_arg(vaList, LPTSTR)) ;
|
|||
|
va_end (vaList) ;
|
|||
|
|
|||
|
rect.left = 0 ;
|
|||
|
rect.right = xScreenWidth ;
|
|||
|
rect.top = 0 ;
|
|||
|
rect.bottom = 20 ;
|
|||
|
|
|||
|
hDC = CreateScreenDC () ;
|
|||
|
ExtTextOut (hDC, 0, 0, ETO_OPAQUE, &rect,
|
|||
|
szBuffer, lstrlen (szBuffer), NULL) ;
|
|||
|
DeleteDC (hDC) ;
|
|||
|
|
|||
|
return (0) ;
|
|||
|
}
|
|||
|
|
|||
|
int
|
|||
|
_cdecl
|
|||
|
mike2 (
|
|||
|
TCHAR *szFormat,
|
|||
|
...
|
|||
|
)
|
|||
|
/*
|
|||
|
Note: This function returns a value so that it can more easily
|
|||
|
be used in conditional expressions.
|
|||
|
*/
|
|||
|
{
|
|||
|
TCHAR szBuffer [MikeBufferSize] ;
|
|||
|
va_list vaList ;
|
|||
|
|
|||
|
va_start (vaList, szFormat) ;
|
|||
|
TSPRINTF (szBuffer, szFormat, va_arg(vaList, LPTSTR)) ;
|
|||
|
va_end (vaList) ;
|
|||
|
|
|||
|
OutputDebugString (szBuffer) ;
|
|||
|
|
|||
|
return (0) ;
|
|||
|
}
|
|||
|
#endif // PERFMON_DEBUG
|
|||
|
|
|||
|
|
|||
|
#ifdef KEEP_UTIL
|
|||
|
int
|
|||
|
inttok (
|
|||
|
LPSTR lpszText,
|
|||
|
LPSTR lpszDelimiters
|
|||
|
)
|
|||
|
{
|
|||
|
|
|||
|
// Inttok only works with LPSTRs because of the atoi & strtok
|
|||
|
|
|||
|
LPSTR lpszToken ;
|
|||
|
|
|||
|
lpszToken = strtok (lpszText, lpszDelimiters) ;
|
|||
|
|
|||
|
if (lpszToken)
|
|||
|
return (atoi (lpszToken)) ;
|
|||
|
else
|
|||
|
return (0) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
WindowPlacementToString (
|
|||
|
PWINDOWPLACEMENT pWP,
|
|||
|
LPTSTR lpszText
|
|||
|
)
|
|||
|
{
|
|||
|
TSPRINTF (lpszText, TEXT("%d %d %d %d %d %d %d %d %d"),
|
|||
|
pWP->showCmd,
|
|||
|
pWP->ptMinPosition.x,
|
|||
|
pWP->ptMinPosition.y,
|
|||
|
pWP->ptMaxPosition.x,
|
|||
|
pWP->ptMaxPosition.y,
|
|||
|
pWP->rcNormalPosition.left,
|
|||
|
pWP->rcNormalPosition.top,
|
|||
|
pWP->rcNormalPosition.right,
|
|||
|
pWP->rcNormalPosition.bottom) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
StringToWindowPlacement (
|
|||
|
LPTSTR lpszText,
|
|||
|
PWINDOWPLACEMENT pWP
|
|||
|
)
|
|||
|
{
|
|||
|
int iNumScanned ;
|
|||
|
|
|||
|
iNumScanned = swscanf (lpszText, TEXT("%d %d %d %d %d %d %d %d %d"),
|
|||
|
&pWP->showCmd,
|
|||
|
&pWP->ptMinPosition.x,
|
|||
|
&pWP->ptMinPosition.y,
|
|||
|
&pWP->ptMaxPosition.x,
|
|||
|
&pWP->ptMaxPosition.y,
|
|||
|
&pWP->rcNormalPosition.left,
|
|||
|
&pWP->rcNormalPosition.top,
|
|||
|
&pWP->rcNormalPosition.right,
|
|||
|
&pWP->rcNormalPosition.bottom) ;
|
|||
|
}
|
|||
|
#endif // KEEP_UTIL
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
LogFontHeight (
|
|||
|
HDC hDC,
|
|||
|
int iPointSize
|
|||
|
)
|
|||
|
/*
|
|||
|
Effect: Return the appropriate pixel height for the lfHeight
|
|||
|
field of the LOGFONT structure for the requested point
|
|||
|
size. This size depends on the number of pixels per
|
|||
|
logical inch of the current display context, hDC.
|
|||
|
|
|||
|
Called By: Any function which wants to create a particular
|
|||
|
point-height font.
|
|||
|
*/
|
|||
|
{
|
|||
|
return (-MulDiv (iPointSize, GetDeviceCaps (hDC, LOGPIXELSY), 72)) ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// this routine converts the input menu id into help id.
|
|||
|
DWORD
|
|||
|
MenuIDToHelpID (
|
|||
|
DWORD MenuID
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD HelpID = 0 ;
|
|||
|
|
|||
|
if (MenuID >= IDM_FIRSTMENUID && MenuID <= IDM_LASTMENUID) {
|
|||
|
// only special cases...
|
|||
|
if (MenuID >= IDM_OPTIONSREFRESHNOWCHART &&
|
|||
|
MenuID <= IDM_OPTIONSREFRESHNOWREPORT) {
|
|||
|
HelpID = HC_PM_MENU_OPTIONSREFRESHNOW ;
|
|||
|
} else {
|
|||
|
HelpID = MenuID - MENUIDTOHELPID ;
|
|||
|
}
|
|||
|
#ifndef ADVANCED_PERFMON
|
|||
|
// need to convert these 2 IDs for Perf. Meter
|
|||
|
if (HelpID == HC_PM_MENU_HELPABOUT) {
|
|||
|
HelpID = HC_NTPM_MENU_HELPABOUT ;
|
|||
|
} else if (HelpID == HC_PM_MENU_FILEEXIT) {
|
|||
|
HelpID = HC_NTPM_MENU_FILEEXIT ;
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
return (HelpID) ;
|
|||
|
}
|