2025-05-13 19:45:22 +03:00

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