256 lines
5.9 KiB
C
256 lines
5.9 KiB
C
#ifndef _PH_GRAPH_H
|
|
#define _PH_GRAPH_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// Graph drawing
|
|
|
|
extern RECT PhNormalGraphTextMargin;
|
|
extern RECT PhNormalGraphTextPadding;
|
|
|
|
#define PH_GRAPH_USE_GRID_X 0x1
|
|
#define PH_GRAPH_USE_GRID_Y 0x2
|
|
#define PH_GRAPH_LOGARITHMIC_GRID_Y 0x4
|
|
#define PH_GRAPH_USE_LINE_2 0x10
|
|
#define PH_GRAPH_OVERLAY_LINE_2 0x20
|
|
#define PH_GRAPH_LABEL_MAX_Y 0x1000
|
|
|
|
typedef PPH_STRING (NTAPI *PPH_GRAPH_LABEL_Y_FUNCTION)(
|
|
_In_ struct _PH_GRAPH_DRAW_INFO *DrawInfo,
|
|
_In_ ULONG DataIndex,
|
|
_In_ FLOAT Value,
|
|
_In_ FLOAT Parameter
|
|
);
|
|
|
|
typedef struct _PH_GRAPH_DRAW_INFO
|
|
{
|
|
// Basic
|
|
ULONG Width;
|
|
ULONG Height;
|
|
ULONG Flags;
|
|
ULONG Step;
|
|
COLORREF BackColor;
|
|
|
|
// Data/lines
|
|
ULONG LineDataCount;
|
|
PFLOAT LineData1;
|
|
PFLOAT LineData2;
|
|
COLORREF LineColor1;
|
|
COLORREF LineColor2;
|
|
COLORREF LineBackColor1;
|
|
COLORREF LineBackColor2;
|
|
|
|
// Grid
|
|
COLORREF GridColor;
|
|
ULONG GridWidth;
|
|
FLOAT GridHeight;
|
|
ULONG GridXOffset;
|
|
ULONG GridYThreshold;
|
|
FLOAT GridBase; // Base for logarithmic grid
|
|
|
|
// y-axis label
|
|
PPH_GRAPH_LABEL_Y_FUNCTION LabelYFunction;
|
|
FLOAT LabelYFunctionParameter;
|
|
HFONT LabelYFont;
|
|
COLORREF LabelYColor;
|
|
ULONG LabelMaxYIndexLimit;
|
|
|
|
// Text
|
|
PH_STRINGREF Text;
|
|
RECT TextRect;
|
|
RECT TextBoxRect;
|
|
HFONT TextFont;
|
|
COLORREF TextColor;
|
|
COLORREF TextBoxColor;
|
|
} PH_GRAPH_DRAW_INFO, *PPH_GRAPH_DRAW_INFO;
|
|
|
|
// Graph control
|
|
|
|
#define PH_GRAPH_CLASSNAME L"PhGraph"
|
|
|
|
PHLIBAPI
|
|
BOOLEAN PhGraphControlInitialization(
|
|
VOID
|
|
);
|
|
|
|
PHLIBAPI
|
|
VOID PhDrawGraphDirect(
|
|
_In_ HDC hdc,
|
|
_In_ PVOID Bits,
|
|
_In_ PPH_GRAPH_DRAW_INFO DrawInfo
|
|
);
|
|
|
|
PHLIBAPI
|
|
VOID PhSetGraphText(
|
|
_In_ HDC hdc,
|
|
_Inout_ PPH_GRAPH_DRAW_INFO DrawInfo,
|
|
_In_ PPH_STRINGREF Text,
|
|
_In_ PRECT Margin,
|
|
_In_ PRECT Padding,
|
|
_In_ ULONG Align
|
|
);
|
|
|
|
// Configuration
|
|
|
|
typedef struct _PH_GRAPH_OPTIONS
|
|
{
|
|
COLORREF FadeOutBackColor;
|
|
ULONG FadeOutWidth;
|
|
HCURSOR DefaultCursor;
|
|
} PH_GRAPH_OPTIONS, *PPH_GRAPH_OPTIONS;
|
|
|
|
// Styles
|
|
|
|
#define GC_STYLE_FADEOUT 0x1
|
|
#define GC_STYLE_DRAW_PANEL 0x2
|
|
|
|
// Messages
|
|
|
|
#define GCM_GETDRAWINFO (WM_USER + 1301)
|
|
#define GCM_SETDRAWINFO (WM_USER + 1302)
|
|
#define GCM_DRAW (WM_USER + 1303)
|
|
#define GCM_MOVEGRID (WM_USER + 1304)
|
|
#define GCM_GETBUFFEREDCONTEXT (WM_USER + 1305)
|
|
#define GCM_SETTOOLTIP (WM_USER + 1306)
|
|
#define GCM_UPDATETOOLTIP (WM_USER + 1307)
|
|
#define GCM_GETOPTIONS (WM_USER + 1308)
|
|
#define GCM_SETOPTIONS (WM_USER + 1309)
|
|
|
|
#define Graph_GetDrawInfo(hWnd, DrawInfo) \
|
|
SendMessage((hWnd), GCM_GETDRAWINFO, 0, (LPARAM)(DrawInfo))
|
|
#define Graph_SetDrawInfo(hWnd, DrawInfo) \
|
|
SendMessage((hWnd), GCM_SETDRAWINFO, 0, (LPARAM)(DrawInfo))
|
|
#define Graph_Draw(hWnd) \
|
|
SendMessage((hWnd), GCM_DRAW, 0, 0)
|
|
#define Graph_MoveGrid(hWnd, Increment) \
|
|
SendMessage((hWnd), GCM_MOVEGRID, (WPARAM)(Increment), 0)
|
|
#define Graph_GetBufferedContext(hWnd) \
|
|
((HDC)SendMessage((hWnd), GCM_GETBUFFEREDCONTEXT, 0, 0))
|
|
#define Graph_SetTooltip(hWnd, Enable) \
|
|
((HDC)SendMessage((hWnd), GCM_SETTOOLTIP, (WPARAM)(Enable), 0))
|
|
#define Graph_UpdateTooltip(hWnd) \
|
|
((HDC)SendMessage((hWnd), GCM_UPDATETOOLTIP, 0, 0))
|
|
#define Graph_GetOptions(hWnd, Options) \
|
|
SendMessage((hWnd), GCM_GETOPTIONS, 0, (LPARAM)(Options))
|
|
#define Graph_SetOptions(hWnd, Options) \
|
|
SendMessage((hWnd), GCM_SETOPTIONS, 0, (LPARAM)(Options))
|
|
|
|
// Notifications
|
|
|
|
#define GCN_GETDRAWINFO (WM_USER + 1351)
|
|
#define GCN_GETTOOLTIPTEXT (WM_USER + 1352)
|
|
#define GCN_MOUSEEVENT (WM_USER + 1353)
|
|
#define GCN_DRAWPANEL (WM_USER + 1354)
|
|
|
|
typedef struct _PH_GRAPH_GETDRAWINFO
|
|
{
|
|
NMHDR Header;
|
|
PPH_GRAPH_DRAW_INFO DrawInfo;
|
|
} PH_GRAPH_GETDRAWINFO, *PPH_GRAPH_GETDRAWINFO;
|
|
|
|
typedef struct _PH_GRAPH_GETTOOLTIPTEXT
|
|
{
|
|
NMHDR Header;
|
|
ULONG Index;
|
|
ULONG TotalCount;
|
|
|
|
PH_STRINGREF Text; // must be null-terminated
|
|
} PH_GRAPH_GETTOOLTIPTEXT, *PPH_GRAPH_GETTOOLTIPTEXT;
|
|
|
|
typedef struct _PH_GRAPH_MOUSEEVENT
|
|
{
|
|
NMHDR Header;
|
|
ULONG Index;
|
|
ULONG TotalCount;
|
|
|
|
ULONG Message;
|
|
ULONG Keys;
|
|
POINT Point;
|
|
} PH_GRAPH_MOUSEEVENT, *PPH_GRAPH_MOUSEEVENT;
|
|
|
|
typedef struct _PH_GRAPH_DRAWPANEL
|
|
{
|
|
NMHDR Header;
|
|
HDC hdc;
|
|
RECT Rect;
|
|
} PH_GRAPH_DRAWPANEL, *PPH_GRAPH_DRAWPANEL;
|
|
|
|
// Graph buffer management
|
|
|
|
#define PH_GRAPH_DATA_COUNT(Width, Step) (((Width) + (Step) - 1) / (Step) + 1) // round up in division
|
|
|
|
typedef struct _PH_GRAPH_BUFFERS
|
|
{
|
|
PFLOAT Data1; // invalidate by setting Valid to FALSE
|
|
PFLOAT Data2; // invalidate by setting Valid to FALSE
|
|
ULONG AllocatedCount;
|
|
BOOLEAN Valid; // indicates the data is valid
|
|
} PH_GRAPH_BUFFERS, *PPH_GRAPH_BUFFERS;
|
|
|
|
PHLIBAPI
|
|
VOID PhInitializeGraphBuffers(
|
|
_Out_ PPH_GRAPH_BUFFERS Buffers
|
|
);
|
|
|
|
PHLIBAPI
|
|
VOID PhDeleteGraphBuffers(
|
|
_Inout_ PPH_GRAPH_BUFFERS Buffers
|
|
);
|
|
|
|
PHLIBAPI
|
|
VOID PhGetDrawInfoGraphBuffers(
|
|
_Inout_ PPH_GRAPH_BUFFERS Buffers,
|
|
_Inout_ PPH_GRAPH_DRAW_INFO DrawInfo,
|
|
_In_ ULONG DataCount
|
|
);
|
|
|
|
// Graph control state
|
|
|
|
// The basic buffer management structure was moved out of this section because
|
|
// the text management is not needed for most cases.
|
|
|
|
typedef struct _PH_GRAPH_STATE
|
|
{
|
|
// Union for compatibility
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
PFLOAT Data1; // invalidate by setting Valid to FALSE
|
|
PFLOAT Data2; // invalidate by setting Valid to FALSE
|
|
ULONG AllocatedCount;
|
|
BOOLEAN Valid; // indicates the data is valid
|
|
};
|
|
PH_GRAPH_BUFFERS Buffers;
|
|
};
|
|
|
|
PPH_STRING Text;
|
|
PPH_STRING TooltipText; // invalidate by setting TooltipIndex to -1
|
|
ULONG TooltipIndex; // indicates the tooltip text is valid for this index
|
|
} PH_GRAPH_STATE, *PPH_GRAPH_STATE;
|
|
|
|
PHLIBAPI
|
|
VOID PhInitializeGraphState(
|
|
_Out_ PPH_GRAPH_STATE State
|
|
);
|
|
|
|
PHLIBAPI
|
|
VOID PhDeleteGraphState(
|
|
_Inout_ PPH_GRAPH_STATE State
|
|
);
|
|
|
|
PHLIBAPI
|
|
VOID PhGraphStateGetDrawInfo(
|
|
_Inout_ PPH_GRAPH_STATE State,
|
|
_In_ PPH_GRAPH_GETDRAWINFO GetDrawInfo,
|
|
_In_ ULONG DataCount
|
|
);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|