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

673 lines
19 KiB
C

#ifndef _PH_TREENEW_H
#define _PH_TREENEW_H
#ifdef __cplusplus
extern "C" {
#endif
#define PH_TREENEW_CLASSNAME L"PhTreeNew"
#define PH_TREENEW_SEARCH_TIMEOUT 1000
#define PH_TREENEW_SEARCH_MAXIMUM_LENGTH 1023
typedef struct _PH_TREENEW_COLUMN
{
union
{
ULONG Flags;
struct
{
ULONG Visible : 1;
ULONG CustomDraw : 1;
ULONG Fixed : 1; // Whether this is the fixed column
ULONG SortDescending : 1; // Sort descending on initial click rather than ascending
ULONG DpiScaleOnAdd : 1; // Whether to DPI scale the width (only when adding)
ULONG SpareFlags : 27;
};
};
ULONG Id;
PVOID Context;
PWSTR Text;
LONG Width;
ULONG Alignment;
ULONG DisplayIndex; // -1 for fixed column or invalid
ULONG TextFlags;
struct
{
LONG ViewIndex; // Actual index in header control
LONG ViewX; // 0 for the fixed column, and an offset from the divider for normal columns
} s;
} PH_TREENEW_COLUMN, *PPH_TREENEW_COLUMN;
typedef struct _PH_TREENEW_NODE
{
union
{
ULONG Flags;
struct
{
ULONG Visible : 1;
ULONG Selected : 1;
ULONG Expanded : 1;
ULONG UseAutoForeColor : 1;
ULONG UseTempBackColor : 1;
ULONG Unselectable : 1;
ULONG SpareFlags : 26;
};
};
COLORREF BackColor;
COLORREF ForeColor;
COLORREF TempBackColor;
HFONT Font;
HICON Icon;
PPH_STRINGREF TextCache;
ULONG TextCacheSize;
ULONG Index; // Index within the flat list
ULONG Level; // 0 for root, 1, 2, ...
struct
{
union
{
ULONG Flags2;
struct
{
ULONG IsLeaf : 1;
ULONG CachedColorValid : 1;
ULONG CachedFontValid : 1;
ULONG CachedIconValid : 1;
ULONG PlusMinusHot : 1;
ULONG SpareFlags2 : 27;
};
};
// Temp. drawing data
COLORREF DrawBackColor;
COLORREF DrawForeColor;
} s;
} PH_TREENEW_NODE, *PPH_TREENEW_NODE;
// Styles
#define TN_STYLE_ICONS 0x1
#define TN_STYLE_DOUBLE_BUFFERED 0x2
#define TN_STYLE_NO_DIVIDER 0x4
#define TN_STYLE_ANIMATE_DIVIDER 0x8
#define TN_STYLE_NO_COLUMN_SORT 0x10
#define TN_STYLE_NO_COLUMN_REORDER 0x20
#define TN_STYLE_THIN_ROWS 0x40
#define TN_STYLE_NO_COLUMN_HEADER 0x80
// Extended flags
#define TN_FLAG_ITEM_DRAG_SELECT 0x1
#define TN_FLAG_NO_UNFOLDING_TOOLTIPS 0x2
// Callback flags
#define TN_CACHE 0x1
#define TN_AUTO_FORECOLOR 0x1000
// Column change flags
#define TN_COLUMN_CONTEXT 0x1
#define TN_COLUMN_TEXT 0x2
#define TN_COLUMN_WIDTH 0x4
#define TN_COLUMN_ALIGNMENT 0x8
#define TN_COLUMN_DISPLAYINDEX 0x10
#define TN_COLUMN_TEXTFLAGS 0x20
#define TN_COLUMN_FLAG_VISIBLE 0x100000
#define TN_COLUMN_FLAG_CUSTOMDRAW 0x200000
#define TN_COLUMN_FLAG_FIXED 0x400000
#define TN_COLUMN_FLAG_SORTDESCENDING 0x800000
#define TN_COLUMN_FLAG_NODPISCALEONADD 0x1000000
#define TN_COLUMN_FLAGS 0xfff00000
// Cache flags
#define TN_CACHE_COLOR 0x1
#define TN_CACHE_FONT 0x2
#define TN_CACHE_ICON 0x4
// Cell part input flags
#define TN_MEASURE_TEXT 0x1
// Cell part flags
#define TN_PART_CELL 0x1
#define TN_PART_PLUSMINUS 0x2
#define TN_PART_ICON 0x4
#define TN_PART_CONTENT 0x8
#define TN_PART_TEXT 0x10
// Hit test input flags
#define TN_TEST_COLUMN 0x1
#define TN_TEST_SUBITEM 0x2 // requires TN_TEST_COLUMN
// Hit test flags
#define TN_HIT_LEFT 0x1
#define TN_HIT_RIGHT 0x2
#define TN_HIT_ABOVE 0x4
#define TN_HIT_BELOW 0x8
#define TN_HIT_ITEM 0x10
#define TN_HIT_ITEM_PLUSMINUS 0x20 // requires TN_TEST_SUBITEM
#define TN_HIT_ITEM_ICON 0x40 // requires TN_TEST_SUBITEM
#define TN_HIT_ITEM_CONTENT 0x80 // requires TN_TEST_SUBITEM
#define TN_HIT_DIVIDER 0x100
// Selection flags
#define TN_SELECT_DESELECT 0x1
#define TN_SELECT_TOGGLE 0x2
#define TN_SELECT_RESET 0x4
// Auto-size flags
#define TN_AUTOSIZE_REMAINING_SPACE 0x1
typedef struct _PH_TREENEW_CELL_PARTS
{
ULONG Flags;
RECT RowRect;
RECT CellRect; // TN_PART_CELL
RECT PlusMinusRect; // TN_PART_PLUSMINUS
RECT IconRect; // TN_PART_ICON
RECT ContentRect; // TN_PART_CONTENT
RECT TextRect; // TN_PART_TEXT
PH_STRINGREF Text; // TN_PART_TEXT
HFONT Font; // TN_PART_TEXT
} PH_TREENEW_CELL_PARTS, *PPH_TREENEW_CELL_PARTS;
typedef struct _PH_TREENEW_HIT_TEST
{
POINT Point;
ULONG InFlags;
ULONG Flags;
PPH_TREENEW_NODE Node;
PPH_TREENEW_COLUMN Column; // requires TN_TEST_COLUMN
} PH_TREENEW_HIT_TEST, *PPH_TREENEW_HIT_TEST;
typedef enum _PH_TREENEW_MESSAGE
{
TreeNewGetChildren, // PPH_TREENEW_GET_CHILDREN Parameter1
TreeNewIsLeaf, // PPH_TREENEW_IS_LEAF Parameter1
TreeNewGetCellText, // PPH_TREENEW_GET_CELL_TEXT Parameter1
TreeNewGetNodeColor, // PPH_TREENEW_GET_NODE_COLOR Parameter1
TreeNewGetNodeFont, // PPH_TREENEW_GET_NODE_FONT Parameter1
TreeNewGetNodeIcon, // PPH_TREENEW_GET_NODE_ICON Parameter1
TreeNewGetCellTooltip, // PPH_TREENEW_GET_CELL_TOOLTIP Parameter1
TreeNewCustomDraw, // PPH_TREENEW_CUSTOM_DRAW Parameter1
// Notifications
TreeNewNodeExpanding, // PPH_TREENEW_NODE Parameter1, PPH_TREENEW_NODE_EVENT Parameter2
TreeNewNodeSelecting, // PPH_TREENEW_NODE Parameter1
TreeNewSortChanged,
TreeNewSelectionChanged,
TreeNewKeyDown, // PPH_TREENEW_KEY_EVENT Parameter1
TreeNewLeftClick, // PPH_TREENEW_MOUSE_EVENT Parameter1
TreeNewRightClick, // PPH_TREENEW_MOUSE_EVENT Parameter1
TreeNewLeftDoubleClick, // PPH_TREENEW_MOUSE_EVENT Parameter1
TreeNewRightDoubleClick, // PPH_TREENEW_MOUSE_EVENT Parameter1
TreeNewContextMenu, // PPH_TREENEW_CONTEXT_MENU Parameter1
TreeNewHeaderRightClick, // PPH_TREENEW_HEADER_MOUSE_EVENT Parameter1
TreeNewIncrementalSearch, // PPH_TREENEW_SEARCH_EVENT Parameter1
TreeNewColumnResized, // PPH_TREENEW_COLUMN Parameter1
TreeNewColumnReordered,
TreeNewDestroying,
TreeNewGetDialogCode, // ULONG Parameter1, PULONG Parameter2
MaxTreeNewMessage
} PH_TREENEW_MESSAGE;
typedef BOOLEAN (NTAPI *PPH_TREENEW_CALLBACK)(
_In_ HWND hwnd,
_In_ PH_TREENEW_MESSAGE Message,
_In_opt_ PVOID Parameter1,
_In_opt_ PVOID Parameter2,
_In_opt_ PVOID Context
);
typedef struct _PH_TREENEW_GET_CHILDREN
{
ULONG Flags;
PPH_TREENEW_NODE Node;
ULONG NumberOfChildren;
PPH_TREENEW_NODE *Children; // can be NULL if no children
} PH_TREENEW_GET_CHILDREN, *PPH_TREENEW_GET_CHILDREN;
typedef struct _PH_TREENEW_IS_LEAF
{
ULONG Flags;
PPH_TREENEW_NODE Node;
BOOLEAN IsLeaf;
} PH_TREENEW_IS_LEAF, *PPH_TREENEW_IS_LEAF;
typedef struct _PH_TREENEW_GET_CELL_TEXT
{
ULONG Flags;
PPH_TREENEW_NODE Node;
ULONG Id;
PH_STRINGREF Text;
} PH_TREENEW_GET_CELL_TEXT, *PPH_TREENEW_GET_CELL_TEXT;
typedef struct _PH_TREENEW_GET_NODE_COLOR
{
ULONG Flags;
PPH_TREENEW_NODE Node;
COLORREF BackColor;
COLORREF ForeColor;
} PH_TREENEW_GET_NODE_COLOR, *PPH_TREENEW_GET_NODE_COLOR;
typedef struct _PH_TREENEW_GET_NODE_FONT
{
ULONG Flags;
PPH_TREENEW_NODE Node;
HFONT Font;
} PH_TREENEW_GET_NODE_FONT, *PPH_TREENEW_GET_NODE_FONT;
typedef struct _PH_TREENEW_GET_NODE_ICON
{
ULONG Flags;
PPH_TREENEW_NODE Node;
HICON Icon;
} PH_TREENEW_GET_NODE_ICON, *PPH_TREENEW_GET_NODE_ICON;
typedef struct _PH_TREENEW_GET_CELL_TOOLTIP
{
ULONG Flags;
PPH_TREENEW_NODE Node;
PPH_TREENEW_COLUMN Column;
BOOLEAN Unfolding;
PH_STRINGREF Text;
HFONT Font;
ULONG MaximumWidth;
} PH_TREENEW_GET_CELL_TOOLTIP, *PPH_TREENEW_GET_CELL_TOOLTIP;
typedef struct _PH_TREENEW_CUSTOM_DRAW
{
PPH_TREENEW_NODE Node;
PPH_TREENEW_COLUMN Column;
HDC Dc;
RECT CellRect;
RECT TextRect;
} PH_TREENEW_CUSTOM_DRAW, *PPH_TREENEW_CUSTOM_DRAW;
typedef struct _PH_TREENEW_MOUSE_EVENT
{
POINT Location;
PPH_TREENEW_NODE Node;
PPH_TREENEW_COLUMN Column;
ULONG KeyFlags;
} PH_TREENEW_MOUSE_EVENT, *PPH_TREENEW_MOUSE_EVENT;
typedef struct _PH_TREENEW_KEY_EVENT
{
BOOLEAN Handled;
ULONG VirtualKey;
ULONG Data;
} PH_TREENEW_KEY_EVENT, *PPH_TREENEW_KEY_EVENT;
typedef struct _PH_TREENEW_NODE_EVENT
{
BOOLEAN Handled;
ULONG Flags;
PVOID Reserved1;
PVOID Reserved2;
} PH_TREENEW_NODE_EVENT, *PPH_TREENEW_NODE_EVENT;
typedef struct _PH_TREENEW_CONTEXT_MENU
{
POINT Location;
POINT ClientLocation;
PPH_TREENEW_NODE Node;
PPH_TREENEW_COLUMN Column;
BOOLEAN KeyboardInvoked;
} PH_TREENEW_CONTEXT_MENU, *PPH_TREENEW_CONTEXT_MENU;
typedef struct _PH_TREENEW_HEADER_MOUSE_EVENT
{
POINT ScreenLocation;
POINT Location;
POINT HeaderLocation;
PPH_TREENEW_COLUMN Column;
} PH_TREENEW_HEADER_MOUSE_EVENT, *PPH_TREENEW_HEADER_MOUSE_EVENT;
typedef struct _PH_TREENEW_SEARCH_EVENT
{
LONG FoundIndex;
LONG StartIndex;
PH_STRINGREF String;
} PH_TREENEW_SEARCH_EVENT, *PPH_TREENEW_SEARCH_EVENT;
#define TNM_FIRST (WM_USER + 1)
#define TNM_SETCALLBACK (WM_USER + 1)
#define TNM_NODESADDED (WM_USER + 2) // unimplemented
#define TNM_NODESREMOVED (WM_USER + 3) // unimplemented
#define TNM_NODESSTRUCTURED (WM_USER + 4)
#define TNM_ADDCOLUMN (WM_USER + 5)
#define TNM_REMOVECOLUMN (WM_USER + 6)
#define TNM_GETCOLUMN (WM_USER + 7)
#define TNM_SETCOLUMN (WM_USER + 8)
#define TNM_GETCOLUMNORDERARRAY (WM_USER + 9)
#define TNM_SETCOLUMNORDERARRAY (WM_USER + 10)
#define TNM_SETCURSOR (WM_USER + 11)
#define TNM_GETSORT (WM_USER + 12)
#define TNM_SETSORT (WM_USER + 13)
#define TNM_SETTRISTATE (WM_USER + 14)
#define TNM_ENSUREVISIBLE (WM_USER + 15)
#define TNM_SCROLL (WM_USER + 16)
#define TNM_GETFLATNODECOUNT (WM_USER + 17)
#define TNM_GETFLATNODE (WM_USER + 18)
#define TNM_GETCELLTEXT (WM_USER + 19)
#define TNM_SETNODEEXPANDED (WM_USER + 20)
#define TNM_GETMAXID (WM_USER + 21)
#define TNM_SETMAXID (WM_USER + 22)
#define TNM_INVALIDATENODE (WM_USER + 23)
#define TNM_INVALIDATENODES (WM_USER + 24)
#define TNM_GETFIXEDHEADER (WM_USER + 25)
#define TNM_GETHEADER (WM_USER + 26)
#define TNM_GETTOOLTIPS (WM_USER + 27)
#define TNM_SELECTRANGE (WM_USER + 28)
#define TNM_DESELECTRANGE (WM_USER + 29)
#define TNM_GETCOLUMNCOUNT (WM_USER + 30)
#define TNM_SETREDRAW (WM_USER + 31)
#define TNM_GETVIEWPARTS (WM_USER + 32)
#define TNM_GETFIXEDCOLUMN (WM_USER + 33)
#define TNM_GETFIRSTCOLUMN (WM_USER + 34)
#define TNM_SETFOCUSNODE (WM_USER + 35)
#define TNM_SETMARKNODE (WM_USER + 36)
#define TNM_SETHOTNODE (WM_USER + 37)
#define TNM_SETEXTENDEDFLAGS (WM_USER + 38)
#define TNM_GETCALLBACK (WM_USER + 39)
#define TNM_HITTEST (WM_USER + 40)
#define TNM_GETVISIBLECOLUMNCOUNT (WM_USER + 41)
#define TNM_AUTOSIZECOLUMN (WM_USER + 42)
#define TNM_SETEMPTYTEXT (WM_USER + 43)
#define TNM_SETROWHEIGHT (WM_USER + 44)
#define TNM_ISFLATNODEVALID (WM_USER + 45)
#define TNM_LAST (WM_USER + 45)
#define TreeNew_SetCallback(hWnd, Callback, Context) \
SendMessage((hWnd), TNM_SETCALLBACK, (WPARAM)(Context), (LPARAM)(Callback))
#define TreeNew_NodesStructured(hWnd) \
SendMessage((hWnd), TNM_NODESSTRUCTURED, 0, 0)
#define TreeNew_AddColumn(hWnd, Column) \
SendMessage((hWnd), TNM_ADDCOLUMN, 0, (LPARAM)(Column))
#define TreeNew_RemoveColumn(hWnd, Id) \
SendMessage((hWnd), TNM_REMOVECOLUMN, (WPARAM)(Id), 0)
#define TreeNew_GetColumn(hWnd, Id, Column) \
SendMessage((hWnd), TNM_GETCOLUMN, (WPARAM)(Id), (LPARAM)(Column))
#define TreeNew_SetColumn(hWnd, Mask, Column) \
SendMessage((hWnd), TNM_SETCOLUMN, (WPARAM)(Mask), (LPARAM)(Column))
#define TreeNew_GetColumnOrderArray(hWnd, Count, Array) \
SendMessage((hWnd), TNM_GETCOLUMNORDERARRAY, (WPARAM)(Count), (LPARAM)(Array))
#define TreeNew_SetColumnOrderArray(hWnd, Count, Array) \
SendMessage((hWnd), TNM_SETCOLUMNORDERARRAY, (WPARAM)(Count), (LPARAM)(Array))
#define TreeNew_SetCursor(hWnd, Cursor) \
SendMessage((hWnd), TNM_SETCURSOR, 0, (LPARAM)(Cursor))
#define TreeNew_GetSort(hWnd, Column, Order) \
SendMessage((hWnd), TNM_GETSORT, (WPARAM)(Column), (LPARAM)(Order))
#define TreeNew_SetSort(hWnd, Column, Order) \
SendMessage((hWnd), TNM_SETSORT, (WPARAM)(Column), (LPARAM)(Order))
#define TreeNew_SetTriState(hWnd, TriState) \
SendMessage((hWnd), TNM_SETTRISTATE, (WPARAM)(TriState), 0)
#define TreeNew_EnsureVisible(hWnd, Node) \
SendMessage((hWnd), TNM_ENSUREVISIBLE, 0, (LPARAM)(Node))
#define TreeNew_Scroll(hWnd, DeltaRows, DeltaX) \
SendMessage((hWnd), TNM_SCROLL, (WPARAM)(DeltaRows), (LPARAM)(DeltaX))
#define TreeNew_GetFlatNodeCount(hWnd) \
((ULONG)SendMessage((hWnd), TNM_GETFLATNODECOUNT, 0, 0))
#define TreeNew_GetFlatNode(hWnd, Index) \
((PPH_TREENEW_NODE)SendMessage((hWnd), TNM_GETFLATNODE, (WPARAM)(Index), 0))
#define TreeNew_GetCellText(hWnd, GetCellText) \
SendMessage((hWnd), TNM_GETCELLTEXT, 0, (LPARAM)(GetCellText))
#define TreeNew_SetNodeExpanded(hWnd, Node, Expanded) \
SendMessage((hWnd), TNM_SETNODEEXPANDED, (WPARAM)(Expanded), (LPARAM)(Node))
#define TreeNew_GetMaxId(hWnd) \
((ULONG)SendMessage((hWnd), TNM_GETMAXID, 0, 0))
#define TreeNew_SetMaxId(hWnd, MaxId) \
SendMessage((hWnd), TNM_SETMAXID, (WPARAM)(MaxId), 0)
#define TreeNew_InvalidateNode(hWnd, Node) \
SendMessage((hWnd), TNM_INVALIDATENODE, 0, (LPARAM)(Node))
#define TreeNew_InvalidateNodes(hWnd, Start, End) \
SendMessage((hWnd), TNM_INVALIDATENODES, (WPARAM)(Start), (LPARAM)(End))
#define TreeNew_GetFixedHeader(hWnd) \
((HWND)SendMessage((hWnd), TNM_GETFIXEDHEADER, 0, 0))
#define TreeNew_GetHeader(hWnd) \
((HWND)SendMessage((hWnd), TNM_GETHEADER, 0, 0))
#define TreeNew_GetTooltips(hWnd) \
((HWND)SendMessage((hWnd), TNM_GETTOOLTIPS, 0, 0))
#define TreeNew_SelectRange(hWnd, Start, End) \
SendMessage((hWnd), TNM_SELECTRANGE, (WPARAM)(Start), (LPARAM)(End))
#define TreeNew_DeselectRange(hWnd, Start, End) \
SendMessage((hWnd), TNM_DESELECTRANGE, (WPARAM)(Start), (LPARAM)(End))
#define TreeNew_GetColumnCount(hWnd) \
((ULONG)SendMessage((hWnd), TNM_GETCOLUMNCOUNT, 0, 0))
#define TreeNew_SetRedraw(hWnd, Redraw) \
((LONG)SendMessage((hWnd), TNM_SETREDRAW, (WPARAM)(Redraw), 0))
#define TreeNew_GetViewParts(hWnd, Parts) \
SendMessage((hWnd), TNM_GETVIEWPARTS, 0, (LPARAM)(Parts))
#define TreeNew_GetFixedColumn(hWnd) \
((PPH_TREENEW_COLUMN)SendMessage((hWnd), TNM_GETFIXEDCOLUMN, 0, 0))
#define TreeNew_GetFirstColumn(hWnd) \
((PPH_TREENEW_COLUMN)SendMessage((hWnd), TNM_GETFIRSTCOLUMN, 0, 0))
#define TreeNew_SetFocusNode(hWnd, Node) \
SendMessage((hWnd), TNM_SETFOCUSNODE, 0, (LPARAM)(Node))
#define TreeNew_SetMarkNode(hWnd, Node) \
SendMessage((hWnd), TNM_SETMARKNODE, 0, (LPARAM)(Node))
#define TreeNew_SetHotNode(hWnd, Node) \
SendMessage((hWnd), TNM_SETHOTNODE, 0, (LPARAM)(Node))
#define TreeNew_SetExtendedFlags(hWnd, Mask, Value) \
SendMessage((hWnd), TNM_SETEXTENDEDFLAGS, (WPARAM)(Mask), (LPARAM)(Value))
#define TreeNew_GetCallback(hWnd, Callback, Context) \
SendMessage((hWnd), TNM_GETCALLBACK, (WPARAM)(Context), (LPARAM)(Callback))
#define TreeNew_HitTest(hWnd, HitTest) \
SendMessage((hWnd), TNM_HITTEST, 0, (LPARAM)(HitTest))
#define TreeNew_GetVisibleColumnCount(hWnd) \
((ULONG)SendMessage((hWnd), TNM_GETVISIBLECOLUMNCOUNT, 0, 0))
#define TreeNew_AutoSizeColumn(hWnd, Id, Flags) \
SendMessage((hWnd), TNM_AUTOSIZECOLUMN, (WPARAM)(Id), (LPARAM)(Flags))
#define TreeNew_SetEmptyText(hWnd, Text, Flags) \
SendMessage((hWnd), TNM_SETEMPTYTEXT, (WPARAM)(Flags), (LPARAM)(Text))
#define TreeNew_SetRowHeight(hWnd, RowHeight) \
SendMessage((hWnd), TNM_SETROWHEIGHT, (WPARAM)(RowHeight), 0)
#define TreeNew_IsFlatNodeValid(hWnd) \
((BOOLEAN)SendMessage((hWnd), TNM_ISFLATNODEVALID, 0, 0))
typedef struct _PH_TREENEW_VIEW_PARTS
{
RECT ClientRect;
LONG HeaderHeight;
LONG RowHeight;
ULONG VScrollWidth;
ULONG HScrollHeight;
LONG VScrollPosition;
LONG HScrollPosition;
LONG FixedWidth;
LONG NormalLeft;
LONG NormalWidth;
} PH_TREENEW_VIEW_PARTS, *PPH_TREENEW_VIEW_PARTS;
PHLIBAPI
BOOLEAN PhTreeNewInitialization(
VOID
);
FORCEINLINE VOID PhInitializeTreeNewNode(
_In_ PPH_TREENEW_NODE Node
)
{
memset(Node, 0, sizeof(PH_TREENEW_NODE));
Node->Visible = TRUE;
Node->Expanded = TRUE;
}
FORCEINLINE VOID PhInvalidateTreeNewNode(
_Inout_ PPH_TREENEW_NODE Node,
_In_ ULONG Flags
)
{
if (Flags & TN_CACHE_COLOR)
Node->s.CachedColorValid = FALSE;
if (Flags & TN_CACHE_FONT)
Node->s.CachedFontValid = FALSE;
if (Flags & TN_CACHE_ICON)
Node->s.CachedIconValid = FALSE;
}
FORCEINLINE BOOLEAN PhAddTreeNewColumn(
_In_ HWND hwnd,
_In_ ULONG Id,
_In_ BOOLEAN Visible,
_In_ PWSTR Text,
_In_ ULONG Width,
_In_ ULONG Alignment,
_In_ ULONG DisplayIndex,
_In_ ULONG TextFlags
)
{
PH_TREENEW_COLUMN column;
memset(&column, 0, sizeof(PH_TREENEW_COLUMN));
column.Id = Id;
column.Visible = Visible;
column.Text = Text;
column.Width = Width;
column.Alignment = Alignment;
column.DisplayIndex = DisplayIndex;
column.TextFlags = TextFlags;
column.DpiScaleOnAdd = TRUE;
if (DisplayIndex == -2)
column.Fixed = TRUE;
return !!TreeNew_AddColumn(hwnd, &column);
}
FORCEINLINE BOOLEAN PhAddTreeNewColumnEx(
_In_ HWND hwnd,
_In_ ULONG Id,
_In_ BOOLEAN Visible,
_In_ PWSTR Text,
_In_ ULONG Width,
_In_ ULONG Alignment,
_In_ ULONG DisplayIndex,
_In_ ULONG TextFlags,
_In_ BOOLEAN SortDescending
)
{
PH_TREENEW_COLUMN column;
memset(&column, 0, sizeof(PH_TREENEW_COLUMN));
column.Id = Id;
column.Visible = Visible;
column.Text = Text;
column.Width = Width;
column.Alignment = Alignment;
column.DisplayIndex = DisplayIndex;
column.TextFlags = TextFlags;
column.DpiScaleOnAdd = TRUE;
if (DisplayIndex == -2)
column.Fixed = TRUE;
if (SortDescending)
column.SortDescending = TRUE;
return !!TreeNew_AddColumn(hwnd, &column);
}
FORCEINLINE BOOLEAN PhAddTreeNewColumnEx2(
_In_ HWND hwnd,
_In_ ULONG Id,
_In_ BOOLEAN Visible,
_In_ PWSTR Text,
_In_ ULONG Width,
_In_ ULONG Alignment,
_In_ ULONG DisplayIndex,
_In_ ULONG TextFlags,
_In_ ULONG ExtraFlags
)
{
PH_TREENEW_COLUMN column;
memset(&column, 0, sizeof(PH_TREENEW_COLUMN));
column.Id = Id;
column.Visible = Visible;
column.Text = Text;
column.Width = Width;
column.Alignment = Alignment;
column.DisplayIndex = DisplayIndex;
column.TextFlags = TextFlags;
if (DisplayIndex == -2)
column.Fixed = TRUE;
if (ExtraFlags & TN_COLUMN_FLAG_CUSTOMDRAW)
column.CustomDraw = TRUE;
if (ExtraFlags & TN_COLUMN_FLAG_SORTDESCENDING)
column.SortDescending = TRUE;
if (!(ExtraFlags & TN_COLUMN_FLAG_NODPISCALEONADD))
column.DpiScaleOnAdd = TRUE;
return !!TreeNew_AddColumn(hwnd, &column);
}
#ifdef __cplusplus
}
#endif
#endif