#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