ReactOS  0.4.12-dev-919-gfc3b8d5
treelist.c File Reference
#include "reactos.h"
#include "treelist.h"
Include dependency graph for treelist.c:

Go to the source code of this file.

Classes

struct  BaseItem
 
struct  ExtraItem
 
struct  ColumnData
 
struct  TreeListData
 

Macros

#define new(TYPE, numElems)   HeapAlloc(GetProcessHeap(), 0, (numElems) * sizeof(TYPE))
 
#define delete(ptr)   HeapFree(GetProcessHeap(), 0, (ptr))
 
#define GWLP_USERDATA   GWL_USERDATA
 
#define GWLP_WNDPROC   GWL_WNDPROC
 
#define SetWindowLongPtr   SetWindowLong
 
#define GetWindowLongPtr   GetWindowLong
 
#define DWORD_PTR   DWORD
 
#define LONG_PTR   LONG
 
#define str_len   (unsigned)strlen
 
#define str_cmp   strcmp
 
#define str_ncpy   strncpy
 
#define str_ncmp   strncmp
 
#define str_icmp   _stricmp
 
#define WM_MOUSEWHEEL   0x020A
 
#define WHEEL_DELTA   120
 
#define MAX_COLUMNS   32
 
#define MAX_COLORS   16
 
#define EN_SETTEXT   0x1000
 
#define EN_RETURN   0x1578
 
#define EN_ESCAPE   0x1579
 
#define ID_TOOLTIPCHECK   0x3912
 
#define SORT_NOUPDATE   1234567
 
#define VK_ISACHAR   0x01000000
 
#define FIRST_LINE   0xFFFFFFFE
 
#define FROM_HEADER   0x88776655
 
#define I_CCB   I_CHILDRENCALLBACK
 
#define U(h)   ((unsigned)(h))
 
#define THEMEIMGLIST   ((HIMAGELIST)1)
 
#define GetHandle(h)   ((TreeListData*)GetWindowLongPtr(h,0))
 
#define TVIF_ALL   (TVIF_CHILDREN|TVIF_HANDLE|TVIF_IMAGE|TVIF_PARAM|TVIF_SELECTEDIMAGE|TVIF_STATE|TVIF_TEXT)
 
#define UNLOCK(d)   ReleaseSemaphore(d->hSem,1,NULL)
 
#define LOCK(d)   WaitForSingleObject(d->hSem,INFINITE)
 
#define TVIS_EDIT(m)   ((1<<m)&((1<<TVAX_EDIT)|(1<<TVAX_COMBO)|(1<<TVAX_STEPED)|(1<<TVAX_CHECKED)))
 
#define TVIS_BASEFLAGS   (TVIS_EXPANDED|TVIS_EXPANDEDONCE|TVIS_EXPANDPARTIAL|TVIS_SELECTED)
 
#define TVIS_TRACKED   (TVIX_TRACKED<<16)
 
#define TVIS_BKCOLOR   (TVIX_BKCOLOR<<16)
 
#define TVIS_FOCUSED   (TVIX_FOCUSED<<16)
 
#define TVIS_TEXTCOLOR   (TVIX_TEXTCOLOR<<16)
 
#define TVC_ONLYFOCUS   TVIF_ONLYFOCUS
 
#define TVC_UNSELECT   0x4000
 
#define TVC_DESELECT   0x8000
 
#define DEFAULT_IDENT   19
 
#define DEFAULT_SHIFT   7
 
#define BPBF_COMPATIBLEBITMAP   0
 
#define TVP_GLYPH   2
 
#define GLPS_CLOSED   1
 
#define GLPS_OPENED   2
 
#define BP_CHECKBOX   3
 
#define CBS_UNCHECKEDNORMAL   1
 
#define CBS_CHECKEDNORMAL   5
 
#define TVAX_NONE   (TVAE_NONE >>TVAE_MODEPOS)
 
#define TVAX_EDIT   (TVAE_EDIT >>TVAE_MODEPOS)
 
#define TVAX_COMBO   (TVAE_COMBO >>TVAE_MODEPOS)
 
#define TVAX_CBLIST   (TVAE_CBLIST >>TVAE_MODEPOS)
 
#define TVAX_STEP   (TVAE_STEP >>TVAE_MODEPOS)
 
#define TVAX_STEPED   (TVAE_STEPED >>TVAE_MODEPOS)
 
#define TVAX_CHECK   (TVAE_CHECK >>TVAE_MODEPOS)
 
#define TVAX_CHECKED   (TVAE_CHECKED>>TVAE_MODEPOS)
 
#define TVIX_VARBUTTON   0x01
 
#define TVIX_HASBUTTON   0x02
 
#define TVIX_HASIMAGE   0x04
 
#define TVIX_TRACKED   0x08
 
#define TVIX_TEXTCOLOR   0x10
 
#define TVIX_BKCOLOR   0x20
 
#define TVIX_FOCUSED   0x40
 
#define XCHANGE_MEM(a, b)   uTemp=pItemList[a];pItemList[a]=pItemList[b];pItemList[b]=uTemp;
 
#define XCHANGE_MEM(a, b)   uTemp=pItemList[a];pItemList[a]=pItemList[b];pItemList[b]=uTemp;
 
#define XCHANGE_MEM(a, b)   uTemp=pItemList[a];pItemList[a]=pItemList[b];pItemList[b]=uTemp;
 

Typedefs

typedef HRESULT(WINAPISetWindowThemeT) (HWND, LPCWSTR, LPCWSTR)
 
typedef HRESULT(WINAPIEndBufferedPtT) (HANDLE, BOOL)
 
typedef HANDLE(WINAPIBeginBufferedPnT) (HDC, RECT *, DWORD, LPVOID, HDC *)
 
typedef HRESULT(WINAPIBufferedPtInitT) (VOID)
 
typedef LPVOID(WINAPIOpenThemeDataT) (HWND hwnd, LPCWSTR pszClassList)
 
typedef HRESULT(WINAPICloseThemeDataT) (LPVOID)
 
typedef HRESULT(WINAPIDrawThemeBackgT) (LPVOID, HDC, int, int, const RECT *, const RECT *)
 
typedef HRESULT(WINAPIGetThemeBackgRcT) (LPVOID, HDC, int, int, LPCRECT, LPRECT)
 
typedef BOOL(WINAPIIsAppThemedT) ()
 
typedef BOOL(WINAPIIsThemeActiveT) ()
 

Functions

static void TreeListDraw (HWND hWnd, HDC hDc, RECT *pRect)
 
static LRESULT CALLBACK TreeListProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static int TreeListSelectItem (TreeListData *pData, unsigned uItem, unsigned uSubItem, int iMode)
 
static int TreeListGetItemRect (TreeListData *pData, unsigned uItem, unsigned uFlags, RECT *pRect)
 
static int TreeListStartNotifyEdit (TreeListData *pData, unsigned uItem, unsigned uSub, WPARAM wParam, LPARAM lParam)
 
static int TreeListStartAutoEdit (TreeListData *pData, unsigned uColumn, WPARAM wParam, LPARAM lParam)
 
static int TreeListEndLabelEdit (TreeListData *pData, int iMode)
 
int TreeListRegister (HINSTANCE hInstance)
 
BOOL TreeListUnregister (HINSTANCE hInstance)
 
static void GlobalInit ()
 
static void GlobalDeinit ()
 
static LRESULT SendNotify (TreeListData *pData, NMHDR *pNotify)
 
static void CallbackEntry (TreeListData *pData, BaseItem *pEntry, unsigned uItem, unsigned uFlags, int *iImage, unsigned *uTextSize, LPCTSTR *pText)
 
static void CallbackExtra (TreeListData *pData, BaseItem *pEntry, ExtraItem *pExtra, unsigned uItem, unsigned uSub, unsigned uFlags, int *iImage, unsigned *uTextSize, LPCTSTR *pText)
 
static LRESULT CALLBACK EditProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static LRESULT CALLBACK ToolProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static void ChangeColSize (TreeListData *pData, int iDelta)
 
static void CreateToolTip (TreeListData *pData)
 
static void CreateStateImageList (TreeListData *pData, int iMode)
 
static HIMAGELIST CreateDragImage (TreeListData *pData, unsigned uItem, unsigned uSub)
 
static void UpdateColorsList (TreeListData *pData)
 
static int UpdateHeight (TreeListData *pData)
 
static int UpdateRect (TreeListData *pData, unsigned uItem, unsigned uSub)
 
static int UpdateColRect (TreeListData *pData, unsigned uColumn)
 
static int UpdateRow (TreeListData *pData, unsigned uItem)
 
static void UpdateView (TreeListData *pData)
 
static void UpdateScrollX (TreeListData *pData)
 
static void UpdateScrollY (TreeListData *pData)
 
static void UpdateToolTip (TreeListData *pData, unsigned uItem, unsigned uFlags)
 
static int CreateFontset (TreeListData *pData, HFONT hFont)
 
static int UpdateFont (TreeListData *pData)
 
static void UpdateItems (TreeListData *pData, unsigned uItem)
 
static int UpdateColumns (TreeListData *pData)
 
static int TreeListSetOrderArray (TreeListData *pData, unsigned uItems, unsigned *pArray)
 
static int TreeListToggleItem (TreeListData *pData, unsigned uItem, unsigned uAddFlags)
 
static int TreeListEnsureVisible (TreeListData *pData, unsigned uItem, unsigned uSub)
 
static int TreeListIsVisible (TreeListData *pData, unsigned uItem, unsigned uSub)
 
static int TreeListDeleteItem (TreeListData *pData, unsigned uItem, int iMode)
 
static int TreeListXorSelectItem (TreeListData *pData, unsigned uItem, int iMode)
 
static void TreeListRemoveFocus (TreeListData *pData)
 
static int TreeListSetFocus (TreeListData *pData, unsigned uItem, unsigned uSub)
 
static int TreeListSelectChilds (TreeListData *pData, unsigned uItem, int iMode)
 
static unsigned TreeListInsertItem (TreeListData *pData, TV_INSERTSTRUCT *pInsert)
 
static int TreeListSetItem (TreeListData *pData, const TV_ITEM *pItem)
 
static unsigned TreeListGetItem (TreeListData *pData, TV_ITEM *pItem)
 
static int TreeListDeleteColumn (TreeListData *pData, unsigned uCol)
 
static int TreeListInsertColumn (TreeListData *pData, unsigned uCol, TV_COLUMN *pColumn)
 
static int TreeListScanColumn (TreeListData *pData, unsigned uSub)
 
static unsigned TreeListHitTest (TreeListData *pData, TV_HITTESTINFO *pInfo)
 
static unsigned TreeListSetInsertMark (TreeListData *pData, unsigned uItem, int iMode)
 
static LRESULT TreeListGetItemColor (TreeListData *pData, unsigned uItem, unsigned uSub, int iMode)
 
static COLORREF TreeListSetItemColor (TreeListData *pData, unsigned uItem, unsigned uSub, COLORREF uColor, int iMode)
 
static int TreeListSetTrackItem (TreeListData *pData, unsigned uItem, unsigned uSub)
 
static unsigned TreeListGetNextItem (TreeListData *pData, unsigned uItem, unsigned uFlags)
 
static unsigned TreeListFindItem (TreeListData *pData, unsigned uItem, TVFIND *pFind)
 
static unsigned TreeListNextSelUntil (TreeListData *pData, unsigned uItem, unsigned uStop)
 
static unsigned TreeListNextUnselUntil (TreeListData *pData, unsigned uItem, unsigned uStop)
 
static void TreeListChangeCheckbox (TreeListData *pData, UINT uItem, int iPosX, int iPosY)
 
static void TreeListMouseNotify (TreeListData *pData, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static void TreeListMouseClick (TreeListData *pData, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static void TreeListChar (TreeListData *pData, UINT nChar, LPARAM lParam)
 
static void TreeListKeyDown (TreeListData *pData, WPARAM wParam, LPARAM lParam)
 
static int TreeListSortItemsEx (TreeListData *pData, TV_SORTEX *pSortData, int iMode)
 
static int TreeListSortItemsCb (TreeListData *pData, TV_SORTCB *pSortData, int iMode)
 
static int TreeListSortItems (TreeListData *pData, unsigned uParent, int iMode)
 
static HWND TreeListEditLabel (TreeListData *pData, unsigned uItem, unsigned uSub)
 

Variables

static HMODULE hUxThemeDll = NULL
 
static SetWindowThemeT pSetWindowTheme = NULL
 
static EndBufferedPtT pEndBufferedPt = NULL
 
static BeginBufferedPnT pBeginBufferedPt = NULL
 
static BufferedPtInitT pBufferedPtInit = NULL
 
static BufferedPtInitT pBufferedPtExit = NULL
 
static OpenThemeDataT pOpenThemeData = NULL
 
static CloseThemeDataT pCloseThemeData = NULL
 
static DrawThemeBackgT pDrawThemeBackg = NULL
 
static GetThemeBackgRcT pGetThemeBackgRc = NULL
 
static IsAppThemedT pIsAppThemed = NULL
 
static IsThemeActiveT pIsThemeActive = NULL
 
static HPEN hPatternPen = NULL
 
static HFONT hDefaultFontN = NULL
 
static HFONT hDefaultFontB = NULL
 
static LONG lWindowCount = -1
 
static RECT sToolRect = { -2, 0, 2, 64}
 
static TCHAR cKeyData [16]
 
static unsigned uKeyLast
 
static unsigned uKeyPos
 
static BOOL bDrawWithTheme = FALSE
 

Macro Definition Documentation

◆ BP_CHECKBOX

#define BP_CHECKBOX   3

Definition at line 145 of file treelist.c.

◆ BPBF_COMPATIBLEBITMAP

#define BPBF_COMPATIBLEBITMAP   0

Definition at line 133 of file treelist.c.

◆ CBS_CHECKEDNORMAL

#define CBS_CHECKEDNORMAL   5

Definition at line 151 of file treelist.c.

◆ CBS_UNCHECKEDNORMAL

#define CBS_UNCHECKEDNORMAL   1

Definition at line 148 of file treelist.c.

◆ DEFAULT_IDENT

#define DEFAULT_IDENT   19

Definition at line 130 of file treelist.c.

◆ DEFAULT_SHIFT

#define DEFAULT_SHIFT   7

Definition at line 131 of file treelist.c.

◆ delete

#define delete (   ptr)    HeapFree(GetProcessHeap(), 0, (ptr))

Definition at line 56 of file treelist.c.

◆ DWORD_PTR

typedef DWORD_PTR   DWORD

Definition at line 76 of file treelist.c.

Referenced by __delayLoadHelper2(), __mingw_GetSectionForAddress(), _SetOperationTexts(), add_unformatted_text_to_control(), CNotifyToolbar::AddButton(), AddExtension(), AddJob(), CTaskSwitchWnd::AddTaskItemButton(), ADPCM_StreamOpen(), CKsProxy::AdvisePeriodic(), CKsProxy::AdviseTime(), alarmThreadMain(), alloc_device(), alloc_serverprotoseq(), BackgroundCopyJobConstructor(), BaseRenderer_Init(), bDDCreateSurface(), Binding_Create(), BitmapClipper_Create(), BitmapImpl_Create(), BitmapScaler_Create(), BmpDecoder_Create(), buffer_process_converted_attribute(), CalculateNextStartTime(), chm_dup(), chm_openW(), COMBOEX_GetItemData(), ComponentEnum_Clone(), ContextPropertyList_Create(), CoRegisterInitializeSpy(), create_binding_protocol(), CreateComponentEnumerator(), CreateIProp(), CISFBand::CreateSimpleToolbar(), CreateTextServices(), CRYPT_CollectionOpenStore(), CRYPT_MemOpenStore(), CRYPT_RegOpenStore(), CryptInitOIDFunctionSet(), DdeCallback(), DirectSoundCaptureDevice_Create(), DirectSoundDevice_Create(), DispCallFunc(), do_error_dialog(), DoOpenFile(), DoSaveFile(), dplay_create(), dplobby_create(), dump_exception_info(), dwarf2_virtual_unwind(), DxEngGetDCState(), DxEngGetHdevData(), EnumObjects(), EventsQueue_Init(), field_format_public_key(), FileAsyncReader_Construct(), FilterGraph_create(), FlipRotator_Create(), FormatConverter_CreateInstance(), G711_StreamOpen(), get_or_create_threaddata(), get_rtf_text(), GetTimeAsJobTime(), GetWindowThreadProcessId(), GifDecoder_CreateInstance(), GifEncoder_CreateInstance(), handle_create(), HTTP_HttpOpenRequestW(), i386_stack_walk(), IcoDecoder_CreateInstance(), IDirectSoundCaptureBufferImpl_GetCurrentPosition(), IDirectSoundCaptureBufferImpl_Start(), IFileDialogCustomize_fnAddMenu(), INET_QueryOption(), init_handle_table(), initialize_directinput_instance(), InitializeTestImage(), IntFlashWindowEx(), IsBlockFromHeap(), IWICStreamImpl_InitializeFromIStreamRegion(), IWICStreamImpl_InitializeFromMemory(), MCI_MapMsgAtoW(), MCI_SendCommandAsync(), MCIAVI_drvOpen(), MCIAVI_mciStatus(), MCICDA_drvOpen(), mciSendStringW(), MCIWndProc(), ME_StreamInRTFString(), MetadataReader_Create(), midiStreamOpen(), MimeInternational_Construct(), mixerOpen(), MMDevice_Create(), MMDRV_Open(), MmeOpenDevice(), modOpen(), msi_scrolltext_add_text(), MyCompare(), NBCmdQueueCreate(), NBNameCacheCreate(), NetBIOSInit(), NetBIOSRegisterAdapter(), NetBTCall(), NetGroupEnum(), NetGroupGetUsers(), NetLocalGroupEnum(), NetUserEnum(), NtUserCallNoParam(), NtUserCallOneParam(), NtUserCallTwoParam(), NtUserGetThreadState(), NtUserQueryWindow(), OleUIAddVerbMenuW(), OnControl(), CConfirmReplace::OnInitDialog(), CZipPassword::OnInitDialog(), OutputQueue_Construct(), PaletteImpl_Create(), ParseImageSymbols(), paste_rtf(), paste_text(), PCM_StreamOpen(), pdb_virtual_unwind(), PosPassThru_Construct(), PrepareWaveHeader(), ProcessIdToHandle(), promptdisk_init(), PropertyStorage_BaseConstruct(), PropertyStore_CreateInstance(), PullPin_Init(), QUARTZ_CreateSystemClock(), query_option(), queue_task(), QueueWaveBuffer(), RegQueryMultipleValuesA(), RegQueryMultipleValuesW(), revoke_class_object_thread(), RpcAssoc_Alloc(), rpcrt4_ncacn_http_alloc(), RunCommand(), RuntimeHost_Construct(), SeekPlayback(), set_space_status(), CToolbar<>::SetItemData(), SHELL_ConfirmDialogW(), SHGetFileInfoW(), show_cursor_thread(), StartPlayback(), StdMemAllocator_create(), STGMEDIUM_UserMarshal(), StopPlayback(), SystemClockImpl_AdvisePeriodic(), SystemClockImpl_AdviseTime(), test_AbortWaitCts(), test_affinity(), test_alignment_style(), test_cf_dataobject(), test_EM_GETMODIFY(), test_EM_SETTEXTEX(), test_EM_STREAMIN(), test_EM_STREAMOUT(), test_EM_STREAMOUT_empty_para(), test_EM_STREAMOUT_FONTTBL(), test_eop_char_fmt(), test_FakeDLL(), test_mciParser(), test_openCloseWAVE(), test_para_numbering(), test_play(), test_query_process(), test_recordWAVE(), test_rtf(), test_SysAllocString(), test_WaitBreak(), test_WaitCts(), test_WaitDcd(), test_WaitDsr(), test_WaitRing(), TgaDecoder_CreateInstance(), timer_queue_cb5(), TogglePlaybackState(), ToolbarInsertSpaceForControl(), TransformFilter_Init(), TREEVIEW_SendCustomDrawItemNotify(), TREEVIEW_SetCursor(), VerifyObjectOwner(), WahOpenCurrentThread(), wave_out_test_deviceOut(), WbemPath_create(), WbemServices_create(), widCallback(), widOpen(), widPrepare(), WINHELP_SetupText(), WinHttpRequest_create(), wodOpen(), wodPrepare(), and WPUQueryBlockingCallback().

◆ EN_ESCAPE

#define EN_ESCAPE   0x1579

Definition at line 107 of file treelist.c.

◆ EN_RETURN

#define EN_RETURN   0x1578

Definition at line 106 of file treelist.c.

◆ EN_SETTEXT

#define EN_SETTEXT   0x1000

Definition at line 105 of file treelist.c.

◆ FIRST_LINE

#define FIRST_LINE   0xFFFFFFFE

Definition at line 111 of file treelist.c.

◆ FROM_HEADER

#define FROM_HEADER   0x88776655

Definition at line 112 of file treelist.c.

◆ GetHandle

#define GetHandle (   h)    ((TreeListData*)GetWindowLongPtr(h,0))

Definition at line 116 of file treelist.c.

◆ GetWindowLongPtr

#define GetWindowLongPtr   GetWindowLong

Definition at line 73 of file treelist.c.

◆ GLPS_CLOSED

#define GLPS_CLOSED   1

Definition at line 139 of file treelist.c.

◆ GLPS_OPENED

#define GLPS_OPENED   2

Definition at line 142 of file treelist.c.

◆ GWLP_USERDATA

#define GWLP_USERDATA   GWL_USERDATA

Definition at line 63 of file treelist.c.

◆ GWLP_WNDPROC

#define GWLP_WNDPROC   GWL_WNDPROC

Definition at line 66 of file treelist.c.

◆ I_CCB

Definition at line 113 of file treelist.c.

◆ ID_TOOLTIPCHECK

#define ID_TOOLTIPCHECK   0x3912

Definition at line 108 of file treelist.c.

◆ LOCK

#define LOCK (   d)    WaitForSingleObject(d->hSem,INFINITE)

Definition at line 119 of file treelist.c.

◆ LONG_PTR

◆ MAX_COLORS

#define MAX_COLORS   16

Definition at line 104 of file treelist.c.

◆ MAX_COLUMNS

#define MAX_COLUMNS   32

Definition at line 102 of file treelist.c.

◆ new

#define new (   TYPE,
  numElems 
)    HeapAlloc(GetProcessHeap(), 0, (numElems) * sizeof(TYPE))

Definition at line 54 of file treelist.c.

◆ SetWindowLongPtr

#define SetWindowLongPtr   SetWindowLong

Definition at line 70 of file treelist.c.

◆ SORT_NOUPDATE

#define SORT_NOUPDATE   1234567

Definition at line 109 of file treelist.c.

◆ str_cmp

#define str_cmp   strcmp

Definition at line 90 of file treelist.c.

◆ str_icmp

#define str_icmp   _stricmp

Definition at line 93 of file treelist.c.

◆ str_len

#define str_len   (unsigned)strlen

Definition at line 89 of file treelist.c.

◆ str_ncmp

#define str_ncmp   strncmp

Definition at line 92 of file treelist.c.

◆ str_ncpy

#define str_ncpy   strncpy

Definition at line 91 of file treelist.c.

◆ THEMEIMGLIST

#define THEMEIMGLIST   ((HIMAGELIST)1)

Definition at line 115 of file treelist.c.

◆ TVAX_CBLIST

#define TVAX_CBLIST   (TVAE_CBLIST >>TVAE_MODEPOS)

Definition at line 158 of file treelist.c.

◆ TVAX_CHECK

#define TVAX_CHECK   (TVAE_CHECK >>TVAE_MODEPOS)

Definition at line 161 of file treelist.c.

◆ TVAX_CHECKED

#define TVAX_CHECKED   (TVAE_CHECKED>>TVAE_MODEPOS)

Definition at line 162 of file treelist.c.

◆ TVAX_COMBO

#define TVAX_COMBO   (TVAE_COMBO >>TVAE_MODEPOS)

Definition at line 157 of file treelist.c.

◆ TVAX_EDIT

#define TVAX_EDIT   (TVAE_EDIT >>TVAE_MODEPOS)

Definition at line 156 of file treelist.c.

◆ TVAX_NONE

#define TVAX_NONE   (TVAE_NONE >>TVAE_MODEPOS)

Definition at line 155 of file treelist.c.

◆ TVAX_STEP

#define TVAX_STEP   (TVAE_STEP >>TVAE_MODEPOS)

Definition at line 159 of file treelist.c.

◆ TVAX_STEPED

#define TVAX_STEPED   (TVAE_STEPED >>TVAE_MODEPOS)

Definition at line 160 of file treelist.c.

◆ TVC_DESELECT

#define TVC_DESELECT   0x8000

Definition at line 129 of file treelist.c.

◆ TVC_ONLYFOCUS

#define TVC_ONLYFOCUS   TVIF_ONLYFOCUS

Definition at line 127 of file treelist.c.

◆ TVC_UNSELECT

#define TVC_UNSELECT   0x4000

Definition at line 128 of file treelist.c.

◆ TVIF_ALL

◆ TVIS_BASEFLAGS

Definition at line 121 of file treelist.c.

◆ TVIS_BKCOLOR

#define TVIS_BKCOLOR   (TVIX_BKCOLOR<<16)

Definition at line 123 of file treelist.c.

◆ TVIS_EDIT

#define TVIS_EDIT (   m)    ((1<<m)&((1<<TVAX_EDIT)|(1<<TVAX_COMBO)|(1<<TVAX_STEPED)|(1<<TVAX_CHECKED)))

Definition at line 120 of file treelist.c.

◆ TVIS_FOCUSED

#define TVIS_FOCUSED   (TVIX_FOCUSED<<16)

Definition at line 125 of file treelist.c.

◆ TVIS_TEXTCOLOR

#define TVIS_TEXTCOLOR   (TVIX_TEXTCOLOR<<16)

Definition at line 126 of file treelist.c.

◆ TVIS_TRACKED

#define TVIS_TRACKED   (TVIX_TRACKED<<16)

Definition at line 122 of file treelist.c.

◆ TVIX_BKCOLOR

#define TVIX_BKCOLOR   0x20

Definition at line 169 of file treelist.c.

◆ TVIX_FOCUSED

#define TVIX_FOCUSED   0x40

Definition at line 170 of file treelist.c.

◆ TVIX_HASBUTTON

#define TVIX_HASBUTTON   0x02

Definition at line 165 of file treelist.c.

◆ TVIX_HASIMAGE

#define TVIX_HASIMAGE   0x04

Definition at line 166 of file treelist.c.

◆ TVIX_TEXTCOLOR

#define TVIX_TEXTCOLOR   0x10

Definition at line 168 of file treelist.c.

◆ TVIX_TRACKED

#define TVIX_TRACKED   0x08

Definition at line 167 of file treelist.c.

◆ TVIX_VARBUTTON

#define TVIX_VARBUTTON   0x01

Definition at line 164 of file treelist.c.

◆ TVP_GLYPH

#define TVP_GLYPH   2

Definition at line 136 of file treelist.c.

◆ U

#define U (   h)    ((unsigned)(h))

Definition at line 114 of file treelist.c.

◆ UNLOCK

#define UNLOCK (   d)    ReleaseSemaphore(d->hSem,1,NULL)

Definition at line 118 of file treelist.c.

◆ VK_ISACHAR

#define VK_ISACHAR   0x01000000

Definition at line 110 of file treelist.c.

◆ WHEEL_DELTA

#define WHEEL_DELTA   120

Definition at line 99 of file treelist.c.

◆ WM_MOUSEWHEEL

#define WM_MOUSEWHEEL   0x020A

Definition at line 96 of file treelist.c.

◆ XCHANGE_MEM [1/3]

#define XCHANGE_MEM (   a,
  b 
)    uTemp=pItemList[a];pItemList[a]=pItemList[b];pItemList[b]=uTemp;

◆ XCHANGE_MEM [2/3]

#define XCHANGE_MEM (   a,
  b 
)    uTemp=pItemList[a];pItemList[a]=pItemList[b];pItemList[b]=uTemp;

◆ XCHANGE_MEM [3/3]

#define XCHANGE_MEM (   a,
  b 
)    uTemp=pItemList[a];pItemList[a]=pItemList[b];pItemList[b]=uTemp;

Typedef Documentation

◆ BeginBufferedPnT

typedef HANDLE(WINAPI * BeginBufferedPnT) (HDC, RECT *, DWORD, LPVOID, HDC *)

Definition at line 346 of file treelist.c.

◆ BufferedPtInitT

typedef HRESULT(WINAPI * BufferedPtInitT) (VOID)

Definition at line 347 of file treelist.c.

◆ CloseThemeDataT

typedef HRESULT(WINAPI * CloseThemeDataT) (LPVOID)

Definition at line 350 of file treelist.c.

◆ DrawThemeBackgT

typedef HRESULT(WINAPI * DrawThemeBackgT) (LPVOID, HDC, int, int, const RECT *, const RECT *)

Definition at line 351 of file treelist.c.

◆ EndBufferedPtT

typedef HRESULT(WINAPI * EndBufferedPtT) (HANDLE, BOOL)

Definition at line 345 of file treelist.c.

◆ GetThemeBackgRcT

typedef HRESULT(WINAPI * GetThemeBackgRcT) (LPVOID, HDC, int, int, LPCRECT, LPRECT)

Definition at line 352 of file treelist.c.

◆ IsAppThemedT

typedef BOOL(WINAPI * IsAppThemedT) ()

Definition at line 353 of file treelist.c.

◆ IsThemeActiveT

typedef BOOL(WINAPI * IsThemeActiveT) ()

Definition at line 354 of file treelist.c.

◆ OpenThemeDataT

typedef LPVOID(WINAPI * OpenThemeDataT) (HWND hwnd, LPCWSTR pszClassList)

Definition at line 349 of file treelist.c.

◆ SetWindowThemeT

typedef HRESULT(WINAPI * SetWindowThemeT) (HWND, LPCWSTR, LPCWSTR)

Definition at line 344 of file treelist.c.

Function Documentation

◆ CallbackEntry()

static void CallbackEntry ( TreeListData pData,
BaseItem pEntry,
unsigned  uItem,
unsigned  uFlags,
int iImage,
unsigned *  uTextSize,
LPCTSTR pText 
)
static

Definition at line 550 of file treelist.c.

550  {
551 
552  NMTVDISPINFO sInfo;
553 
554  sInfo.item.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE | uFlags;
555  sInfo.item.lParam = pEntry->lParam;
556  sInfo.item.hItem = (HTREEITEM)uItem;
557  sInfo.item.state = pEntry->uState;
558  sInfo.item.stateMask = 0xFFFFFFFF;
559  sInfo.item.iImage = I_IMAGECALLBACK;
560  sInfo.item.iSelectedImage = I_IMAGECALLBACK;
561  sInfo.item.cChildren = I_CHILDRENCALLBACK;
562 
563  if(uFlags & TVIF_TEXT) {
564  if(*uTextSize) {
565  pData->cTempText2[sizeof(pData->cTempText2) / sizeof(TCHAR) - 1] = 0;
566  pData->cTempText2[0] = 0;
567  sInfo.item.pszText = pData->cTempText2;
568  sInfo.item.cchTextMax = sizeof(pData->cTempText2) / sizeof(TCHAR) - 1;
569  } else {
570  pData->cTempText1[sizeof(pData->cTempText1) / sizeof(TCHAR) - 1] = 0;
571  pData->cTempText1[0] = 0;
572  sInfo.item.pszText = pData->cTempText1;
573  sInfo.item.cchTextMax = sizeof(pData->cTempText1) / sizeof(TCHAR) - 1;
574  }
575  } else {
576  sInfo.item.pszText = 0;
577  sInfo.item.cchTextMax = 0;
578  }
579 
580  sInfo.hdr.hwndFrom = pData->hWnd;
581  sInfo.hdr.idFrom = GetWindowLong(pData->hWnd, GWL_ID);
582  sInfo.hdr.code = TVN_GETDISPINFO;
583 
584  UNLOCK(pData);
585  SendMessage(GetParent(sInfo.hdr.hwndFrom), WM_NOTIFY, sInfo.hdr.idFrom, (LPARAM)&sInfo);
586  LOCK(pData);
587 
588  if(uFlags & TVIF_IMAGE) {
589  if(!(pEntry->uState & TVIS_SELECTED))
590  *iImage = sInfo.item.iImage;
591  } else
592  if(uFlags & TVIF_SELECTEDIMAGE) {
593  if(pEntry->uState & TVIS_SELECTED)
594  *iImage = sInfo.item.iSelectedImage;
595  }
596 
597  if(uFlags & TVIF_CHILDREN) {
598  switch(sInfo.item.cChildren) {
599  case 0:
600  pEntry->bFlags &= ~TVIX_HASBUTTON;
601  pEntry->bFlags |= TVIX_VARBUTTON;
602  break;
603 
604  case 1:
605  pEntry->bFlags &= ~TVIX_VARBUTTON;
606  pEntry->bFlags |= TVIX_HASBUTTON;
607  break;
608 
609  default
610  :
611  pEntry->bFlags |= TVIX_VARBUTTON;
612 
613  if(pEntry->uFirstChild)
614  pEntry->bFlags |= TVIX_HASBUTTON;
615  else
616  pEntry->bFlags &= ~TVIX_HASBUTTON;
617  }
618  }
619 
620  if(uFlags & TVIF_TEXT) {
621  *pText = sInfo.item.pszText;
622  *uTextSize = str_len(sInfo.item.pszText);
623  pEntry->iTextPixels = 0;
624  }
625 
626 }
LPCSTR pText
Definition: txtscale.cpp:79
#define TVIS_SELECTED
Definition: commctrl.h:3252
#define GWL_ID
Definition: winuser.h:853
struct _TREEITEM * HTREEITEM
Definition: commctrl.h:3236
#define str_len
Definition: treelist.c:89
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3243
UINT uFlags
Definition: api.c:60
#define LOCK(d)
Definition: treelist.c:119
BYTE bFlags
Definition: treelist.c:188
#define NMTVDISPINFO
Definition: commctrl.h:3647
#define TVIF_CHILDREN
Definition: commctrl.h:3244
LONG_PTR LPARAM
Definition: windef.h:208
LPARAM lParam
Definition: treelist.c:173
char TCHAR
Definition: xmlstorage.h:189
UINT uState
Definition: treelist.c:175
#define TVN_GETDISPINFO
Definition: commctrl.h:3708
#define I_CHILDRENCALLBACK
Definition: commctrl.h:3265
#define GetWindowLong
Definition: winuser.h:5662
int iTextPixels
Definition: treelist.c:185
#define TVIX_HASBUTTON
Definition: treelist.c:165
#define TVIF_HANDLE
Definition: commctrl.h:3242
#define I_IMAGECALLBACK
Definition: commctrl.h:2357
#define UNLOCK(d)
Definition: treelist.c:118
HWND WINAPI GetParent(_In_ HWND)
#define TVIF_TEXT
Definition: commctrl.h:3238
#define TVIF_IMAGE
Definition: commctrl.h:3239
#define SendMessage
Definition: winuser.h:5709
#define TVIF_STATE
Definition: commctrl.h:3241
#define TVIF_PARAM
Definition: commctrl.h:3240
#define TVIX_VARBUTTON
Definition: treelist.c:164
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
unsigned uFirstChild
Definition: treelist.c:179
#define WM_NOTIFY
Definition: richedit.h:61

Referenced by CreateDragImage(), TreeListDraw(), TreeListEditLabel(), TreeListFindItem(), TreeListInsertItem(), TreeListSortItems(), and UpdateToolTip().

◆ CallbackExtra()

static void CallbackExtra ( TreeListData pData,
BaseItem pEntry,
ExtraItem pExtra,
unsigned  uItem,
unsigned  uSub,
unsigned  uFlags,
int iImage,
unsigned *  uTextSize,
LPCTSTR pText 
)
static

Definition at line 639 of file treelist.c.

639  {
640 
641  NMTVDISPINFO sInfo;
642 
643  sInfo.item.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE | TVIF_SUBITEM | uFlags;
644  sInfo.item.lParam = pEntry->lParam;
645  sInfo.item.hItem = (HTREEITEM)uItem;
646  sInfo.item.state = pExtra->uState;
647  sInfo.item.state |= (pEntry->uState & TVIS_BASEFLAGS);
648  sInfo.item.stateMask = 0xFFFFFFFF;
649  sInfo.item.iImage = I_IMAGECALLBACK;
650  sInfo.item.iSelectedImage = I_IMAGECALLBACK;
651  sInfo.item.cChildren = uSub;
652 
653  if(uFlags & TVIF_TEXT) {
654  pData->cTempText1[sizeof(pData->cTempText1) / sizeof(TCHAR) - 1] = 0;
655  pData->cTempText1[0] = 0;
656  sInfo.item.pszText = pData->cTempText1;
657  sInfo.item.cchTextMax = sizeof(pData->cTempText1) / sizeof(TCHAR) - 1;
658  } else {
659  sInfo.item.pszText = 0;
660  sInfo.item.cchTextMax = 0;
661  }
662 
663  sInfo.hdr.hwndFrom = pData->hWnd;
664  sInfo.hdr.idFrom = GetWindowLong(pData->hWnd, GWL_ID);
665  sInfo.hdr.code = TVN_GETDISPINFO;
666 
667  UNLOCK(pData);
668  SendMessage(GetParent(sInfo.hdr.hwndFrom), WM_NOTIFY, sInfo.hdr.idFrom, (LPARAM)&sInfo);
669  LOCK(pData);
670 
671 
672  if(uFlags & TVIF_IMAGE)
673  *iImage = sInfo.item.iImage;
674  if(uFlags & TVIF_TEXT) {
675  *pText = sInfo.item.pszText;
676  *uTextSize = str_len(sInfo.item.pszText);
677  }
678 
679 }
LPCSTR pText
Definition: txtscale.cpp:79
#define GWL_ID
Definition: winuser.h:853
struct _TREEITEM * HTREEITEM
Definition: commctrl.h:3236
#define str_len
Definition: treelist.c:89
UINT uFlags
Definition: api.c:60
#define LOCK(d)
Definition: treelist.c:119
#define TVIS_BASEFLAGS
Definition: treelist.c:121
#define NMTVDISPINFO
Definition: commctrl.h:3647
UINT uState
Definition: treelist.c:195
LONG_PTR LPARAM
Definition: windef.h:208
LPARAM lParam
Definition: treelist.c:173
char TCHAR
Definition: xmlstorage.h:189
UINT uState
Definition: treelist.c:175
#define TVN_GETDISPINFO
Definition: commctrl.h:3708
#define TVIF_SUBITEM
Definition: treelist.h:102
#define GetWindowLong
Definition: winuser.h:5662
#define TVIF_HANDLE
Definition: commctrl.h:3242
#define I_IMAGECALLBACK
Definition: commctrl.h:2357
#define UNLOCK(d)
Definition: treelist.c:118
HWND WINAPI GetParent(_In_ HWND)
#define TVIF_TEXT
Definition: commctrl.h:3238
#define TVIF_IMAGE
Definition: commctrl.h:3239
#define SendMessage
Definition: winuser.h:5709
#define TVIF_STATE
Definition: commctrl.h:3241
#define TVIF_PARAM
Definition: commctrl.h:3240
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define WM_NOTIFY
Definition: richedit.h:61

Referenced by CreateDragImage(), TreeListDraw(), TreeListEditLabel(), and UpdateToolTip().

◆ ChangeColSize()

static void ChangeColSize ( TreeListData pData,
int  iDelta 
)
static

Definition at line 862 of file treelist.c.

862  {
863 
864  unsigned uPos;
865  HDITEM sItem;
866  RECT sRect;
867  TV_COLSIZE sNotify;
868  int iWeight;
869  int iValue;
870  int iPoint;
871  int iStart;
872  int iSize;
873  int iRest;
874  int iOff;
875  int iNum;
876  int iCnt;
877  int iAll;
878  int iVar;
879  int iFix;
880 
881  sItem.mask = HDI_WIDTH;
882  iAll = pData->iAllWeight;
883  iCnt = pData->uColumnCountVar;
884 
885  if(iCnt <= 1) { // Nur eine variable Spalte
886  for(uPos = 0; uPos < pData->uColumnCount; uPos++) {
887  iWeight = pData->aColumn[uPos].bWeight;
888  if(!iWeight)
889  continue;
890 
891  iValue = pData->aColumn[uPos].sSize;
892  iValue += iDelta;
893  sItem.cxy = iValue;
894 
895  pData->aColumn[uPos].sSize = (short)iValue;
896  pData->iVarSize = iValue;
897 
898  if(sItem.cxy < pData->aColumn[uPos].sMin) {
899  sItem.cxy = pData->aColumn[uPos].sMin;
900  }
901 
902  if(pData->aColumn[uPos].sReal != sItem.cxy) { // Ändert sich die Breite
903  pData->aColumn[uPos].sReal = (short)sItem.cxy;
904  Header_SetItem(pData->hHeader, uPos, &sItem);
905 
906  if(pData->uStyleEx & TVS_EX_HEADERCHGNOTIFY) {
907  sNotify.hdr.code = TVN_COLUMNCHANGED;
908  sNotify.uColumn = uPos;
909  sNotify.uIndex = pData->aColumn[uPos].bIndex;
910  sNotify.uPosX = pData->aColumnXpos[uPos];
911  sNotify.iSize = sItem.cxy;
912 
913  UNLOCK(pData);
914  SendNotify(pData, &sNotify.hdr);
915  LOCK(pData);
916  }
917  }
918 
919  break;
920  }
921 
922  return;
923  }
924 
925  if(iDelta > 0)
926  iStart = (pData->uSizeX) % iAll;
927  else
928  iStart = (pData->uSizeX - iDelta) % iAll;
929 
930  iOff = 0;
931 
932  for(uPos = 0;; uPos++) { // Suchen die Anfangsspalte
933  iWeight = pData->aColumn[uPos].bWeight;
934  if(!iWeight)
935  continue;
936 
937  iOff += iWeight;
938  if(iOff > iStart)
939  break;
940  }
941 
942 
943  iPoint = 0;
944  iSize = iDelta / iAll;
945  iRest = iDelta % iAll;
946  iNum = iRest;
947  iOff -= iStart;
948 
949  iWeight = iOff;
950  iValue = pData->aColumn[uPos].sSize;
951  iValue += iSize * iWeight;
952  iPoint += iRest * iWeight;
953  iValue += iPoint / iAll;
954  iNum -= iPoint / iAll;
955  iPoint %= iAll;
956 
957  pData->aColumn[uPos].sSize = (short)iValue;
958 
959 
960  if(iWeight >= pData->aColumn[uPos].bWeight) { // Wurde die ganze Spalte berechnet
961  iCnt--;
962  iOff = 0;
963  }
964 
965  while(iCnt > 0) {
966  uPos++;
967 
968  if(uPos >= pData->uColumnCount)
969  uPos = 0;
970  iWeight = pData->aColumn[uPos].bWeight;
971  if(!iWeight)
972  continue;
973 
974  iValue = pData->aColumn[uPos].sSize;
975 
976  iCnt--;
977  if(iCnt) {
978  iValue += iSize * iWeight;
979  iPoint += iRest * iWeight;
980  iValue += iPoint / iAll;
981  iNum -= iPoint / iAll;
982  iPoint %= iAll;
983  } else {
984  iWeight -= iOff;
985  iValue += iSize * iWeight;
986  iValue += iNum;
987  }
988 
989  pData->aColumn[uPos].sSize = (short)iValue;
990  }
991 
992  iVar = 0;
993  iFix = 0;
994  iCnt = pData->uColumnCountVar;
995 
996  for(uPos = 0; iCnt > 0; uPos++) { // Ausgeben der neuen Breiten
997  iWeight = pData->aColumn[uPos].bWeight;
998  if(!iWeight) {
999  iFix += pData->aColumn[uPos].sSize;
1000  continue;
1001  }
1002 
1003  iVar += pData->aColumn[uPos].sSize;
1004  sItem.cxy = pData->aColumn[uPos].sSize;
1005 
1006  if(sItem.cxy < pData->aColumn[uPos].sMin) {
1007  sItem.cxy = pData->aColumn[uPos].sMin;
1008  }
1009 
1010  if(pData->aColumn[uPos].sReal != sItem.cxy) { // Ändert sich die Breite
1011  pData->aColumn[uPos].sReal = (short)sItem.cxy;
1012  Header_SetItem(pData->hHeader, uPos, &sItem);
1013 
1014  if(pData->uStyleEx & TVS_EX_HEADERCHGNOTIFY) {
1015  sNotify.hdr.code = TVN_COLUMNCHANGED;
1016  sNotify.uColumn = uPos;
1017  sNotify.uIndex = pData->aColumn[uPos].bIndex;
1018  sNotify.uPosX = pData->aColumnXpos[uPos];
1019  sNotify.iSize = sItem.cxy;
1020 
1021  UNLOCK(pData);
1022  SendNotify(pData, &sNotify.hdr);
1023  LOCK(pData);
1024  }
1025  }
1026 
1027  iCnt--;
1028  }
1029 
1030  pData->iFixSize = iFix;
1031  pData->iVarSize = iVar;
1032 
1033  if(iDelta > 0) {
1034  GetClientRect(pData->hHeader, &sRect);
1035  InvalidateRect(pData->hHeader, NULL, FALSE);
1036  }
1037 
1038 }
UINT uPosX
Definition: treelist.h:76
_In_ UINT iStart
Definition: wingdi.h:3598
#define LOCK(d)
Definition: treelist.c:119
#define HDITEM
Definition: commctrl.h:682
UINT code
Definition: winuser.h:3112
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:93
#define TVN_COLUMNCHANGED
Definition: treelist.h:300
UINT uColumn
Definition: treelist.h:74
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
INT iSize
Definition: treelist.h:77
#define TVS_EX_HEADERCHGNOTIFY
Definition: treelist.h:264
_In_ UINT iPoint
Definition: ntgdi.h:2197
#define UNLOCK(d)
Definition: treelist.c:118
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
UINT uIndex
Definition: treelist.h:75
#define Header_SetItem(hwndHD, i, phdi)
Definition: commctrl.h:743
static LRESULT SendNotify(TreeListData *pData, NMHDR *pNotify)
Definition: treelist.c:530
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define HDI_WIDTH
Definition: commctrl.h:687
NMHDR hdr
Definition: treelist.h:73

Referenced by TreeListDeleteColumn(), TreeListInsertColumn(), and TreeListProc().

◆ CreateDragImage()

static HIMAGELIST CreateDragImage ( TreeListData pData,
unsigned  uItem,
unsigned  uSub 
)
static

Definition at line 1204 of file treelist.c.

1204  {
1205 
1206  ExtraItem *pExtra;
1207  BaseItem *pEntry;
1208  HIMAGELIST hList;
1209  BITMAPINFO sInfo;
1210  BYTE *pMem;
1211  HDC hDcSrc;
1212  HDC hDc;
1213  HBITMAP hBmp;
1214  HBITMAP hBmpNew;
1215  RECT sRect;
1216  unsigned uTSize;
1217  int iAdd;
1218  int iBits;
1219  int iWidth;
1220  int iHeigh;
1221  int iImage;
1222  int iYpos;
1223  LPCTSTR pText;
1224 
1225  if(uItem > pData->uTreeItemsMax)
1226  return NULL;
1227 
1228  pEntry = pData->pTreeItems[uItem];
1229  if(!pEntry)
1230  return 0;
1231 
1232  iHeigh = pData->iFontHeight;
1233 
1234  if(uSub) { // Image für Extraeintrag erzeugen
1235  if(uSub >= pData->uColumnCount)
1236  return 0;
1237 
1238  pExtra = pData->pExtraItems[uSub - 1][uItem];
1239  if(!pExtra) {
1240  pText = _T("????");
1241  uTSize = 4;
1242  iImage = -1;
1243  iWidth = pData->iFontHeight * 4;
1244  } else {
1245  pText = pExtra->pText;
1246  uTSize = pExtra->uTextSize;
1247  iImage = pExtra->iImage;
1248  iWidth = pExtra->iTextPixels;
1249 
1250  if(pExtra->bCallback & (TVIF_IMAGE | TVIF_TEXT)) {
1251  CallbackExtra(pData, pEntry, pExtra, uItem, uSub, pExtra->bCallback, &iImage, &uTSize, &pText);
1252  }
1253  }
1254  } else { // Image für Haupteintrag erzeugen
1255  pText = pEntry->pText;
1256  uTSize = pEntry->uTextSize;
1257  iImage = pEntry->iImage;
1258  iWidth = pEntry->iTextPixels;
1259 
1260  if(pEntry->bCallback & (TVIF_IMAGE | TVIF_TEXT)) {
1261  CallbackEntry(pData, pEntry, uItem, pEntry->bCallback, &iImage, &uTSize, &pText);
1262  }
1263  }
1264 
1265  if(pData->hImages && iImage >= 0) { // Größen für Images anpassen
1266  if(iHeigh < pData->iImagesYsize)
1267  iHeigh = pData->iImagesYsize;
1268  iAdd = pData->iImagesXsize + 2;
1269  iWidth += iAdd;
1270  } else {
1271  iAdd = 0;
1272  iImage = 1;
1273  }
1274 
1275  if(iWidth > 240)
1276  iWidth = 240;
1277  if(iHeigh > 32)
1278  iHeigh = 32;
1279 
1280  pMem = new(BYTE, iHeigh * (iWidth + 4) * 4 + 1024);
1281  if(!pMem)
1282  return NULL;
1283 
1284  hDcSrc = GetDC(NULL);
1285  hDc = CreateCompatibleDC(NULL);
1286  hBmp = CreateCompatibleBitmap(hDcSrc, iWidth, iHeigh);
1287 
1288  SelectObject(hDc, hBmp);
1290  SelectObject(hDc, (pEntry->uState & TVIS_BOLD) ? pData->hFontB : pData->hFontN);
1291  SetTextColor(hDc, pData->uColors[TVC_TEXT]);
1292  SetBkColor(hDc, RGB(123, 77, 91));
1293 
1294  sRect.top = 0;
1295  sRect.bottom = iHeigh;
1296  sRect.left = 0;
1297  sRect.right = iWidth;
1298  iYpos = (iHeigh - pData->iFontHeight) / 2;
1299 
1300  ExtTextOut(hDc, iAdd, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sRect, pText, uTSize, NULL);
1301 
1302  if(iImage >= 0) {
1304  ImageList_Draw(pData->hImages, iImage, hDc, 0, 0, ILD_TRANSPARENT);
1305  }
1306 
1307  iBits = GetDeviceCaps(hDc, BITSPIXEL);
1308 
1309  sInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
1310  sInfo.bmiHeader.biWidth = iWidth;
1311  sInfo.bmiHeader.biHeight = iHeigh;
1312  sInfo.bmiHeader.biPlanes = 1;
1313  sInfo.bmiHeader.biBitCount = (WORD)iBits;
1314  sInfo.bmiHeader.biCompression = BI_RGB;
1315  sInfo.bmiHeader.biSizeImage = 0;
1316  sInfo.bmiHeader.biXPelsPerMeter = 0;
1317  sInfo.bmiHeader.biYPelsPerMeter = 0;
1318  sInfo.bmiHeader.biClrUsed = (iBits > 8) ? 0 : 1 << iBits;;
1319  sInfo.bmiHeader.biClrImportant = (iBits > 8) ? 0 : 1 << iBits;;
1320 
1321  GetDIBits(hDc, hBmp, 0, 0 , NULL, &sInfo, (iBits > 8) ? DIB_RGB_COLORS : DIB_PAL_COLORS);
1322  GetDIBits(hDc, hBmp, 0, iHeigh, pMem, &sInfo, (iBits > 8) ? DIB_RGB_COLORS : DIB_PAL_COLORS);
1323 
1324  hBmpNew = CreateCompatibleBitmap(hDc, iWidth, iHeigh);
1325 
1326  SetDIBits(hDc, hBmpNew, 0, iHeigh, pMem, &sInfo, (iBits > 8) ? DIB_RGB_COLORS : DIB_PAL_COLORS);
1327 
1328  hList = ImageList_Create(iWidth, iHeigh, ILC_COLORDDB | ILC_MASK, 1, 0);
1329 
1330  ImageList_AddMasked(hList, hBmpNew, RGB(123, 77, 91));
1331 
1332  DeleteObject(hBmpNew);
1333  DeleteObject(hBmp);
1334  DeleteDC(hDc);
1335  ReleaseDC(NULL, hDcSrc);
1336 
1337  delete(pMem);
1338 
1339  return hList;
1340 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define BITSPIXEL
Definition: wingdi.h:719
const CHAR * LPCTSTR
Definition: xmlstorage.h:193
LPCSTR pText
Definition: txtscale.cpp:79
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1454
WORD uTextSize
Definition: treelist.c:186
DWORD biClrImportant
Definition: amvideo.idl:40
#define DIB_PAL_COLORS
Definition: wingdi.h:365
HDC WINAPI GetDC(_In_opt_ HWND)
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
LONG biXPelsPerMeter
Definition: amvideo.idl:37
struct tagBITMAPINFOHEADER BITMAPINFOHEADER
static HDC
Definition: imagelist.c:92
LONG top
Definition: windef.h:292
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
int iImage
Definition: treelist.c:196
BOOL WINAPI ImageList_Draw(HIMAGELIST himl, INT i, HDC hdc, INT x, INT y, UINT fStyle)
Definition: imagelist.c:1193
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
LONG biYPelsPerMeter
Definition: amvideo.idl:38
#define COLOR_WINDOW
Definition: winuser.h:908
DWORD WINAPI GetSysColor(_In_ int)
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:975
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:769
#define ETO_OPAQUE
Definition: wingdi.h:646
WORD uTextSize
Definition: treelist.c:198
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
DWORD biCompression
Definition: amvideo.idl:35
#define NULL_PEN
Definition: wingdi.h:903
smooth NULL
Definition: ftsmooth.c:416
#define ETO_CLIPPED
Definition: wingdi.h:647
int iTextPixels
Definition: treelist.c:197
static void CallbackExtra(TreeListData *pData, BaseItem *pEntry, ExtraItem *pExtra, unsigned uItem, unsigned uSub, unsigned uFlags, int *iImage, unsigned *uTextSize, LPCTSTR *pText)
Definition: treelist.c:639
#define TVC_TEXT
Definition: treelist.h:141
BYTE bCallback
Definition: treelist.c:199
#define _T(x)
Definition: vfdio.h:22
LPTSTR pText
Definition: treelist.c:194
UINT uState
Definition: treelist.c:175
BYTE bCallback
Definition: treelist.c:187
#define RGB(r, g, b)
Definition: wingdi.h:2918
unsigned short WORD
Definition: ntddk_ex.h:93
DWORD biSizeImage
Definition: amvideo.idl:36
#define ExtTextOut
Definition: wingdi.h:4432
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define ILC_MASK
Definition: commctrl.h:336
unsigned char BYTE
Definition: mem.h:68
int iTextPixels
Definition: treelist.c:185
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:881
HWND hList
Definition: livecd.c:10
#define ILD_TRANSPARENT
Definition: commctrl.h:403
BOOL WINAPI DeleteDC(_In_ HDC)
#define ILC_COLORDDB
Definition: commctrl.h:338
#define TVIF_TEXT
Definition: commctrl.h:3238
LPTSTR pText
Definition: treelist.c:174
int iImage
Definition: treelist.c:176
#define TVIF_IMAGE
Definition: commctrl.h:3239
int WINAPI GetDIBits(_In_ HDC hdc, _In_ HBITMAP hbm, _In_ UINT start, _In_ UINT cLines, _Out_opt_ LPVOID lpvBits, _At_((LPBITMAPINFOHEADER) lpbmi, _Inout_) LPBITMAPINFO lpbmi, _In_ UINT usage)
LONG bottom
Definition: windef.h:294
#define TVIS_BOLD
Definition: commctrl.h:3255
INT WINAPI ImageList_AddMasked(HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
Definition: imagelist.c:528
static HBITMAP
Definition: button.c:44
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define DIB_RGB_COLORS
Definition: wingdi.h:366
int WINAPI SetDIBits(_In_opt_ HDC, _In_ HBITMAP, _In_ UINT, _In_ UINT, _In_ CONST VOID *, _In_ CONST BITMAPINFO *, _In_ UINT)
#define BI_RGB
Definition: precomp.h:35
static void CallbackEntry(TreeListData *pData, BaseItem *pEntry, unsigned uItem, unsigned uFlags, int *iImage, unsigned *uTextSize, LPCTSTR *pText)
Definition: treelist.c:550

Referenced by TreeListProc().

◆ CreateFontset()

static int CreateFontset ( TreeListData pData,
HFONT  hFont 
)
static

Definition at line 2121 of file treelist.c.

2121  {
2122  LOGFONT sLog;
2123  HFONT hBold;
2124  int iRet = 0;
2125 
2126  if(GetObject(hFont, sizeof(sLog), &sLog)){
2127  sLog.lfWeight = FW_BOLD;
2128  if((hBold = CreateFontIndirect(&sLog))){
2129  pData->hFontN = hFont; //store the given font
2130  if(pData->hFontB != hDefaultFontB){
2131  //if the current bold is not the default bold, free it
2132  DeleteObject(pData->hFontB);
2133  }
2134  pData->hFontB = hBold; //store the created bold
2135  iRet = 1;
2136  }
2137  }
2138  return iRet;
2139 }
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
static HFONT hDefaultFontB
Definition: treelist.c:370
HFONT hFont
Definition: main.c:53
LONG lfWeight
Definition: dimm.idl:46
#define GetObject
Definition: wingdi.h:4446
#define FW_BOLD
Definition: wingdi.h:377
#define CreateFontIndirect
Definition: wingdi.h:4422
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827

Referenced by TreeListProc().

◆ CreateStateImageList()

static void CreateStateImageList ( TreeListData pData,
int  iMode 
)
static

Definition at line 1080 of file treelist.c.

1080  {
1081 
1082  BITMAPINFO sInfo;
1083  BYTE aMem[0x1000];
1084  HDC hDcSrc;
1085  HDC hDc;
1086  HBITMAP hBmp;
1087  HBITMAP hBmpNew;
1088  RECT sRect;
1089  int iBits;
1090 
1091  if(pOpenThemeData) { // Über Thema zeichnen
1092  if(!pData->hThemeBt) {
1093  pData->hThemeBt = pOpenThemeData(pData->hWnd, L"BUTTON");
1094  }
1095 
1096  if(pData->hThemeBt) {
1097  if(iMode) {
1098  if(pData->hChecks && pData->hChecks != THEMEIMGLIST) {
1099  ImageList_Destroy(pData->hChecks);
1100  }
1101 
1102  pData->hChecks = THEMEIMGLIST;
1103  pData->iChecksXsize = 16;
1104  pData->iChecksYsize = 16;
1105  pData->iChecksMode = 1;
1106  } else {
1107  if(pData->hStates && pData->hStates != THEMEIMGLIST) {
1108  ImageList_Destroy(pData->hStates);
1109  }
1110 
1111  pData->hStates = THEMEIMGLIST;
1112  pData->iStatesXsize = 16;
1113  pData->iStatesYsize = 16;
1114  pData->iStatesMode = 1;
1115  }
1116 
1117  return;
1118  }
1119  }
1120 
1121  if(iMode) {
1122  if(pData->hChecks && pData->hChecks != THEMEIMGLIST)
1123  return;
1124  } else {
1125  if(pData->hStates && pData->hStates != THEMEIMGLIST)
1126  return;
1127  }
1128 
1129  hDcSrc = GetDC(NULL);
1130  hDc = CreateCompatibleDC(NULL);
1131  hBmp = CreateCompatibleBitmap(hDcSrc, 16 * 3, 16);
1132 
1133  SelectObject(hDc, hBmp);
1135  SetBkMode(hDc, OPAQUE);
1138  Rectangle(hDc, -1, -1, 16 * 3 + 2, 16 + 2);
1139 
1140  sRect.top = 8 - 6;
1141  sRect.bottom = 8 + 7;
1142  sRect.left = 16 * 1 + 8 - 7;
1143  sRect.right = 16 * 1 + 8 + 6;
1144 
1146 
1147  sRect.left = 16 * 2 + 8 - 7;
1148  sRect.right = 16 * 2 + 8 + 6;
1149 
1151 
1152  iBits = GetDeviceCaps(hDc, BITSPIXEL);
1153 
1154  sInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
1155  sInfo.bmiHeader.biWidth = 16 * 3;
1156  sInfo.bmiHeader.biHeight = 16;
1157  sInfo.bmiHeader.biPlanes = 1;
1158  sInfo.bmiHeader.biBitCount = (WORD)iBits;
1159  sInfo.bmiHeader.biCompression = BI_RGB;
1160  sInfo.bmiHeader.biSizeImage = 0;
1161  sInfo.bmiHeader.biXPelsPerMeter = 0;
1162  sInfo.bmiHeader.biYPelsPerMeter = 0;
1163  sInfo.bmiHeader.biClrUsed = (iBits > 8) ? 0 : 1 << iBits;;
1164  sInfo.bmiHeader.biClrImportant = (iBits > 8) ? 0 : 1 << iBits;;
1165 
1166  GetDIBits(hDc, hBmp, 0, 0 , NULL, &sInfo, (iBits > 8) ? DIB_RGB_COLORS : DIB_PAL_COLORS);
1167  GetDIBits(hDc, hBmp, 0, 16, aMem, &sInfo, (iBits > 8) ? DIB_RGB_COLORS : DIB_PAL_COLORS);
1168 
1169  hBmpNew = CreateCompatibleBitmap(hDc, 16 * 3, 16);
1170 
1171  SetDIBits(hDc, hBmpNew, 0, 16, aMem, &sInfo, (iBits > 8) ? DIB_RGB_COLORS : DIB_PAL_COLORS);
1172 
1173  if(iMode == 0) {
1174  pData->hStates = ImageList_Create(16, 16, ILC_COLORDDB | ILC_MASK, 3, 14);
1175  pData->iStatesXsize = 16;
1176  pData->iStatesYsize = 16;
1177  pData->iStatesMode = 1;
1178 
1180  } else {
1181  pData->hChecks = ImageList_Create(16, 16, ILC_COLORDDB | ILC_MASK, 3, 14);
1182  pData->iChecksXsize = 16;
1183  pData->iChecksYsize = 16;
1184  pData->iChecksMode = 1;
1185 
1187  }
1188 
1189  DeleteObject(hBmpNew);
1190  DeleteObject(hBmp);
1191  DeleteDC(hDc);
1192  ReleaseDC(NULL, hDcSrc);
1193 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define DFCS_FLAT
Definition: winuser.h:510
#define BITSPIXEL
Definition: wingdi.h:719
#define DFC_BUTTON
Definition: winuser.h:476
#define COLOR_HIGHLIGHT
Definition: winuser.h:916
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1454
_In_ ULONG iMode
Definition: winddi.h:3520
DWORD biClrImportant
Definition: amvideo.idl:40
#define DFCS_CHECKED
Definition: winuser.h:504
#define DIB_PAL_COLORS
Definition: wingdi.h:365
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
HDC WINAPI GetDC(_In_opt_ HWND)
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
LONG biXPelsPerMeter
Definition: amvideo.idl:37
struct tagBITMAPINFOHEADER BITMAPINFOHEADER
static HDC
Definition: imagelist.c:92
LONG top
Definition: windef.h:292
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
LONG biYPelsPerMeter
Definition: amvideo.idl:38
#define COLOR_WINDOW
Definition: winuser.h:908
DWORD WINAPI GetSysColor(_In_ int)
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:893
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:975
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1032
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:769
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
DWORD biCompression
Definition: amvideo.idl:35
#define NULL_PEN
Definition: wingdi.h:903
smooth NULL
Definition: ftsmooth.c:416
static OpenThemeDataT pOpenThemeData
Definition: treelist.c:362
unsigned short WORD
Definition: ntddk_ex.h:93
DWORD biSizeImage
Definition: amvideo.idl:36
#define OPAQUE
Definition: wingdi.h:948
static const WCHAR L[]
Definition: oid.c:1250
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define ILC_MASK
Definition: commctrl.h:336
unsigned char BYTE
Definition: mem.h:68
#define DFCS_BUTTONCHECK
Definition: winuser.h:496
BOOL WINAPI DeleteDC(_In_ HDC)
#define ILC_COLORDDB
Definition: commctrl.h:338
int WINAPI GetDIBits(_In_ HDC hdc, _In_ HBITMAP hbm, _In_ UINT start, _In_ UINT cLines, _Out_opt_ LPVOID lpvBits, _At_((LPBITMAPINFOHEADER) lpbmi, _Inout_) LPBITMAPINFO lpbmi, _In_ UINT usage)
LONG bottom
Definition: windef.h:294
INT WINAPI ImageList_AddMasked(HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
Definition: imagelist.c:528
static HBITMAP
Definition: button.c:44
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define DIB_RGB_COLORS
Definition: wingdi.h:366
HBRUSH WINAPI GetSysColorBrush(_In_ int)
int WINAPI SetDIBits(_In_opt_ HDC, _In_ HBITMAP, _In_ UINT, _In_ UINT, _In_ CONST VOID *, _In_ CONST BITMAPINFO *, _In_ UINT)
#define BI_RGB
Definition: precomp.h:35
#define THEMEIMGLIST
Definition: treelist.c:115

Referenced by TreeListProc().

◆ CreateToolTip()

static void CreateToolTip ( TreeListData pData)
static

Definition at line 1047 of file treelist.c.

1047  {
1048 
1049  TOOLINFO sInfo;
1050 
1051  if(pData->hToolTip)
1052  return;
1053 
1055  pData->pToolProc = (WNDPROC)GetWindowLongPtr(pData->hToolTip, GWLP_WNDPROC);
1056 
1057  sInfo.cbSize = sizeof(TOOLINFO);
1058  sInfo.uFlags = TTF_ABSOLUTE | TTF_TRACK | TTF_IDISHWND;
1059  sInfo.hwnd = pData->hWnd;
1060  sInfo.hinst = NULL;
1061  sInfo.uId = (LPARAM)(pData->hWnd);
1062  sInfo.lpszText = LPSTR_TEXTCALLBACK;
1063 
1064  GetClientRect(pData->hWnd, &sInfo.rect);
1065  SendMessage(pData->hToolTip, TTM_ADDTOOL, 0, (LPARAM)&sInfo);
1066  SendMessage(pData->hToolTip, TTM_SETMAXTIPWIDTH, 0, 10000);
1067  SetWindowLong(pData->hToolTip, GWL_ID, 2);
1070 }
#define TOOLTIPS_CLASS
Definition: commctrl.h:1682
#define CreateWindow
Definition: winuser.h:5620
#define TOOLINFO
Definition: commctrl.h:1690
#define GWL_ID
Definition: winuser.h:853
#define SetWindowLong
Definition: winuser.h:5719
#define SetWindowLongPtr
Definition: treelist.c:70
#define TTF_IDISHWND
Definition: commctrl.h:1736
#define CW_USEDEFAULT
Definition: winuser.h:225
#define GWLP_USERDATA
Definition: treelist.c:63
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
#define TTF_TRACK
Definition: commctrl.h:1740
#define TTF_ABSOLUTE
Definition: commctrl.h:1741
#define TTM_SETMAXTIPWIDTH
Definition: commctrl.h:1791
#define GWLP_WNDPROC
Definition: treelist.c:66
#define TTM_ADDTOOL
Definition: commctrl.h:1811
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2859
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define WS_POPUP
Definition: pedump.c:616
static LRESULT CALLBACK ToolProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: treelist.c:826
#define SendMessage
Definition: winuser.h:5709
#define GetWindowLongPtr
Definition: treelist.c:73
#define LPSTR_TEXTCALLBACK
Definition: commctrl.h:2355
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827

Referenced by TreeListProc().

◆ EditProc()

static LRESULT CALLBACK EditProc ( HWND  hWnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 687 of file treelist.c.

687  {
688 
690  WNDPROC pProc;
691  DWORD dwStop;
692  DWORD dwStart;
693  DWORD dwCount;
694  LRESULT lResult;
695  HWND hParent;
696  HWND hCombo;
697  int iDelta;
698  int iState;
699  int iPos;
700  int iId;
701 
702 
704  iId = GetWindowLong(hWnd, GWL_ID);
705 
706  if(iId == 3) {
707  hCombo = hWnd;
709  pProc = pData->pProcId3;
710  } else {
711  hCombo = hParent;
715  }
716 
717  if(uMsg == WM_KEYDOWN) {
718  if(wParam == VK_RETURN) {
720  return 0;
721  }
722 
723  if(wParam == VK_ESCAPE) {
725  return 0;
726  }
727 
728  if((pData->uStyleEx & TVS_EX_STEPOUT) && !(GetAsyncKeyState(VK_SHIFT) & 0x8000)) {
729  switch(wParam) { // Aus Fenster springen
730 
731  case VK_UP:
732  if(pData->uEditMode)
733  break;
735  PostMessage(hParent, WM_KEYDOWN, VK_UP , 0x00500001);
736  PostMessage(hParent, WM_KEYUP , VK_UP , 0x00500001);
737  return 0;
738 
739  case VK_DOWN:
740  if(pData->uEditMode)
741  break;
743  PostMessage(hParent, WM_KEYDOWN, VK_DOWN, 0x00500001);
744  PostMessage(hParent, WM_KEYUP , VK_DOWN, 0x00500001);
745  return 0;
746 
747  case VK_LEFT:
748  if(pData->uEditMode && iId == 3)
749  break;
750  SendMessage(hWnd, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwStop);
751  if(dwStart || dwStop)
752  break;
754  PostMessage(hParent, WM_KEYDOWN, VK_LEFT, 0x00500001);
755  PostMessage(hParent, WM_KEYUP , VK_LEFT, 0x00500001);
756  return 0;
757 
758  case VK_RIGHT:
759  if(pData->uEditMode && iId == 3)
760  break;
761  SendMessage(hWnd, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwStop);
762  dwCount = (DWORD)SendMessage(hWnd, EM_LINELENGTH, 0, 0);
763  if(dwCount > dwStart)
764  break;
765  if(dwCount > dwStop)
766  break;
767 
769  PostMessage(hParent, WM_KEYDOWN, VK_RIGHT, 0x00500001);
770  PostMessage(hParent, WM_KEYUP , VK_RIGHT, 0x00500001);
771  return 0;
772  }
773  }
774 
775  if(wParam == VK_DOWN && pData->uEditMode) {
776  if(!SendMessage(hCombo, CB_GETDROPPEDSTATE, 0, 0)) {
777  SendMessage(hCombo, CB_SHOWDROPDOWN, 1, 0);
778  return 0;
779  }
780  }
781  } else
782  if(uMsg == WM_CHAR) {
783  if(wParam == VK_RETURN) {
784  return 0;
785  }
786 
787  if(wParam == VK_ESCAPE) {
788  return 0;
789  }
790  } else
791  if(uMsg == WM_COMMAND) {
792  if(wParam == MAKELONG(3, EN_ESCAPE) || wParam == MAKELONG(3, EN_RETURN)) {
794  return 0;
795  }
796  } else
797  if(uMsg == WM_MOUSEWHEEL) {
798  iState = (int)CallWindowProc(pProc, hWnd, CB_GETDROPPEDSTATE, 0, 0);
799  if(iState) {
800  iDelta = (short)HIWORD(wParam);
801  iDelta /= WHEEL_DELTA;
802  iPos = (int)CallWindowProc(pProc, hWnd, CB_GETTOPINDEX, 0, 0);
803  iPos -= iDelta;
804  CallWindowProc(pProc, hWnd, CB_SETTOPINDEX, iPos, 0);
805  return 0;
806  }
807  } else
808  if(uMsg == WM_GETDLGCODE) { // Welche Tasten werden im Dialog benutzt
809  return DLGC_WANTALLKEYS;
810  } else
811  if(uMsg == WM_SETTEXT) {
812  lResult = CallWindowProc(pProc, hWnd, uMsg, wParam, lParam);;
814  return lResult;
815  }
816 
817  return CallWindowProc(pProc, hWnd, uMsg, wParam, lParam);
818 }
#define CB_GETTOPINDEX
Definition: winuser.h:1916
#define CallWindowProc
Definition: winuser.h:5601
#define GetHandle(h)
Definition: treelist.c:116
#define EM_LINELENGTH
Definition: winuser.h:1964
#define CB_GETDROPPEDSTATE
Definition: winuser.h:1906
#define WM_GETDLGCODE
Definition: winuser.h:1671
#define WM_CHAR
Definition: winuser.h:1693
#define EN_SETTEXT
Definition: treelist.c:105
#define WM_MOUSEWHEEL
Definition: treelist.c:96
#define GWL_ID
Definition: winuser.h:853
HWND hWnd
Definition: settings.c:17
#define VK_LEFT
Definition: winuser.h:2178
UINT_PTR WPARAM
Definition: windef.h:207
#define VK_DOWN
Definition: winuser.h:2181
#define VK_ESCAPE
Definition: winuser.h:2168
#define DWORD
Definition: nt_native.h:44
#define VK_RETURN
Definition: winuser.h:2155
WPARAM wParam
Definition: combotst.c:138
#define EM_GETSEL
Definition: winuser.h:1958
#define WHEEL_DELTA
Definition: treelist.c:99
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:93
#define VK_UP
Definition: winuser.h:2179
#define CB_SHOWDROPDOWN
Definition: winuser.h:1931
#define GWLP_USERDATA
Definition: treelist.c:63
#define VK_SHIFT
Definition: winuser.h:2156
#define MAKELONG(a, b)
Definition: typedefs.h:248
#define WM_KEYDOWN
Definition: winuser.h:1691
LONG_PTR LPARAM
Definition: windef.h:208
#define EN_RETURN
Definition: treelist.c:106
#define WM_SETTEXT
Definition: winuser.h:1599
#define PostMessage
Definition: winuser.h:5698
#define WM_KEYUP
Definition: winuser.h:1692
unsigned long DWORD
Definition: ntddk_ex.h:95
#define EN_ESCAPE
Definition: treelist.c:107
#define GetWindowLong
Definition: winuser.h:5662
const DOCKBAR PVOID HWND hParent
Definition: tooldock.h:22
SHORT WINAPI GetAsyncKeyState(_In_ int)
#define CB_SETTOPINDEX
Definition: winuser.h:1930
#define WM_COMMAND
Definition: winuser.h:1716
#define DLGC_WANTALLKEYS
Definition: winuser.h:2566
#define VK_RIGHT
Definition: winuser.h:2180
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2859
HWND WINAPI GetParent(_In_ HWND)
#define TVS_EX_STEPOUT
Definition: treelist.h:267
#define SendMessage
Definition: winuser.h:5709
#define HIWORD(l)
Definition: typedefs.h:246
#define GetWindowLongPtr
Definition: treelist.c:73
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
LONG_PTR LRESULT
Definition: windef.h:209
LPARAM lParam
Definition: combotst.c:139
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

Referenced by TreeListEditLabel().

◆ GlobalDeinit()

static void GlobalDeinit ( )
static

Definition at line 491 of file treelist.c.

491  {
492 
493  int lCount;
494 
496  if(lCount >= 0)
497  return;
498 
499  if(hDefaultFontN) {
502  }
503 
504  if(hDefaultFontB) {
507  }
508 
509  if(hPatternPen) {
511  hPatternPen = NULL;
512  }
513 
514  if(pBufferedPtExit) {
515  pBufferedPtExit();
516  }
517 
518 }
static HFONT hDefaultFontN
Definition: treelist.c:369
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
static HPEN hPatternPen
Definition: treelist.c:368
static HFONT hDefaultFontB
Definition: treelist.c:370
smooth NULL
Definition: ftsmooth.c:416
static LONG lWindowCount
Definition: treelist.c:371
#define InterlockedDecrement
Definition: armddk.h:52
static BufferedPtInitT pBufferedPtExit
Definition: treelist.c:361

Referenced by TreeListProc().

◆ GlobalInit()

static void GlobalInit ( )
static

Definition at line 438 of file treelist.c.

438  {
439 
440  LOGBRUSH sLog;
441  long lCount;
442 
443 
444 
446  if(lCount > 0)
447  return;
448 
450  sLog.lbStyle = PS_SOLID;
451  sLog.lbHatch = 0;
453 
454  if(!hPatternPen) {
455  hPatternPen = CreatePen(PS_DOT, 1, RGB(0, 0, 0));
456  }
457 
458 
459  if(!hUxThemeDll) {
460  hUxThemeDll = LoadLibrary(_T("UxTheme.dll"));
461  if(hUxThemeDll) {
466  pBufferedPtExit = (BufferedPtInitT)GetProcAddress(hUxThemeDll, "BufferedPaintUnInit");
469  pDrawThemeBackg = (DrawThemeBackgT)GetProcAddress(hUxThemeDll, "DrawThemeBackground");
470  pGetThemeBackgRc = (GetThemeBackgRcT)GetProcAddress(hUxThemeDll, "GetThemeBackgroundContentRect");
473 
476  }
477  }
478 
479  if(pBufferedPtInit) {
480  pBufferedPtInit();
481  }
482 
483 }
static CloseThemeDataT pCloseThemeData
Definition: treelist.c:363
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
#define LoadLibrary
Definition: winbase.h:3676
static EndBufferedPtT pEndBufferedPt
Definition: treelist.c:358
UINT lbStyle
Definition: wingdi.h:1725
HRESULT(WINAPI * BufferedPtInitT)(VOID)
Definition: treelist.c:347
ULONG_PTR lbHatch
Definition: wingdi.h:1727
static GetThemeBackgRcT pGetThemeBackgRc
Definition: treelist.c:365
static BeginBufferedPnT pBeginBufferedPt
Definition: treelist.c:359
static HMODULE hUxThemeDll
Definition: treelist.c:356
static HPEN hPatternPen
Definition: treelist.c:368
DWORD WINAPI GetSysColor(_In_ int)
HRESULT(WINAPI * GetThemeBackgRcT)(LPVOID, HDC, int, int, LPCRECT, LPRECT)
Definition: treelist.c:352
#define PS_SOLID
Definition: wingdi.h:585
static IsAppThemedT pIsAppThemed
Definition: treelist.c:366
HRESULT(WINAPI * EndBufferedPtT)(HANDLE, BOOL)
Definition: treelist.c:345
HRESULT(WINAPI * CloseThemeDataT)(LPVOID)
Definition: treelist.c:350
HANDLE(WINAPI * BeginBufferedPnT)(HDC, RECT *, DWORD, LPVOID, HDC *)
Definition: treelist.c:346
static IsThemeActiveT pIsThemeActive
Definition: treelist.c:367
static BOOL bDrawWithTheme
Definition: treelist.c:385
smooth NULL
Definition: ftsmooth.c:416
#define PS_COSMETIC
Definition: wingdi.h:583
static OpenThemeDataT pOpenThemeData
Definition: treelist.c:362
#define _T(x)
Definition: vfdio.h:22
#define PS_ALTERNATE
Definition: wingdi.h:584
#define RGB(r, g, b)
Definition: wingdi.h:2918
COLORREF lbColor
Definition: wingdi.h:1726
BOOL(WINAPI * IsAppThemedT)()
Definition: treelist.c:353
static LONG lWindowCount
Definition: treelist.c:371
HRESULT(WINAPI * DrawThemeBackgT)(LPVOID, HDC, int, int, const RECT *, const RECT *)
Definition: treelist.c:351
LPVOID(WINAPI * OpenThemeDataT)(HWND hwnd, LPCWSTR pszClassList)
Definition: treelist.c:349
static BufferedPtInitT pBufferedPtExit
Definition: treelist.c:361
#define InterlockedIncrement
Definition: armddk.h:53
static DrawThemeBackgT pDrawThemeBackg
Definition: treelist.c:364
#define COLOR_BTNSHADOW
Definition: winuser.h:920
#define PS_DOT
Definition: wingdi.h:587
static SetWindowThemeT pSetWindowTheme
Definition: treelist.c:357
BOOL(WINAPI * IsThemeActiveT)()
Definition: treelist.c:354
#define GetProcAddress(x, y)
Definition: compat.h:410
HPEN WINAPI ExtCreatePen(_In_ DWORD iPenStyle, _In_ DWORD cWidth, _In_ const LOGBRUSH *plbrush, _In_ DWORD cStyle, _In_reads_opt_(cStyle) const DWORD *pstyle)
static BufferedPtInitT pBufferedPtInit
Definition: treelist.c:360
HRESULT(WINAPI * SetWindowThemeT)(HWND, LPCWSTR, LPCWSTR)
Definition: treelist.c:344

Referenced by AtapiChipInit(), and TreeListProc().

◆ SendNotify()

static LRESULT SendNotify ( TreeListData pData,
NMHDR pNotify 
)
static

Definition at line 530 of file treelist.c.

530  {
531 
532  pNotify->hwndFrom = pData->hWnd;
533  pNotify->idFrom = GetWindowLong(pNotify->hwndFrom, GWL_ID);
534 
535  return SendMessage(GetParent(pNotify->hwndFrom), WM_NOTIFY, pNotify->idFrom, (LPARAM)pNotify);
536 }
#define GWL_ID
Definition: winuser.h:853
UINT_PTR idFrom
Definition: winuser.h:3111
LONG_PTR LPARAM
Definition: windef.h:208
#define GetWindowLong
Definition: winuser.h:5662
HWND hwndFrom
Definition: winuser.h:3110
HWND WINAPI GetParent(_In_ HWND)
#define SendMessage
Definition: winuser.h:5709
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define WM_NOTIFY
Definition: richedit.h:61

Referenced by ChangeColSize(), TreeListChangeCheckbox(), TreeListDeleteItem(), TreeListEditLabel(), TreeListEndLabelEdit(), TreeListInsertColumn(), TreeListKeyDown(), TreeListMouseClick(), TreeListMouseNotify(), TreeListProc(), TreeListSelectItem(), TreeListSetOrderArray(), TreeListStartAutoEdit(), TreeListStartNotifyEdit(), TreeListToggleItem(), TreeListXorSelectItem(), and UpdateToolTip().

◆ ToolProc()

static LRESULT CALLBACK ToolProc ( HWND  hWnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 826 of file treelist.c.

826  {
827 
829  POINT sPoint;
830  UINT uPos;
831 
832  if(uMsg == WM_SETFOCUS) {
833  SetFocus((HWND)lParam);
834  return 0;
835  }
836 
838 
839  if(uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) { // Mausklicks auf Tooltip zum Elternfenster
840  sPoint.x = LOWORD(lParam);
841  sPoint.y = HIWORD(lParam);
842 
843  ClientToScreen(hWnd , &sPoint);
844  ScreenToClient(pData->hWnd, &sPoint);
845 
846  uPos = MAKELONG(sPoint.x, sPoint.y);
847 
848  return TreeListProc(pData->hWnd, uMsg, wParam, uPos);
849  }
850 
851  return CallWindowProc(pData->pToolProc, hWnd, uMsg, wParam, lParam);
852 }
#define CallWindowProc
Definition: winuser.h:5601
#define WM_MOUSEFIRST
Definition: winuser.h:1750
long y
Definition: polytest.cpp:48
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
long x
Definition: polytest.cpp:48
static LRESULT CALLBACK TreeListProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: treelist.c:10028
HWND hWnd
Definition: settings.c:17
HWND WINAPI SetFocus(_In_opt_ HWND)
WPARAM wParam
Definition: combotst.c:138
#define GWLP_USERDATA
Definition: treelist.c:63
#define MAKELONG(a, b)
Definition: typedefs.h:248
#define WM_MOUSELAST
Definition: winuser.h:1777
unsigned int UINT
Definition: ndis.h:50
#define HIWORD(l)
Definition: typedefs.h:246
#define GetWindowLongPtr
Definition: treelist.c:73
#define WM_SETFOCUS
Definition: winuser.h:1595
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82

Referenced by CreateToolTip().

◆ TreeListChangeCheckbox()

static void TreeListChangeCheckbox ( TreeListData pData,
UINT  uItem,
int  iPosX,
int  iPosY 
)
static

Definition at line 6798 of file treelist.c.

6798  {
6799 
6800  BaseItem *pTemp;
6801  BaseItem *pEntry;
6802  NMTREEVIEW sNotify;
6803  TV_ITEM sItem;
6804  UINT uBits;
6805 
6806  sNotify.itemOld.mask = 0;
6807  sNotify.itemOld.hItem = 0;
6808 
6809  pEntry = pData->pTreeItems[uItem];
6810  uBits = pEntry->uState & TVIS_STATEIMAGEMASK;
6811 
6812  if(pData->uStyleEx & TVS_EX_SINGLECHECKBOX) { // Einzelauswahl
6813  pTemp = pData->pTreeItems[pData->uSingleSel];
6814 
6815  if(pData->uSingleSel == uItem) {
6816  if(pData->uStyleEx & TVS_EX_BITCHECKBOX) {
6817  if(uBits & 0x1000)
6818  return;
6819  } else {
6820  if(uBits == 0x2000)
6821  return;
6822  }
6823  } else
6824  if(pData->uSingleSel && pTemp) { // Anderer Eintrag gewählt
6825  sItem.hItem = (HTREEITEM)pData->uSingleSel;
6826  sItem.mask = TVIF_STATE;
6827  sItem.stateMask = TVIS_STATEIMAGEMASK;
6828  sItem.state = (pData->uStyleEx & TVS_EX_BITCHECKBOX) ? 0x0000 : 0x1000;
6829 
6830  TreeListSetItem(pData, &sItem);
6831 
6832  sNotify.itemOld.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE | TVIF_TEXT;
6833  sNotify.itemOld.hItem = (HTREEITEM)pData->uSingleSel;
6834  sNotify.itemOld.stateMask = 0xFFFFFFFF;
6835  sNotify.itemOld.state = pTemp->uState;
6836  sNotify.itemOld.lParam = pTemp->lParam;
6837  sNotify.itemOld.pszText = pTemp->pText;
6838  sNotify.itemOld.cchTextMax = pTemp->uTextSize;
6839  sNotify.itemOld.cChildren = 0;
6840  }
6841  }
6842 
6843  sItem.hItem = (HTREEITEM)uItem;
6844  sItem.mask = TVIF_STATE;
6845  sItem.stateMask = TVIS_STATEIMAGEMASK;
6846 
6847  if(pData->uStyleEx & TVS_EX_BITCHECKBOX)
6848  sItem.state = (uBits ^ 0x1000);
6849  else
6850  sItem.state = (uBits & 0x1000) ? 0x2000 : 0x1000;
6851 
6852  TreeListSetItem(pData, &sItem);
6853  pData->uSingleSel = uItem;
6854 
6855  sNotify.hdr.code = TVN_CBSTATECHANGED;
6856  sNotify.action = VK_DBLCLK;
6857  sNotify.itemNew.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE | TVIF_TEXT;
6858  sNotify.itemNew.hItem = (HTREEITEM)uItem;
6859  sNotify.itemNew.stateMask = 0xFFFFFFFF;
6860  sNotify.itemNew.state = pEntry->uState;
6861  sNotify.itemNew.lParam = pEntry->lParam;
6862  sNotify.itemNew.pszText = pEntry->pText;
6863  sNotify.itemNew.cchTextMax = pEntry->uTextSize;
6864  sNotify.itemNew.cChildren = 0;
6865  sNotify.ptDrag.x = iPosX;
6866  sNotify.ptDrag.y = iPosY;
6867 
6868  UNLOCK(pData);
6869  SendNotify(pData, &sNotify.hdr);
6870  LOCK(pData);
6871 }
WORD uTextSize
Definition: treelist.c:186
struct _TREEITEM * HTREEITEM
Definition: commctrl.h:3236
#define TVN_CBSTATECHANGED
Definition: treelist.h:295
#define TVS_EX_SINGLECHECKBOX
Definition: treelist.h:266
#define LOCK(d)
Definition: treelist.c:119
#define NMTREEVIEW
Definition: commctrl.h:3614
LPARAM lParam
Definition: treelist.c:173
UINT uState
Definition: treelist.c:175
#define TVIF_HANDLE
Definition: commctrl.h:3242
#define UNLOCK(d)
Definition: treelist.c:118
#define TV_ITEM
Definition: commctrl.h:3272
#define TVIF_TEXT
Definition: commctrl.h:3238
LPTSTR pText
Definition: treelist.c:174
#define TVS_EX_BITCHECKBOX
Definition: treelist.h:268
unsigned int UINT
Definition: ndis.h:50
#define VK_DBLCLK
Definition: treelist.h:120
#define TVIF_STATE
Definition: commctrl.h:3241
static int TreeListSetItem(TreeListData *pData, const TV_ITEM *pItem)
Definition: treelist.c:4628
#define TVIF_PARAM
Definition: commctrl.h:3240
static LRESULT SendNotify(TreeListData *pData, NMHDR *pNotify)
Definition: treelist.c:530
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define TVIS_STATEIMAGEMASK
Definition: commctrl.h:3260

Referenced by TreeListKeyDown(), and TreeListMouseClick().

◆ TreeListChar()

static void TreeListChar ( TreeListData pData,
UINT  nChar,
LPARAM  lParam 
)
static

Definition at line 7491 of file treelist.c.

7491  {
7492 
7493  LPTSTR pName;
7494  ExtraItem *pExtra;
7495  BaseItem *pEntry;
7496  unsigned uDelta;
7497  unsigned uItem;
7498  unsigned uTick;
7499  unsigned uSub;
7500  unsigned uPos;
7501  unsigned uVal;
7502  int iNum;
7503  int iMax;
7504  int i;
7505 
7506  if(nChar >= ' ') {
7507  if(pData->cKeyIgnore)
7508  return; // Taste soll ignoriert werden
7509 
7510  iMax = pData->uItemPosCount;
7511  uSub = pData->uSelectedSub;
7512  i = 0;
7513 
7514  if(TVIS_EDIT(pData->aColumn[uSub].bEdit)) // Bei AutoEdit keine Auswahl
7515  if(!(pData->aColumn[uSub].bFlags & TVAE_ONLYRETURN)) {
7516  TreeListStartAutoEdit(pData, uSub, nChar, 0);
7517  return;
7518  }
7519 
7520  if(TreeListStartNotifyEdit(pData, pData->uSelectedItem, uSub, nChar | VK_ISACHAR, lParam)) {
7521  return;
7522  }
7523 
7524  if(iMax <= 0)
7525  return;
7526 
7527  iNum = pData->uSelectedItem; // Hole die Startzeile
7528  if(iNum > 0) {
7529  iNum = pData->pTreeItems[iNum]->uShowPos - 1;
7530  if(iNum < 0)
7531  iNum = 0;
7532  }
7533 
7534  if((nChar >= 'a' && nChar <= 'z') || // In Grosbuchstaben umwandeln
7535  (nChar >= 224 && nChar <= 254)) {
7536  nChar -= 'a' - 'A';
7537  }
7538 
7539  if(!(pData->uStyleEx & TVS_EX_NOCHARSELCET))
7540  for(;;) { // Suche Anfangsbuchstaben
7541  uTick = GetTickCount();
7542  uDelta = (uKeyPos > 0) ? 750 : 500;
7543 
7544  if(uKeyPos >= 3)
7545  uDelta = 1000;
7546  if(uTick - uKeyLast > uDelta)
7547  uKeyPos = 0;
7548  if(uKeyPos >= 16)
7549  uKeyPos = 0;
7550  if(uKeyPos == 1 && cKeyData[0] == (TCHAR)nChar) {
7551  uKeyPos = 0;
7552  }
7553 
7554  cKeyData[uKeyPos] = (TCHAR)nChar;
7555  uKeyLast = uTick;
7556  uKeyPos += 1;
7557 
7558  if(uKeyPos > 1) {
7559  iNum--;
7560  if(iNum < 0)
7561  iNum = iMax - 1;
7562  }
7563 
7564  if(iMax <= 0)
7565  break;
7566 
7567  for(i = iNum + 1; i != iNum; i++) { // Suche Übereinstimmung
7568  if(i >= iMax) {i = -1; continue;}
7569  uItem = pData->pItemPos[i];
7570 
7571  if(uSub) {
7572 #ifndef __REACTOS__
7573  pExtra = pExtra = pData->pExtraItems[uSub - 1][uItem];
7574 #else
7575  pExtra = pData->pExtraItems[uSub - 1][uItem];
7576 #endif
7577  pName = (pExtra && pExtra->pText) ? pExtra->pText : _T("");
7578  } else {
7579  pEntry = pData->pTreeItems[uItem];
7580  pName = (pEntry && pEntry->pText) ? pEntry->pText : _T("");
7581  }
7582 
7583  for(uPos = 0; uPos < uKeyPos; uPos++) { // Vergleiche die Texte
7584 #if UNICODE
7585  uVal = pName[uPos];
7586 #else
7587  uVal = ((unsigned char *)pName)[uPos];
7588 #endif
7589 
7590  if((uVal >= 'a' && uVal <= 'z') || // In Grosbuchstaben umwandeln
7591  (uVal >= 224 && uVal <= 254)) {
7592  uVal -= 'a' - 'A';
7593  }
7594 
7595  if(cKeyData[uPos] != (TCHAR)uVal) {
7596  break;
7597  }
7598  }
7599 
7600  if(uPos < uKeyPos)
7601  continue;
7602 
7603  if(TreeListSelectItem(pData, uItem, uSub, TVC_UNKNOWN | TVC_DESELECT)) {
7604  TreeListEnsureVisible(pData, uItem, uSub);
7605  }
7606 
7607  return;
7608  }
7609 
7610  if(i != iNum)
7611  break;
7612  if(uKeyPos <= 1)
7613  break;
7614 
7615  iNum++;
7616  if(iNum >= iMax)
7617  iNum = iMax - 1;
7618 
7619  uKeyPos = 0;
7620  }
7621  }
7622 
7623 }
#define VK_ISACHAR
Definition: treelist.c:110
#define TVC_DESELECT
Definition: treelist.c:129
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:445
static int TreeListStartAutoEdit(TreeListData *pData, unsigned uColumn, WPARAM wParam, LPARAM lParam)
Definition: treelist.c:9695
CHAR * LPTSTR
Definition: xmlstorage.h:192
#define TVC_UNKNOWN
Definition: commctrl.h:3622
static int TreeListSelectItem(TreeListData *pData, unsigned uItem, unsigned uSubItem, int iMode)
Definition: treelist.c:3587
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static int TreeListStartNotifyEdit(TreeListData *pData, unsigned uItem, unsigned uSub, WPARAM wParam, LPARAM lParam)
Definition: treelist.c:9479
#define TVAE_ONLYRETURN
Definition: treelist.h:205
char TCHAR
Definition: xmlstorage.h:189
#define TVIS_EDIT(m)
Definition: treelist.c:120
#define _T(x)
Definition: vfdio.h:22
static LPSTR pName
Definition: security.c:75
LPTSTR pText
Definition: treelist.c:194
static int TreeListEnsureVisible(TreeListData *pData, unsigned uItem, unsigned uSub)
Definition: treelist.c:2861
static TCHAR cKeyData[16]
Definition: treelist.c:375
LPTSTR pText
Definition: treelist.c:174
static unsigned uKeyLast
Definition: treelist.c:376
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
static unsigned uKeyPos
Definition: treelist.c:377
#define TVS_EX_NOCHARSELCET
Definition: treelist.h:275
LPARAM lParam
Definition: combotst.c:139

Referenced by TreeListProc().

◆ TreeListDeleteColumn()

static int TreeListDeleteColumn ( TreeListData pData,
unsigned  uCol 
)
static

Definition at line 5119 of file treelist.c.

5119  {
5120 
5121  ExtraItem **pList;
5122  ExtraItem *pExtra;
5123  RECT sRect;
5124  BYTE bItem;
5125  BYTE bByte;
5126  unsigned uPos;
5127  unsigned uSub;
5128  unsigned uItem;
5129  unsigned uIndex;
5130  int iDelta;
5131  int iXoff;
5132  int iNum;
5133  int iCnt;
5134  int iVar;
5135  int iSub;
5136  int iAll;
5137  int iFix;
5138 
5139  if(uCol >= pData->uColumnCount)
5140  return 0;
5141 
5142  if(uCol && uCol == pData->uSelectedSub) { // Ist die Auswahl in der Spalte
5143  TreeListSelectItem(pData, pData->uSelectedItem, 0, TVC_UNKNOWN);
5144  }
5145 
5146  if(uCol && uCol == pData->uEditSub) {
5147  pData->uEditSub = 0;
5148  pData->uEditItem = 0;
5150  }
5151 
5152  if(uCol && uCol == pData->uFocusSub) {
5153  pData->uFocusSub = 0;
5154  pData->uFocusItem = 0;
5155  }
5156 
5157  if(uCol == pData->uTrackedSub) {
5158  pData->uTrackedSub = 0;
5159  pData->uTrackedItem = 0;
5160  }
5161 
5162  GetClientRect(pData->hWnd, &sRect);
5163 
5164  iDelta = pData->aColumn[uCol].sSize;
5165  iSub = pData->aColumn[uCol].bWeight;
5166  iCnt = 0;
5167  iVar = 0;
5168  iFix = 0;
5169  iAll = 0;
5170 
5171  for(uPos = 0; uPos < pData->uColumnCount; uPos++) { // Zählern der variablen Spalten
5172  if(uPos == uCol)
5173  continue;
5174  if(pData->aColumn[uPos].bWeight == 0) {
5175  iFix += pData->aColumn[uPos].sSize;
5176  continue;
5177  }
5178 
5179  iVar += pData->aColumn[uPos].sSize;
5180  iAll += pData->aColumn[uPos].bWeight;
5181  iCnt += 1;
5182  }
5183 
5184  Header_DeleteItem(pData->hHeader, uCol);
5185  pData->uColumnCount--;
5186 
5187  if(pData->uColumnCount > 0) { // Liste mit Extraeinträgen löschen
5188  iNum = uCol - 1;
5189  if(iNum < 0)
5190  iNum = 0;
5191 
5192  pList = pData->pExtraItems[iNum];
5193  if(pList) {
5194  for(uItem = 0; uItem <= pData->uTreeItemsMax; uItem++) { // Alle Einträge aus der Liste löschen
5195  pExtra = pList[uItem];
5196  if(!pExtra)
5197  continue;
5198 
5199  if(pExtra->pText) {
5200  pExtra->uTextSize = 0;
5201  delete(pExtra->pText);
5202  }
5203 
5204  delete(pExtra);
5205  }
5206 
5207  memmove(pData->pExtraItems + iNum, pData->pExtraItems + iNum + 1, sizeof(pList) * (MAX_COLUMNS - 1 - iNum));
5208  pData->pExtraItems[pData->uColumnCount] = NULL;
5209  delete(pList);
5210  }
5211  } else {
5212  iNum = MAX_COLUMNS;
5213  }
5214 
5215  if(pData->aColumn[uCol].bWeight) {
5216  pData->uColumnCountVar--;
5217  }
5218 
5219  if(pData->aColumn[uCol].bMark) {
5220  pData->uMarkedCols--;
5221  }
5222 
5223  uSub = pData->aColumnPos[uCol];
5224 
5225  memmove(pData->aColumn + uCol, pData->aColumn + uCol + 1, (MAX_COLUMNS - 1 - uCol)*sizeof(ColumnData));
5226 
5227  for(uIndex = 0; uIndex < uSub; uIndex++) { // Zuordnungs-Array anpassen
5228  bItem = pData->aColumnPos[uIndex - 1];
5229  if(bItem < uCol)
5230  continue;
5231 
5232  bItem++;
5233  pData->aColumnPos[uIndex] = bItem;
5234  }
5235 
5236  for(; uIndex <= pData->uColumnCount; uIndex++) { // Spaltenpositionen verschieben
5237  bItem = pData->aColumnPos[uIndex + 1];
5238 
5239  if(bItem >= uCol) {
5240  uCol--;
5241  }
5242 
5243  pData->aColumnPos[uIndex] = bItem;
5244  }
5245 
5246  for(uIndex = pData->uColumnCount; uIndex > 0;) {
5247  uIndex--;
5248  bByte = pData->aColumn[uIndex].bIndex;
5249 
5250  if(bByte >= uSub) {
5251  bByte--;
5252  pData->aColumn[uIndex].bIndex = bByte;
5253  }
5254 
5255  pData->aColumn[uIndex].bNext = pData->aColumnPos[bByte + 1];
5256  }
5257 
5258  pData->iFixSize = iFix;
5259  pData->iAllWeight = iAll;
5260  pData->aColumn[pData->uColumnCount].bWeight = 0;
5261 
5262  if(iCnt && iDelta) { // Variable Breiten anpassen
5263  ChangeColSize(pData, iDelta);
5264  } else {
5265  if(iSub && !iCnt) {
5266  pData->iVarSize = 0;
5267  }
5268  }
5269 
5270  if(pData->uSelectedSub > uCol) { // Ist die Auswahl vor der Spalte
5271  pData->uSelectedSub--;
5272  }
5273 
5274  if(pData->uEditSub > uCol) {
5275  pData->uEditSub--;
5276  }
5277 
5278  if(pData->uFocusSub > uCol) {
5279  pData->uFocusSub--;
5280  }
5281 
5282  if(pData->uTrackedSub > uCol) {
5283  pData->uTrackedSub--;
5284  }
5285 
5286  if(!pData->uColumnCount) { // Den Header löschen
5287  DestroyWindow(pData->hHeader);
5288  pData->hHeader = NULL;
5289  pData->uStartPixel = 0;
5290  pData->iRowHeight = 1;
5292  InvalidateRect(pData->hWnd, &sRect, FALSE);
5293  }
5294 
5295  iXoff = UpdateColumns(pData); // Hat sich die Spaltenbreiten verändert
5296  if(iXoff < 0x10000) {
5297  sRect.left = iXoff;
5298  sRect.left -= pData->uScrollX;
5299  sRect.top = pData->uStartPixel;
5300  InvalidateRect(pData->hWnd, &sRect, FALSE);
5301  }
5302 
5304 
5305  return 1;
5306 }
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
LONG top
Definition: windef.h:292
LONG left
Definition: windef.h:291
BOOL WINAPI DestroyWindow(_In_ HWND)
static void ChangeColSize(TreeListData *pData, int iDelta)
Definition: treelist.c:862
#define TVC_UNKNOWN
Definition: commctrl.h:3622
static int TreeListSelectItem(TreeListData *pData, unsigned uItem, unsigned uSubItem, int iMode)
Definition: treelist.c:3587
WORD uTextSize
Definition: treelist.c:198
static void UpdateScrollX(TreeListData *pData)
Definition: treelist.c:1658
smooth NULL
Definition: ftsmooth.c:416
static int UpdateColumns(TreeListData *pData)
Definition: treelist.c:2391
#define MAX_COLUMNS
Definition: treelist.c:102
static int UpdateHeight(TreeListData *pData)
Definition: treelist.c:1470
LPTSTR pText
Definition: treelist.c:194
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define Header_DeleteItem(hwndHD, i)
Definition: commctrl.h:729
unsigned char BYTE
Definition: mem.h:68
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
static int TreeListEndLabelEdit(TreeListData *pData, int iMode)
Definition: treelist.c:8889

Referenced by TreeListProc().

◆ TreeListDeleteItem()

static int TreeListDeleteItem ( TreeListData pData,
unsigned  uItem,
int  iMode 
)
static

Definition at line 3072 of file treelist.c.

3072  {
3073 
3074  NMTREEVIEW sNotify;
3075  ExtraItem **pList;
3076  ExtraItem *pExtra;
3077  BaseItem *pEntry;
3078  BaseItem *pTemp;
3079  unsigned uPos;
3080  int iOff;
3081  int iMax;
3082 
3083  if(pData->cLockChanges)
3084  return 0;
3085 
3086  if(uItem > pData->uTreeItemsMax) { // Prüfe den Eintrag
3087  if(uItem != U(TVI_ROOT))
3088  return 0; // Alles löschen
3089  if(pData->uLastChild == 0)
3090  return 0;
3091 
3092  while(pData->uLastChild) {
3093  TreeListDeleteItem(pData, pData->uLastChild, 0);
3094  }
3095 
3096  pData->uItemPosCount = 0;
3097 
3099  UpdateView(pData);
3100 
3101  return 1;
3102  }
3103 
3104  pEntry = pData->pTreeItems[uItem];
3105  if(!pEntry) { // Prüfe den Eintrag
3106  if(uItem != 0)
3107  return 0; // Alles löschen
3108  if(pData->uLastChild == 0)
3109  return 0;
3110 
3111  while(pData->uLastChild) {
3112  TreeListDeleteItem(pData, pData->uLastChild, 0);
3113  }
3114 
3115  pData->uItemPosCount = 0;
3116 
3118  UpdateView(pData);
3119 
3120  return 1;
3121  }
3122 
3123  if(iMode == 2) { // Nur Kindereinträge löschen
3124  if(!pEntry->uFirstChild) {
3125  return 0;
3126  }
3127 
3128  while(pEntry->uLastChild) { // Alle Kinder löschen
3129  TreeListDeleteItem(pData, pEntry->uLastChild, 0);
3130  }
3131 
3132  uPos = pEntry->uShowPos;
3133  if(uPos) {
3134  UpdateItems(pData, uItem);
3135  }
3136 
3137  return 1;
3138  }
3139 
3140  while(pEntry->uLastChild) { // Alle Kinder löschen
3141  TreeListDeleteItem(pData, pEntry->uLastChild, 0);
3142  }
3143 
3144  if(uItem == pData->uSelectedItem) { // Einen ausgewählten Eintrag löschen
3145  sNotify.hdr.code = TVN_SELCHANGED;
3146  sNotify.action = TVC_UNKNOWN;
3147  sNotify.itemOld.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE | TVIF_SUBITEM | TVIF_PARAM;
3148  sNotify.itemOld.hItem = (HTREEITEM)uItem;
3149  sNotify.itemOld.stateMask = 0xFFFFFFFF;
3150  sNotify.itemOld.state = pEntry->uState&~TVIS_SELECTED;
3151  sNotify.itemOld.lParam = pEntry->lParam;
3152  sNotify.itemOld.cChildren = 0;
3153  sNotify.itemOld.pszText = (LPTSTR) - 1;
3154  sNotify.itemOld.cchTextMax = -1;
3155  sNotify.itemNew.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE | TVIF_SUBITEM | TVIF_PARAM;
3156  sNotify.itemNew.hItem = NULL;
3157  sNotify.itemNew.stateMask = 0xFFFFFFFF;
3158  sNotify.itemNew.state = 0;
3159  sNotify.itemNew.lParam = 0;
3160  sNotify.itemNew.cChildren = 0;
3161  sNotify.itemNew.pszText = (LPTSTR) - 1;
3162  sNotify.itemNew.cchTextMax = -1;
3163  sNotify.ptDrag.x = 0;
3164  sNotify.ptDrag.y = 0;
3165 
3166  UNLOCK(pData);
3167  SendNotify(pData, &sNotify.hdr); // Bekant geben das der Eintrag nicht mehr ausgewählt ist
3168  LOCK(pData);
3169 
3170  pData->uSelectedItem = 0;
3171  pData->uSelectedSub = 0;
3172  }
3173 
3174  sNotify.hdr.code = TVN_DELETEITEM;
3175  sNotify.itemNew.mask = 0;
3176  sNotify.itemOld.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE;
3177  sNotify.itemOld.hItem = (HTREEITEM)uItem;
3178  sNotify.itemOld.lParam = pEntry->lParam;
3179  sNotify.itemOld.pszText = (LPTSTR) - 1;
3180  sNotify.itemNew.stateMask = 0xFFFFFFFF;
3181  sNotify.itemNew.state = pEntry->uState;
3182  sNotify.itemOld.cchTextMax = -1;
3183  sNotify.ptDrag.x = 0;
3184  sNotify.ptDrag.y = 0;
3185 
3186  UNLOCK(pData);
3187  SendNotify(pData, &sNotify.hdr);
3188  LOCK(pData);
3189 
3190  pEntry = pData->pTreeItems[uItem]; // Prüfen ob der Eintrag noch existiert
3191  if(!pEntry)
3192  return 0;
3193 
3194  if(uItem == pData->uTrackedItem) { // Einen unterstrichenen Eintrag löschen
3195  pData->uTrackedItem = 0;
3196  pData->uTrackedSub = 0;
3197  }
3198 
3199  if(pData->uInsertMark == uItem) {
3200  pData->uInsertMark = 0;
3201  }
3202 
3203  if(pData->uSingleSel == uItem) {
3204  pData->uSingleSel = 0;
3205  }
3206 
3207  if(pEntry->uPrevItem) { // Gibt es einen vorherigen Eintrag
3208  pTemp = pData->pTreeItems[pEntry->uPrevItem];
3209  pTemp->uNextItem = pEntry->uNextItem;
3210  } else {
3211  if(pEntry->uParent) { // Neues erstes Kind in Elterneintrag
3212  pTemp = pData->pTreeItems[pEntry->uParent];
3213  pTemp->uFirstChild = pEntry->uNextItem;
3214  } else {
3215  pData->uFirstChild = pEntry->uNextItem;
3216  }
3217  }
3218 
3219  if(pEntry->uNextItem) { // Gibt es einen vorherigen Eintrag
3220  pTemp = pData->pTreeItems[pEntry->uNextItem];
3221  pTemp->uPrevItem = pEntry->uPrevItem;
3222  } else {
3223  if(pEntry->uParent) { // Neues letztes Kind in Elterneintrag
3224  pTemp = pData->pTreeItems[pEntry->uParent];
3225  pTemp->uLastChild = pEntry->uPrevItem;
3226 
3227  if(pTemp->uFirstChild == 0 && pTemp->uLastChild == 0) {
3228  pTemp->bFlags &= ~TVIX_HASBUTTON;
3229  }
3230  } else {
3231  pData->uLastChild = pEntry->uPrevItem;
3232  }
3233  }
3234 
3235  for(uPos = 1; uPos < pData->uColumnCount; uPos++) { // Alle Extraeinträge löschen
3236  pList = pData->pExtraItems[uPos - 1];
3237 
3238  pExtra = pList[uItem];
3239  if(!pExtra)
3240  continue;
3241 
3242  pList[uItem] = NULL;
3243 
3244  if(pExtra->pText) {
3245  pExtra->uTextSize = 0;
3246  delete(pExtra->pText);
3247  }
3248 
3249  delete(pExtra);
3250  }
3251 
3252 
3253  pData->pTreeItems[uItem] = NULL; // Den Eintrag löschen
3254 
3255  if(pEntry->pText) {
3256  pEntry->uTextSize = 0;
3257  delete(pEntry->pText);
3258  }
3259 
3260  if(iMode) { // Den Eintrag neuzeichnen
3261  uItem = pEntry->uPrevItem;
3262  if(!uItem && !pEntry->uNextItem) {
3263  uItem = pEntry->uParent;
3264  if(!uItem)
3265  uPos = 1;
3266  else
3267  uPos = pData->pTreeItems[uItem]->uShowPos;
3268  } else {
3269  uPos = pEntry->uShowPos;
3270  }
3271 
3272  if(uPos) {
3273  UpdateItems(pData, uItem);
3274  }
3275  }
3276 
3277  if(pEntry->uState & TVIS_SELECTED) // Ausgewählte Einträge runterzählen
3278  if(pData->uSelectedCount > 0) {
3279  pData->uSelectedCount--;
3280  }
3281 
3282  delete(pEntry);
3283 
3284  pData->uTreeItemsCount--;
3285 
3286  iOff = pData->uScrollY; // Prüfe die Scrollposition
3287  iMax = pData->uItemPosCount;
3288  iMax -= pData->uPageEnties - 1;
3289 
3290  if(iOff >= iMax)
3291  iOff = iMax;
3292  if(iOff < 0)
3293  iOff = 0;
3294  if(iOff != (int)pData->uScrollY) {
3295  pData->uScrollY = iOff;
3296  SetScrollPos(pData->hWnd, SB_VERT, iOff, TRUE);
3297  UpdateView(pData);
3298  }
3299 
3300  return 1;
3301 }
#define U(h)
Definition: treelist.c:114
#define TRUE
Definition: types.h:120
WORD uTextSize
Definition: treelist.c:186
_In_ ULONG iMode
Definition: winddi.h:3520
unsigned uLastChild
Definition: treelist.c:180
#define SB_VERT
Definition: winuser.h:553
#define TVIS_SELECTED
Definition: commctrl.h:3252
struct _TREEITEM * HTREEITEM
Definition: commctrl.h:3236
static int TreeListDeleteItem(TreeListData *pData, unsigned uItem, int iMode)
Definition: treelist.c:3072
unsigned uPrevItem
Definition: treelist.c:181
#define LOCK(d)
Definition: treelist.c:119
BYTE bFlags
Definition: treelist.c:188
CHAR * LPTSTR
Definition: xmlstorage.h:192
#define TVC_UNKNOWN
Definition: commctrl.h:3622
#define NMTREEVIEW
Definition: commctrl.h:3614
WORD uTextSize
Definition: treelist.c:198
smooth NULL
Definition: ftsmooth.c:416
static void UpdateScrollY(TreeListData *pData)
Definition: treelist.c:1724
LPARAM lParam
Definition: treelist.c:173
static void UpdateView(TreeListData *pData)
Definition: treelist.c:1636
LPTSTR pText
Definition: treelist.c:194
UINT uState
Definition: treelist.c:175
unsigned uShowPos
Definition: treelist.c:178
#define TVN_SELCHANGED
Definition: commctrl.h:3707
#define TVIF_SUBITEM
Definition: treelist.h:102
#define TVI_ROOT
Definition: commctrl.h:3340
#define TVIX_HASBUTTON
Definition: treelist.c:165
#define TVIF_HANDLE
Definition: commctrl.h:3242
#define UNLOCK(d)
Definition: treelist.c:118
#define TVN_DELETEITEM
Definition: commctrl.h:3714
LPTSTR pText
Definition: treelist.c:174
unsigned uParent
Definition: treelist.c:183
unsigned uNextItem
Definition: treelist.c:182
#define TVIF_STATE
Definition: commctrl.h:3241
#define TVIF_PARAM
Definition: commctrl.h:3240
static LRESULT SendNotify(TreeListData *pData, NMHDR *pNotify)
Definition: treelist.c:530
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
unsigned uFirstChild
Definition: treelist.c:179
int WINAPI SetScrollPos(_In_ HWND, _In_ int, _In_ int, _In_ BOOL)
static void UpdateItems(TreeListData *pData, unsigned uItem)
Definition: treelist.c:2249

Referenced by TreeListProc(), and TreeListSetInsertMark().

◆ TreeListDraw()

static void TreeListDraw ( HWND  hWnd,
HDC  hDc,
RECT pRect 
)
static

Definition at line 12681 of file treelist.c.

12681  {
12682 
12683  COLORREF uEcColor;
12684  COLORREF uEvColor;
12685  COLORREF uBkColor;
12686  COLORREF uBtColor;
12687  COLORREF uOdColor;
12688  COLORREF uOcColor;
12689  COLORREF uFrColor;
12690  COLORREF uInColor;
12691  COLORREF uOldColor;
12692  COLORREF uOutColor;
12693  COLORREF uNextColor;
12694  COLORREF uTempColor;
12695  HRGN hRgnMain;
12696  HRGN aRgn[MAX_COLUMNS + 1];
12697  SIZE sSize;
12698  RECT sRect;
12699  RECT sArea;
12700  RECT sButton;
12702  BaseItem *pTemp;
12703  BaseItem *pEntry;
12704  ExtraItem *pExtra;
12705  LPCTSTR pText;
12706  HIMAGELIST hImgList;
12707  unsigned uTextSize;
12708  unsigned uRgnCount;
12709  unsigned uAutoMask;
12710  unsigned uFirstPos;
12711  unsigned uStyleEx;
12712  unsigned uColMark;
12713  unsigned uColumn;
12714  unsigned uState;
12715  unsigned uStyle;
12716  unsigned uExtra;
12717  unsigned uNext;
12718  unsigned uMark;
12719  unsigned uItem;
12720  unsigned uBits;
12721  unsigned uPos;
12722  unsigned uMax;
12723  int *pOffsets;
12724  int iRnType[MAX_COLUMNS + 1];
12725  int iXscroll;
12726  int iHeight;
12727  int iIndent;
12728  int iDelta;
12729  int iImage;
12730  int iShift;
12731  int iStart;
12732  int iCount;
12733  int iLevel;
12734  int iLast;
12735  int iSize;
12736  int iXpos;
12737  int iYpos;
12738  int iMaxX;
12739  int iAdd;
12740  int i;
12741 
12742  pData = GetHandle(hWnd);
12743 
12744  LOCK(pData);
12745 
12746  GetClientRect(hWnd, &sRect);
12747 
12748  if(!pRect)
12749  pRect = &sRect;
12750 
12751  iXscroll = -(int)pData->uScrollX;
12752  pOffsets = pData->aColumnXpos;
12753  hRgnMain = CreateRectRgn(pRect->left, pRect->top, pRect->right, pRect->bottom);
12754 
12755  uMax = pData->uColumnCount;
12756  if(!uMax) {
12757  aRgn [ 0 ] = CreateRectRgn(sRect.left, sRect.top, sRect.right, sRect.bottom);
12758  iRnType[ 0 ] = CombineRgn(aRgn[0], aRgn[0], hRgnMain, RGN_AND);
12759  uRgnCount = 1;
12760  } else {
12761  for(uPos = 0; uPos < uMax; uPos++) {
12762  uExtra = pData->aColumnPos[uPos ];
12763  uNext = pData->aColumnPos[uPos + 1];
12764  aRgn [uExtra] = CreateRectRgn(sRect.left + pOffsets[uExtra] + iXscroll, sRect.top, sRect.left + pOffsets[uNext] + iXscroll, sRect.bottom);
12765  iRnType[uExtra] = CombineRgn(aRgn[uExtra], aRgn[uExtra], hRgnMain, RGN_AND);
12766  }
12767 
12768  aRgn [uPos] = CreateRectRgn(sRect.left + pOffsets[uPos] + iXscroll, sRect.top, sRect.right, sRect.bottom);
12769  iRnType[uPos] = CombineRgn(aRgn[uPos], aRgn[uPos], hRgnMain, RGN_AND);
12770 
12771  uRgnCount = uMax + 1;
12772  }
12773 
12774  iHeight = pData->iRowHeight;
12775  uStyleEx = pData->uStyleEx;
12776  uStyle = pData->uStyle;
12777  iIndent = pData->iIndent;
12778  iShift = pData->iShift;
12779  uPos = pData->uScrollY;
12780  uMax = pData->uMaxEnties + uPos;
12781  uNext = (pData->uColumnCount <= 1) ? 1 : pData->aColumn[1].bIndex;
12782  uFirstPos = pData->aColumnXpos[uNext];
12783 
12784  if(iRnType[0] == NULLREGION)
12785  iMaxX = pData->iMaxSizeX;
12786  else
12787  iMaxX = uFirstPos - 1;
12788 
12789  if(uStyleEx & TVS_EX_ITEMLINES) {
12790  iHeight--;
12791  }
12792 
12793  if(uStyleEx & TVS_EX_AUTOEXPANDICON) {
12794  uAutoMask = TVIS_EXPANDED;
12795  } else {
12796  uAutoMask = 0;
12797  }
12798 
12799  if(uMax > pData->uItemPosCount) {
12800  uMax = pData->uItemPosCount;
12801  }
12802 
12803  uBkColor = pData->uColors[TVC_BK ];
12804  uFrColor = pData->uColors[TVC_FRAME];
12805 
12806  if(pData->uStyleEx & TVS_EX_ALTERNATECOLOR) { // Abwechselnde Farben
12807  uOdColor = pData->uColors[TVC_ODD ];
12808  uEvColor = pData->uColors[TVC_EVEN ];
12809  uOcColor = pData->uColors[TVC_COLODD ];
12810  uEcColor = pData->uColors[TVC_COLEVEN];
12811  } else {
12812  uOdColor = uBkColor;
12813  uEvColor = uBkColor;
12814  uOcColor = pData->uColors[TVC_COLBK];
12815  uEcColor = pData->uColors[TVC_COLBK];
12816  }
12817 
12818  if(!pData->cIsEnabled) // Wenn Fenster gessperrt grau zeichnen
12819  if(pData->uStyleEx & TVS_EX_GRAYEDDISABLE) {
12820  uBkColor = pData->uColors[TVC_GRAYED];
12821  uEvColor = uEcColor;
12822  uOdColor = uOcColor;
12823  }
12824 
12825  uInColor = pData->uColors[TVC_LINE];
12826  uBtColor = pData->uColors[TVC_BOX ];
12827  iStart = 0;
12828  iLast = 0;
12829 
12830  sArea.top = sRect.top + pData->uStartPixel;
12831  SelectObject(hDc, pData->hFontN);
12832  SelectObject(hDc, hPatternPen);
12833  SetBkColor(hDc, uBkColor);
12834  SetBkMode(hDc, TRANSPARENT);
12835  SetTextAlign(hDc, TA_LEFT | TA_TOP);
12836  SetTextColor(hDc, pData->uColors[TVC_TEXT]);
12837 
12838 //******************** Einträge zeichnen **************************************
12839  for(; uPos < uMax; uPos++) { // Alle Einträge ausgeben
12840  uItem = pData->pItemPos[uPos];
12841 
12842  pEntry = pData->pTreeItems[uItem];
12843  if(!pEntry)
12844  break;
12845 
12846  if((pEntry->uState & TVIS_SELECTED) && (uStyleEx & TVS_EX_FULLROWMARK)) {
12847  if(uStyleEx & TVS_EX_ALTERNATECOLOR)
12848  uOutColor = (uPos & 1) ? pData->uColors[TVC_MARKODD] : pData->uColors[TVC_MARKEVEN];
12849  else
12850  uOutColor = pData->uColors[TVC_MARK];
12851 
12852  uMark = (unsigned)~TVIS_BKCOLOR;
12853  uColMark = 0;
12854  } else
12855  if(uPos & 1) { // Farbe wechselweise ändern
12856  uColMark = pData->aColumn[0].bMark;
12857  uOutColor = (uColMark) ? uOcColor : uOdColor;
12858  uMark = 0xFFFFFFFF;
12859  } else {
12860  uColMark = pData->aColumn[0].bMark;
12861  uOutColor = (uColMark) ? uEcColor : uEvColor;
12862  uMark = 0xFFFFFFFF;
12863  }
12864 
12865  sArea.bottom = sArea.top + pData->iRowHeight;
12866  sArea.left = iXscroll;
12867  iLevel = pEntry->uLevel;
12868 
12869  if(iRnType[0] == NULLREGION) {
12870  goto ExtraDraw;
12871  }
12872 
12873  uBits = pEntry->uState & 0xFFFF;
12874  uBits |= pEntry->bFlags << 16;
12875  uBits &= uMark;
12876  iImage = (uBits & LVIS_SELECTED) ? pEntry->iSelectedImage : pEntry->iImage;
12877  pText = pEntry->pText;
12878  uTextSize = pEntry->uTextSize;
12879 
12880  if(pData->uSelectedSub && uItem == pData->uSelectedItem) {
12881  if(pData->uSelectedCount <= 1 || !(pData->uStyleEx & TVS_EX_SUBSELECT)) {
12882  uBits &= ~TVIS_SELECTED;
12883  }
12884  }
12885 
12886  if(pEntry->bCallback) {
12887  CallbackEntry(pData, pEntry, uItem, pEntry->bCallback, &iImage, &uTextSize, &pText);
12888 
12889  pEntry = pData->pTreeItems[uItem];
12890  if(!pEntry)
12891  break;
12892  }
12893 
12894  SelectObject(hDc, aRgn[0]);
12895 
12897  sButton.left = 0;
12898  sButton.right = iIndent * (iLevel + 1) + 2;
12899  sButton.bottom = sArea.bottom + 1;
12900  sButton.top = sArea.bottom - 2;
12901 
12902  SetBkColor(hDc, uFrColor);
12903  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sButton, NULL, 0, NULL);
12904  }
12905 
12906  if(pData->aColumn[0].bMark) { // Ist die erste Spalte markiert
12907  uBkColor = pData->uColors[TVC_COLBK];
12908  }
12909 
12910  SetBkColor(hDc, (uStyleEx & TVS_EX_FULLROWITEMS) ? uOutColor : uBkColor);
12911 
12912  if(pData->cHasRootRow)
12913  iLevel++;
12914 
12915  if(iLevel <= 0)
12916  goto NoRootLines;
12917 
12918  if(uStyle & (TVS_HASBUTTONS | TVS_HASLINES)) {
12919  iLevel--;
12920  }
12921 
12922  if(uStyleEx & TVS_EX_FULLROWITEMS) {
12923  sArea.bottom--;
12924  iAdd = 1;
12925  } else {
12926  iAdd = 0;
12927  }
12928 
12929  if(uStyle & TVS_HASLINES) {
12930  pTemp = pData->pTreeItems[pEntry->uParent];
12931  sArea.right = sArea.left + 1; // Eine leerer Pixelreihe am Anfang
12932  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
12933  sArea.left += iIndent * iLevel + 1;
12934 
12935  for(i = iLevel; i > 0; i--) { // Bereich vor Schaltflächen
12936  sArea.right = sArea.left;
12937  sArea.left -= iIndent;
12938 
12939  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
12940 
12941  iXpos = sArea.left + iShift;
12942 
12943  if(pTemp) {
12944  if(pTemp->uNextItem) { // Zeichne vertikale Linien
12945  MoveToEx(hDc, iXpos, sArea.top | 1, NULL);
12946  LineTo(hDc, iXpos, sArea.bottom + iAdd);
12947  }
12948 
12949  pTemp = pData->pTreeItems[pTemp->uParent];
12950  }
12951  }
12952 
12953  sArea.left += iIndent * iLevel;
12954  } else { // Ohne Linien zeichnen
12955  if(iLevel > 0) {
12956  sArea.right = sArea.left + iIndent * iLevel;
12957  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
12958  sArea.left += sArea.right;
12959  }
12960  }
12961 
12962  if(uStyle & TVS_HASBUTTONS) { // Fenster mit Schaltflächen ?
12963  sArea.right = sArea.left + iIndent;
12964  iXpos = sArea.left + iShift;
12965  iYpos = sArea.top + pData->iRowHeight / 2;
12966 
12967  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
12968 
12969  if(uStyle & TVS_HASLINES) { // Linien unter Schaltflächen
12970  MoveToEx(hDc, iXpos, sArea.top | 1, NULL);
12971 
12972  if(pEntry->uNextItem)
12973  LineTo(hDc, iXpos, sArea.bottom + iAdd);
12974  else
12975  LineTo(hDc, iXpos, iYpos + 1);
12976 
12977  MoveToEx(hDc, iXpos + 1 + (iYpos & 1), iYpos, NULL);
12978  LineTo(hDc, sArea.right , iYpos);
12979  }
12980 
12981  if(pEntry->bFlags & TVIX_HASBUTTON) { // Schaltflächen zeichnen
12982  sButton.left = iXpos - 4;
12983  sButton.top = iYpos - 4;
12984  sButton.right = iXpos + 5;
12985  sButton.bottom = iYpos + 5;
12986 
12987  if(pData->cGlyphOk) { // Thema benutzen
12988  uState = ((uBits ^ TVIS_EXPANDED) & (TVIS_EXPANDED | TVIS_EXPANDPARTIAL)) ? GLPS_CLOSED : GLPS_OPENED;
12989  pDrawThemeBackg(pData->hTheme, hDc, TVP_GLYPH, uState, &sButton, 0);
12990  } else {
12991  SetBkColor(hDc, uBtColor);
12992  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sButton, NULL, 0, NULL);
12993 
12994  sButton.left += 1;
12995  sButton.top += 1;
12996  sButton.right -= 1;
12997  sButton.bottom -= 1;
12998 
12999  SetBkColor(hDc, pData->uColors[TVC_BOXBG]);
13000  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sButton, NULL, 0, NULL);
13001 
13002  sButton.left = iXpos - 2;
13003  sButton.top = iYpos ;
13004  sButton.right = iXpos + 3;
13005  sButton.bottom = iYpos + 1;
13006 
13007  SetBkColor(hDc, uInColor);
13008  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sButton, NULL, 0, NULL);
13009 
13010  // '+' statt '-' Schaltfläsche zeichnenen
13011  if((uBits ^ TVIS_EXPANDED) & (TVIS_EXPANDED | TVIS_EXPANDPARTIAL)) {
13012  sButton.left = iXpos ;
13013  sButton.top = iYpos - 2;
13014  sButton.right = iXpos + 1;
13015  sButton.bottom = iYpos + 3;
13016  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sButton, NULL, 0, NULL);
13017  }
13018  }
13019 
13020  SetBkColor(hDc, uBkColor);
13021  }
13022 
13023  sArea.left += iIndent;
13024  } else
13025  if(uStyle & TVS_HASLINES) { // Nur Linien zeichnen ohne Schaltflächen
13026  sArea.right = sArea.left + iIndent;
13027  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13028 
13029  iYpos = sArea.top + pData->iRowHeight / 2;
13030  iXpos = sArea.left + iShift;
13031  MoveToEx(hDc, iXpos, sArea.top | 1, NULL);
13032 
13033  if(pEntry->uNextItem)
13034  LineTo(hDc, iXpos, sArea.bottom);
13035  else
13036  LineTo(hDc, iXpos, iYpos + 1);
13037 
13038  MoveToEx(hDc, iXpos + 1 + (iYpos & 1), iYpos, NULL);
13039  LineTo(hDc, sArea.right , iYpos);
13040 
13041  sArea.left += iIndent;
13042  }
13043 
13044  if(uStyleEx & TVS_EX_FULLROWITEMS)
13045  sArea.bottom++;
13046 
13047 NoRootLines:
13048 
13049  if(uStyleEx & TVS_EX_ITEMLINES) { // Linien um den Eintrag zeichnen
13050  iAdd = 1;
13051  sArea.right = sArea.left + 1;
13052 
13053  if(uStyleEx & TVS_EX_FULLROWITEMS) {
13054  iStart = sArea.left;
13055  iAdd = 0;
13056  } else
13057  if(iLevel >= 0) {
13058  SetBkColor(hDc, uFrColor);
13059  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13060 
13061  sArea.left++;
13062  sArea.bottom--;
13063  iStart = sArea.left;
13064  } else {
13065  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13066 
13067  sArea.left++;
13068  sArea.bottom--;
13069  iStart = sArea.left - 1;
13070  }
13071  } else {
13072  iAdd = 0;
13073  }
13074 
13075  SetBkColor(hDc, (uBits & TVIS_BKCOLOR) ? pEntry->uColorBk : uOutColor);
13076  SelectObject(hDc, (uBits & TVIS_BOLD) ? pData->hFontB : pData->hFontN);
13077 
13078  if(pData->hStates) { // State-Icons anzeigen
13079  sArea.right = sArea.left + pData->iStatesXsize;
13080  iYpos = sArea.top + (iHeight - pData->iStatesYsize) / 2;
13081  i = (uBits & LVIS_STATEIMAGEMASK) >> 12;
13082 
13083  sArea.right += iAdd;
13084  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13085  sArea.left += iAdd;
13086 
13087  if(pData->hStates == THEMEIMGLIST) { // Mit Thema zeichnen
13088  if(pData->uStyleEx & TVS_EX_BITCHECKBOX)
13089  i++;
13090 
13091  if(i >= 1 && i <= 2) {
13092  uState = (i == 1) ? CBS_UNCHECKEDNORMAL : CBS_CHECKEDNORMAL;
13093  pDrawThemeBackg(pData->hThemeBt, hDc, BP_CHECKBOX, uState, &sArea, 0);
13094  }
13095  } else {
13096  ImageList_Draw(pData->hStates, i, hDc, sArea.left, iYpos, ILD_TRANSPARENT);
13097  }
13098 
13099  sArea.left += pData->iStatesXsize;
13100  iAdd = 0;
13101  }
13102 
13103  if(pData->hImages && iImage != TV_NOIMAGE) { // Icon zeichnen vom Haupteintrag
13104  if(iImage >= TV_SECONDICON) { // Sub-Image-Liste verwenden
13105  if(iImage & TV_NOAUTOEXPAND) {
13106  iImage &= ~TV_NOAUTOEXPAND; // Kein Auto-Expant bei diesem Icon
13107  } else
13108  if((pEntry->uState & uAutoMask) && pEntry->uFirstChild) {
13109  iImage += 1; // Auto-Expant aktivieren
13110  }
13111 
13112  iImage -= TV_SECONDICON;
13113  sArea.right = sArea.left + pData->iSubImgXsize;
13114  iYpos = sArea.top + (iHeight - pData->iSubImgYsize) / 2;
13115  pEntry->bFlags |= TVIX_HASIMAGE;
13116 
13117  sArea.right += iAdd;
13118  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13119  sArea.left += iAdd;
13120  ImageList_Draw(pData->hSubImg, iImage, hDc, sArea.left, iYpos, ILD_TRANSPARENT | (uBits & (TVIS_OVERLAYMASK | LVIS_CUT)));
13121 
13122  sArea.left += pData->iSubImgXsize;
13123  iAdd = 0;
13124  } else { // Haup-Image-Liste verwenden
13125  if(iImage & TV_NOAUTOEXPAND) {
13126  iImage &= ~TV_NOAUTOEXPAND; // Kein Auto-Expant bei diesem Icon
13127  } else
13128  if((pEntry->uState & uAutoMask) && pEntry->uFirstChild) {
13129  iImage += pData->iAutoAdd; // Auto-Expant aktivieren
13130  }
13131 
13132  sArea.right = sArea.left + pData->iImagesXsize;
13133  iYpos = sArea.top + (iHeight - pData->iImagesYsize) / 2;
13134  pEntry->bFlags |= TVIX_HASIMAGE;
13135 
13136  sArea.right += iAdd;
13137  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13138  sArea.left += iAdd;
13139  ImageList_Draw(pData->hImages, iImage, hDc, sArea.left, iYpos, ILD_TRANSPARENT | (uBits & (TVIS_OVERLAYMASK | LVIS_CUT)));
13140 
13141  sArea.left += pData->iImagesXsize;
13142  iAdd = 0;
13143  }
13144  } else {
13145  pEntry->bFlags &= ~TVIX_HASIMAGE;
13146  }
13147 
13148  sArea.right = uFirstPos; // Text ausgeben vom Haupteintrag
13149  iYpos = sArea.top + (iHeight - pData->iFontHeight) / 2;
13150 
13152  // Das Feld speziel zeichnen
13153  TCHAR *pPtr = (TCHAR *)new(TCHAR, uTextSize + 4);
13154  INT *pPos = (INT *)new(INT, uTextSize + 4);
13155 
13156  ExtTextOut(hDc, 0, 0, ETO_OPAQUE | ETO_CLIPPED, &sArea, NULL, 0, NULL);
13157 
13158  sButton.top = iYpos;
13159  sButton.left = sArea.left + 4;
13160  sButton.right = sArea.right;
13161  sButton.bottom = iYpos + pData->iFontHeight + 2;
13162 
13163  if(!uTextSize) { // Feld ohne Text ?
13164  sButton.right -= 2;
13165  sButton.bottom--;
13166  pEntry->iTextPixels = 0;
13167  } else {
13168  if(pData->uStyleEx & TVS_EX_FULLROWMARK)
13169  if(pData->cHasFocus == 0 || uItem != pData->uSelectedItem || pData->uSelectedSub)
13170  if((uBits & TVIS_SELECTED) && !(uBits & (TVIS_DROPHILITED | TVIS_FOCUSED))) {
13171  sButton.left -= 1;
13172  }
13173 
13174  DrawText(hDc, pText, uTextSize, &sButton, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX | DT_CALCRECT);
13175  pEntry->iTextPixels = sButton.right - sButton.left;
13176  }
13177 
13178  // Passt der Text in die Spalte
13179  if(sButton.left + pEntry->iTextPixels >= (int)(sArea.right - pData->uScrollX)) {
13180  iSize = sArea.right - pData->uScrollX - sButton.left - 2;
13181  iSize -= (uBits & TVIS_BOLD) ? pData->uTrippleB : pData->uTrippleN;
13182  if(iSize < 3) {
13183  iCount = 0;
13184  } else {
13185  GetTextExtentExPoint(hDc, pText, uTextSize, iSize, &iCount, pPos, &sSize);
13186  }
13187  // Temporären Text mit "..." erzeugen
13188  memcpy(pPtr , pText, iCount * sizeof(TCHAR));
13189  memcpy(pPtr + iCount, _T("..."), 4 * sizeof(TCHAR));
13190 
13191  pText = pPtr;
13192  uTextSize = iCount + 3;
13193  sButton.right = sArea.right - 2;
13194  }
13195 
13196  // Das Feld selektiert zeichnen
13197  if((uBits & TVIS_SELECTED) && pData->cHasFocus && uItem == pData->uSelectedItem && !pData->uSelectedSub) {
13198  uTempColor = GetSysColor(COLOR_HIGHLIGHTTEXT);
13200  Rectangle(hDc, sButton.left - 2, sButton.top - 1, sButton.right + 2, sButton.bottom + 1);
13201  } else {
13202  if(uBits & TVIS_DROPHILITED) {
13203  uTempColor = GetSysColor(COLOR_HIGHLIGHTTEXT);
13206  Rectangle(hDc, sButton.left - 2, sButton.top - 1, sButton.right + 2, sButton.bottom + 1);
13207  } else
13208  if(uBits & TVIS_SELECTED) { // Ist das Feld ohne Focus ausgewählt
13209  if(pData->cHasFocus) {
13210  uTempColor = GetSysColor(COLOR_HIGHLIGHTTEXT);
13213  } else {
13214  if(uBits & TVIS_TEXTCOLOR)
13215  uTempColor = pEntry->uColorText;
13216  else
13217  uTempColor = pData ->uColors[TVC_TEXT];
13218 
13219  if(pData->uStyleEx & TVS_EX_FULLROWMARK)
13221  else
13223 
13225  }
13226 
13227  Rectangle(hDc, sButton.left - 2, sButton.top - 1, sButton.right + 2, sButton.bottom + 1);
13228  } else { // Das Feld normal zeichnen
13229  if(uBits & TVIS_TRACKED)
13230  uTempColor = pData ->uColors[TVC_TRACK];
13231  else
13232  if(uBits & TVIS_TEXTCOLOR)
13233  uTempColor = pEntry->uColorText;
13234  else
13235  uTempColor = pData ->uColors[TVC_TEXT ];
13236  sButton.right--;
13237  sButton.left --;
13238  }
13239 
13240  SelectObject(hDc, hPatternPen);
13241 
13242  if(uBits & TVIS_FOCUSED) { // Einen punktierten Rahmen um den Text zeichnen
13244  Rectangle(hDc, sButton.left - 2, sButton.top - 1, sButton.right + 2, sButton.bottom + 1);
13245  }
13246  }
13247 
13248  SetTextColor(hDc, uTempColor);
13249  sButton.left += pData->iFontOff;
13250  DrawText(hDc, pText, uTextSize, &sButton, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
13251 
13252  if(uBits & (TVIS_UNDERLINE | TVIS_TRACKED)) // Text unterstreichen
13253  if(pText && *pText) {
13254  sButton.left -= pData->iFontOff;
13255  sButton.right -= pData->iFontOff + 1;
13256  sButton.top += pData->iFontLine;
13257  sButton.bottom = sButton.top + 1;
13258  uOldColor = SetBkColor(hDc, uTempColor);
13259  ExtTextOut(hDc, 0, 0, ETO_OPAQUE | ETO_CLIPPED, &sButton, NULL, 0, NULL);
13260  SetBkColor(hDc, uOldColor);
13261  }
13262 
13263  SetTextColor(hDc, pData->uColors[TVC_TEXT]);
13264 
13265  delete(pPos);
13266  delete(pPtr);
13267  } else { // Das Feld normal ausgeben
13268  if(!pEntry->iTextPixels && uTextSize) {
13269  sButton.top = iYpos;
13270  sButton.left = sArea.left + 4;
13271  sButton.right = sArea.right;
13272  sButton.bottom = iYpos + pData->iFontHeight + 2;
13273  // Textbreite berechen
13274  DrawText(hDc, pText, uTextSize, &sButton, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX | DT_CALCRECT);
13275 
13276  pEntry->iTextPixels = sButton.right - sButton.left;
13277  }
13278 
13279  // Ist der Text größer als die Spalte
13280  if(sArea.left + pEntry->iTextPixels >= (int)(sArea.right - pData->uScrollX)) {
13281  INT *pPos = (INT *)new(INT, uTextSize);
13282 
13283  iSize = sArea.right - sArea.left - pData->uScrollX;
13284  iSize -= (uBits & TVIS_BOLD) ? pData->uTrippleB : pData->uTrippleN;
13285  if(iSize < 3) {
13286  iCount = 0;
13287  } else {
13288  GetTextExtentExPoint(hDc, pText, uTextSize, iSize, &iCount, pPos, &sSize);
13289  }
13290 
13291  if(iCount > 0) { // Passen noch Buchstaben vor "..."
13292  sButton.right = sArea.right;
13293  sArea.right = sArea.left + 2 + pPos[iCount - 1];
13294 
13295  ExtTextOut(hDc, sArea.left + 2, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, pText, iCount, NULL);
13296 
13297  sArea.left = sArea.right;
13298  sArea.right = sButton.right;
13299 
13300  ExtTextOut(hDc, sArea.left , iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, _T("..."), 3, NULL);
13301  } else {
13302  ExtTextOut(hDc, sArea.left + 2, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, _T("..."), 3, NULL);
13303  }
13304 
13305  delete(pPos);
13306  } else {
13307  ExtTextOut(hDc, sArea.left + 2, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, pText, uTextSize, NULL);
13308  }
13309  }
13310 
13311  i = sArea.left - iXscroll;
13312  i += pEntry->iTextPixels + 5;
13313  if(i > iMaxX)
13314  iMaxX = i;
13315 
13316  if(uStyleEx & TVS_EX_ITEMLINES) { // Linien um den Eintrag zeichnen
13317  SetBkColor(hDc, uFrColor);
13318 
13319  if(iLast > iStart) { // Ist das Feld nach links eingerückt gegenüber dem oberen
13320  sArea.top--;
13321  sArea.bottom = sArea.top + 1;
13322  sArea.left = iStart - 1;
13323  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13324  sArea.top++;
13325  }
13326 
13327  iLast = iStart; // Linie unter Feld zeichnen
13328  sArea.top += iHeight;
13329  sArea.left = iStart;
13330  sArea.bottom = sArea.top + 1;
13331 
13332  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13333 
13334  sArea.top -= iHeight;
13335  }
13336 
13337  //************ Extraeinträge zeichnen *********************************
13338 
13339 ExtraDraw:
13340 
13341  uNextColor = uOutColor; // Hintergrundfarbe für die nächste Spalte
13342 
13343  if(pData->aColumn[0].bMark) { // Ist die erste Spalte markiert
13344  uBkColor = pData->uColors[TVC_BK];
13345  }
13346 
13347  for(uColumn = 1; uColumn <= pData->uColumnCount; uColumn++) { // Extra Spalten zeichnen
13348  uExtra = pData->aColumnPos[uColumn ];
13349  uNext = pData->aColumnPos[uColumn + 1];
13350 
13351  if(pData->aColumn[uExtra].sReal == 0) // Ist die Spalte sichtbar
13352  if(uColumn < pData->uColumnCount) {
13353  continue;
13354  }
13355 
13356  if(uColMark != pData->aColumn[uExtra].bMark) // Ist die Spalte anderst markiert
13357  if(!(pEntry->uState & TVIS_SELECTED) || !(uStyleEx & TVS_EX_FULLROWMARK)) {
13358  if(uPos & 1) {
13359  uColMark = pData->aColumn[uExtra].bMark;
13360  uOutColor = (uColMark) ? uOcColor : uOdColor;
13361  } else {
13362  uColMark = pData->aColumn[uExtra].bMark;
13363  uOutColor = (uColMark) ? uEcColor : uEvColor;
13364  }
13365  }
13366 
13367  GetRgnBox(aRgn[uExtra], &sButton);
13368 
13369  if(iRnType[uExtra] == NULLREGION)
13370  continue;
13371 
13372  SelectObject(hDc, aRgn[uExtra]);
13373 
13374  sArea.left = pData->aColumnXpos[uExtra];
13375  sArea.left += iXscroll;
13376 
13377  if(uStyleEx & TVS_EX_ITEMLINES) { // Linie um den Eintrag zeichnen
13378  SetBkColor(hDc, uFrColor);
13379  // Linke Linie
13380  sArea.right = sArea.left + 1;
13381  sArea.bottom += 1;
13382 
13383  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13384 
13385  sArea.left += 1; // Untere Linie
13386  sArea.top += iHeight;
13387  sArea.bottom = sArea.top + 1;
13388  sArea.right = pData->aColumnXpos[uNext];
13389  if(uColumn < pData->uColumnCount)
13390  sArea.right += iXscroll;
13391 
13392  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13393 
13394  sArea.top -= iHeight;
13395  sArea.bottom -= 1;
13396  iAdd = 1;
13397  }
13398 
13399  if(sArea.left > (int)pData->uSizeX)
13400  break; // Noch im sichtbaren Bereich
13401 
13402  sArea.right = pData->aColumnXpos[uNext];
13403 
13404  if(uColumn < pData->uColumnCount) { // Ist es die letze Spalte ?
13405  sArea.right += iXscroll;
13406  pExtra = pData->pExtraItems[uExtra - 1][uItem];
13407  if(!pExtra)
13408  uNextColor = uOutColor;
13409  } else {
13410  pExtra = 0;
13411  }
13412 
13413  if(!pExtra) { // Leeres Feld zeichnen
13414  SetBkColor(hDc, uNextColor);
13415  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13416  } else {
13417  iSize = pData->iSubImgXsize;
13418  hImgList = pData->hSubImg;
13419  iImage = pExtra->iImage;
13420  pText = pExtra->pText;
13421  uTextSize = pExtra->uTextSize;
13422  uBits = (pExtra->uState & 0xFFFF);
13423  uBits |= (pExtra->bFlags << 16);
13424  uBits |= pEntry->uState & TVIS_BASEFLAGS;
13425  uBits &= uMark;
13426 
13427  if(uExtra != pData->uSelectedSub) {
13428  uBits &= ~TVIS_SELECTED;
13429  }
13430 
13431  if(pExtra->bCallback) { // Text über Callback holen
13432  CallbackExtra(pData, pEntry, pExtra, uItem, uExtra, pExtra->bCallback, &iImage, &uTextSize, &pText);
13433  pExtra = pData->pExtraItems[uExtra - 1][uItem];
13434  if(!pExtra)
13435  break;
13436  }
13437 
13438  uNextColor = (uBits & TVIS_BKCOLOR) ? pExtra->uColorBk : uOutColor;
13439  SetBkColor(hDc, uNextColor);
13440 
13441  if(pData->aColumn[uExtra].bEdit >= TVAX_CHECK) { // Checkboxen statt Icons
13442  hImgList = pData->hChecks;
13443  iSize = pData->iChecksXsize;
13444  iImage = (pExtra->uState & TVIS_STATEIMAGEMASK) >> 12;
13445  uBits &= ~TVIS_OVERLAYMASK;
13446 
13447  if(iImage & 8)
13448  if(pData->aColumn[uExtra].bFlags & TVAE_STATEENABLE) {
13449  iImage &= 7;
13450  }
13451  }
13452 
13453  if(hImgList && iImage > TV_NOIMAGE) { // Icon zeichnen
13454  sArea.right = sArea.left + iSize + 2;
13455  iYpos = sArea.top + (iHeight - iSize) / 2;
13456  pExtra->bFlags |= TVIX_HASIMAGE;
13457 
13458  SelectObject(hDc, (uBits & TVIS_BOLD) ? pData->hFontB : pData->hFontN);
13459  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sArea, NULL, 0, NULL);
13460 
13461  if(hImgList == THEMEIMGLIST) { // Mit Thema zeichnen
13462  if(pData->uStyleEx & TVS_EX_BITCHECKBOX)
13463  iImage++;
13464 
13465  if(iImage == 1 || iImage == 2) {
13466  uState = (iImage == 1) ? CBS_UNCHECKEDNORMAL : CBS_CHECKEDNORMAL;
13467  pDrawThemeBackg(pData->hThemeBt, hDc, BP_CHECKBOX, uState, &sArea, 0);
13468  }
13469  } else {
13470  ImageList_Draw(hImgList, iImage, hDc, sArea.left + 1, iYpos, ILD_TRANSPARENT | (uBits & (TVIS_OVERLAYMASK | LVIS_CUT)));
13471  }
13472 
13473  sArea.left += iSize + 1;
13474  sArea.right = pData->aColumnXpos[uNext];
13475  sArea.right += iXscroll;
13476  } else {
13477  pExtra->bFlags &= ~TVIX_HASIMAGE;
13478  }
13479 
13480  iYpos = sArea.top + (iHeight - pData->iFontHeight) / 2;
13481  SelectObject(hDc, (uBits & TVIS_BOLD) ? pData->hFontB : pData->hFontN);
13482 
13484  // Text ausgeben in spezilem Format
13485  TCHAR *pPtr = (TCHAR *)new(TCHAR, uTextSize + 4);
13486  INT *pPos = (INT *)new(INT, uTextSize + 4);
13487 
13488  ExtTextOut(hDc, 0, 0, ETO_OPAQUE | ETO_CLIPPED, &sArea, NULL, 0, NULL);
13489 
13490  sButton.top = iYpos;
13491  sButton.left = sArea.left + 4;
13492  sButton.right = sArea.right;
13493  sButton.bottom = iYpos + pData->iFontHeight + 2;
13494 
13495  if(!uTextSize) {
13496  sButton.left--;
13497  sButton.right -= 2;
13498  sButton.bottom--;
13499  pExtra->iTextPixels = 0;
13500  } else {
13501  if(pData->uStyleEx & TVS_EX_FULLROWMARK)
13502  if(pData->cHasFocus == 0 || uItem != pData->uSelectedItem)
13503  if((uBits & TVIS_SELECTED) && !(uBits & (TVIS_DROPHILITED | TVIS_FOCUSED))) {
13504  sButton.left -= 2;
13505  }
13506 
13507  DrawText(hDc, pText, uTextSize, &sButton, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX | DT_CALCRECT);
13508  pExtra->iTextPixels = sButton.right - sButton.left;
13509  }
13510 
13511  // Passt der Text in die Spalte
13512  if(sButton.left + pExtra->iTextPixels >= sArea.right) {
13513  if(uTextSize > 253)
13514  uTextSize = 253;
13515 
13516  iSize = sArea.right - sButton.left - 2;
13517  iSize -= (uBits & TVIS_BOLD) ? pData->uTrippleB : pData->uTrippleN;
13518  if(iSize < 3) {
13519  iCount = 0;
13520  } else {
13521  GetTextExtentExPoint(hDc, pText, uTextSize, iSize, &iCount, pPos, &sSize);
13522  }
13523 
13524  memcpy(pPtr , pText, iCount * sizeof(TCHAR));
13525  memcpy(pPtr + iCount, _T("..."), 4 * sizeof(TCHAR));
13526 
13527  pText = pPtr;
13528  uTextSize = iCount + 3;
13529  sButton.right = sArea.right - 2;
13530  }
13531 
13532  switch(pData->aColumn[uExtra].bAlign) { // Textausrichtung ausgleichen
13533  case DT_CENTER:
13534  iDelta = sArea .right - sArea .left;
13535  iDelta -= sButton.right - sButton.left;
13536  iDelta -= 6;
13537  iDelta /= 2;
13538  sButton.right += iDelta;
13539  sButton.left += iDelta;
13540  break;
13541 
13542  case DT_RIGHT:
13543  iDelta = sArea .right - sArea .left;
13544  iDelta -= sButton.right - sButton.left;
13545  iDelta -= 6;
13546  sButton.right += iDelta;
13547  sButton.left += iDelta;
13548  break;
13549 
13550  }
13551  // Ist das Feld ohne Focus ausgewählt
13552  if((uBits & TVIS_SELECTED) && pData->cHasFocus && uItem == pData->uSelectedItem) {
13553  uTempColor = GetSysColor(COLOR_HIGHLIGHTTEXT);
13555  Rectangle(hDc, sButton.left - 2, sButton.top - 1, sButton.right + 2, sButton.bottom + 1);
13556  } else {
13557  if(uBits & TVIS_DROPHILITED) {
13558  uTempColor = GetSysColor(COLOR_HIGHLIGHTTEXT);
13561  Rectangle(hDc, sButton.left - 2, sButton.top - 1, sButton.right + 2, sButton.bottom + 1);
13562  } else
13563  if(uBits & TVIS_SELECTED && uItem == pData->uSelectedItem) {
13564  if(uBits & TVIS_TEXTCOLOR)
13565  uTempColor = pEntry->uColorText;
13566  else
13567  uTempColor = pData->uColors[TVC_TEXT];
13568 
13569  if(pData->uStyleEx & TVS_EX_FULLROWMARK)
13571  else
13573 
13575  Rectangle(hDc, sButton.left - 2, sButton.top - 1, sButton.right + 2, sButton.bottom + 1);
13576  } else {
13577  if(uBits & TVIS_TRACKED)
13578  uTempColor = pData ->uColors[TVC_TRACK];
13579  else
13580  if(uBits & TVIS_TEXTCOLOR)
13581  uTempColor = pExtra->uColorText;
13582  else
13583  uTempColor = pData ->uColors[TVC_TEXT ];
13584  sButton.right--;
13585  sButton.left --;
13586  }
13587 
13588  SelectObject(hDc, hPatternPen);
13589 
13590  if(uBits & TVIS_FOCUSED) { // Punktierten Rahmen um Text zeichnen
13592  Rectangle(hDc, sButton.left - 2, sButton.top - 1, sButton.right + 2, sButton.bottom + 1);
13593  }
13594  }
13595 
13596  SetTextColor(hDc, uTempColor);
13597  sButton.left += pData->iFontOff;
13598 
13599  DrawText(hDc, pText, uTextSize, &sButton, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
13600 
13601  if(uBits & (TVIS_UNDERLINE | TVIS_TRACKED)) // Text unterstreichen
13602  if(pText && *pText) {
13603  sButton.left -= pData->iFontOff;
13604  sButton.right -= pData->iFontOff + 1;
13605  sButton.top += pData->iFontLine;
13606  sButton.bottom = sButton.top + 1;
13607  uOldColor = SetBkColor(hDc, uTempColor);
13608  ExtTextOut(hDc, 0, 0, ETO_OPAQUE | ETO_CLIPPED, &sButton, NULL, 0, NULL);
13609  SetBkColor(hDc, uOldColor);
13610  }
13611 
13612  SetTextColor(hDc, pData->uColors[TVC_TEXT]);
13613 
13614  delete(pPos);
13615  delete(pPtr);
13616  } else { // Den Text ganz normal ausgeben
13617  if(!pExtra->iTextPixels) {
13618  sButton.top = iYpos;
13619  sButton.left = sArea.left + 4;
13620  sButton.right = sArea.right;
13621  sButton.bottom = iYpos + pData->iFontHeight + 2;
13622 
13623  if(uTextSize) { // Textbreite berechen
13624  DrawText(hDc, pText, uTextSize, &sButton, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX | DT_CALCRECT);
13625  pExtra->iTextPixels = sButton.right - sButton.left;
13626  } else {
13627  pExtra->iTextPixels = 0;
13628  }
13629  }
13630  // Ist der Text größer als die Spalte
13631  if(sArea.left + pExtra->iTextPixels >= sArea.right) {
13632  INT *pPos = (INT *)new(INT, uTextSize);
13633 
13634  iSize = sArea.right - sArea.left;
13635  iSize -= (uBits & TVIS_BOLD) ? pData->uTrippleB : pData->uTrippleN;
13636  if(iSize < 3) {
13637  iCount = 0;
13638  } else {
13639  GetTextExtentExPoint(hDc, pText, uTextSize, iSize, &iCount, pPos, &sSize);
13640  }
13641 
13642  if(iCount > 0) { // Passen noch Buchstaben vor "..."
13643  sButton.right = sArea.right;
13644  sArea.right = sArea.left + 2 + pPos[iCount - 1];
13645 
13646  ExtTextOut(hDc, sArea.left + 2, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, pText, iCount, NULL);
13647 
13648  sArea.left = sArea.right;
13649  sArea.right = sButton.right;
13650 
13651  ExtTextOut(hDc, sArea.left , iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, _T("..."), 3, NULL);
13652  } else {
13653  ExtTextOut(hDc, sArea.left + 2, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, _T("..."), 3, NULL);
13654  }
13655 
13656  delete(pPos);
13657  } else {
13658  switch(pData->aColumn[uExtra].bAlign) { // Textausrichtung
13659  case DT_CENTER:
13660  SetTextAlign(hDc, TA_CENTER | TA_TOP);
13661  ExtTextOut(hDc, (sArea.right + sArea.left) / 2, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, pText, uTextSize, NULL);
13662  SetTextAlign(hDc, TA_LEFT | TA_TOP);
13663  break;
13664 
13665  case DT_RIGHT:
13666  SetTextAlign(hDc, TA_RIGHT | TA_TOP);
13667  ExtTextOut(hDc, sArea.right - 2, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, pText, uTextSize, NULL);
13668  SetTextAlign(hDc, TA_LEFT | TA_TOP);
13669  break;
13670 
13671  default
13672  :
13673  ExtTextOut(hDc, sArea.left + 2, iYpos, ETO_OPAQUE | ETO_CLIPPED, &sArea, pText, uTextSize, NULL);
13674  break;
13675  }
13676  }
13677  }
13678  }
13679  }
13680 
13681  sArea.top += pData->iRowHeight;
13682  }
13683 
13684  if(sArea.top < sRect.bottom) { // Untere Fläche ohne Einträge füllen
13685  SelectObject(hDc, hRgnMain);
13686 
13687  // Gibt es markierte Spalten
13688  if(pData->uMarkedCols > 0 && (pData->cIsEnabled || !(pData->uStyleEx & TVS_EX_GRAYEDDISABLE))) {
13689  sRect.right = 0 - pData->uScrollX;
13690 
13691  for(uColumn = 0; uColumn < pData->uColumnCount; uColumn++) {
13692  uExtra = pData->aColumnPos[uColumn ];
13693  uNext = pData->aColumnPos[uColumn + 1];
13694  uMark = pData->aColumn[uExtra].bMark;
13695  sRect.top = sArea.top;
13696  sRect.left = sRect.right;
13697  sRect.right = pData->aColumnXpos[uNext] + uMark;
13698  sRect.right -= pData->uScrollX;
13699  if(sRect.right == sRect.left + 1)
13700  uMark = 0;
13701  SetBkColor(hDc, (uMark) ? pData->uColors[TVC_COLBK] : uBkColor);
13702  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sRect, NULL, 0, NULL);
13703  }
13704 
13705  sRect.top = sArea.top;
13706  sRect.left = sRect.right;
13707  sRect.right = pData->uSizeX;
13708  SetBkColor(hDc, uBkColor);
13709  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sRect, NULL, 0, NULL);
13710  } else { // Keine markierten Spalten
13711  sRect.top = sArea.top;
13712  SetBkColor(hDc, uBkColor);
13713  ExtTextOut(hDc, 0, 0, ETO_OPAQUE, &sRect, NULL, 0, NULL);
13714  }
13715  }
13716 
13717  if(pData->iMaxSizeX != iMaxX) { // X-Scrollbar aktuallisieren
13718  pData->iMaxSizeX = iMaxX;
13719  if(pData->uColumnCount == 0)
13720  if(pData->iMaxSizeX != (int)pData->uOldXCount) {
13722  }
13723  }
13724 
13725  UNLOCK(pData);
13726 
13727  DeleteObject(hRgnMain);
13728 
13729  for(uPos = 0; uPos < uRgnCount; uPos++) {
13730  DeleteObject(aRgn[uPos]);
13731  }
13732 
13733 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define TV_NOIMAGE
Definition: treelist.h:88
int WINAPI CombineRgn(_In_opt_ HRGN hrgnDest, _In_opt_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ int fnCombineMode)
#define TVIS_EXPANDPARTIAL
Definition: commctrl.h:3258
#define GetHandle(h)
Definition: treelist.c:116
#define TVC_BK
Definition: treelist.h:137
const CHAR * LPCTSTR
Definition: xmlstorage.h:193
#define COLOR_HIGHLIGHT
Definition: winuser.h:916
LPCSTR pText
Definition: txtscale.cpp:79
WORD uTextSize
Definition: treelist.c:186
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
#define TVIS_FOCUSED
Definition: treelist.c:125
#define TVIS_SELECTED
Definition: commctrl.h:3252
#define NULL_BRUSH
Definition: wingdi.h:900
#define TVC_BOX
Definition: treelist.h:143
unsigned uLevel
Definition: treelist.c:184
HWND hWnd
Definition: settings.c:17
#define NULLREGION
Definition: wingdi.h:360
LONG top
Definition: windef.h:292
#define CBS_CHECKEDNORMAL
Definition: treelist.c:151
#define TVC_MARK
Definition: treelist.h:145
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
static HPEN hPatternPen
Definition: treelist.c:368
#define LVIS_CUT
Definition: commctrl.h:2292
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
_In_ UINT iStart
Definition: wingdi.h:3598
int iImage
Definition: treelist.c:196
int iSelectedImage
Definition: treelist.c:177
#define TA_LEFT
Definition: wingdi.h:931
#define DT_RIGHT
Definition: winuser.h:538
BOOL WINAPI ImageList_Draw(HIMAGELIST himl, INT i, HDC hdc, INT x, INT y, UINT fStyle)
Definition: imagelist.c:1193
LONG left
Definition: windef.h:291
#define LOCK(d)
Definition: treelist.c:119
UINT WINAPI SetTextAlign(_In_ HDC, _In_ UINT)
Definition: text.c:846
#define TVIS_BASEFLAGS
Definition: treelist.c:121
LONG right
Definition: windef.h:293
#define DT_NOPREFIX
Definition: winuser.h:537
#define TVAE_STATEENABLE
Definition: treelist.h:206
BYTE bFlags
Definition: treelist.c:188
int32_t INT
Definition: typedefs.h:56
DWORD WINAPI GetSysColor(_In_ int)
#define TVS_EX_FULLROWITEMS
Definition: treelist.h:279
#define TVS_EX_AUTOEXPANDICON
Definition: treelist.h:274
#define DrawText
Definition: winuser.h:5637
#define CBS_UNCHECKEDNORMAL
Definition: treelist.c:148
#define TV_SECONDICON
Definition: treelist.h:91
#define RGN_AND
Definition: wingdi.h:355
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:975
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
COLORREF uColorBk
Definition: treelist.c:190
#define TA_TOP
Definition: wingdi.h:929
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1032
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define COLOR_3DFACE
Definition: winuser.h:919
#define ETO_OPAQUE
Definition: wingdi.h:646
#define DT_LEFT
Definition: winuser.h:534
#define DT_CALCRECT
Definition: winuser.h:526
#define TVC_COLBK
Definition: treelist.h:150
#define TVC_FRAME
Definition: treelist.h:140
WORD uTextSize
Definition: treelist.c:198
#define TVS_HASBUTTONS
Definition: commctrl.h:3219
#define TRANSPARENT
Definition: wingdi.h:949
#define NULL_PEN
Definition: wingdi.h:903
UINT uState
Definition: treelist.c:195
static void UpdateScrollX(TreeListData *pData)
Definition: treelist.c:1658
#define TVIS_OVERLAYMASK
Definition: commctrl.h:3259
smooth NULL
Definition: ftsmooth.c:416
#define LVIS_SELECTED
Definition: commctrl.h:2291
#define BP_CHECKBOX
Definition: treelist.c:145
#define TVC_ODD
Definition: treelist.h:138
#define TVS_EX_ALTERNATECOLOR
Definition: treelist.h:270
#define ETO_CLIPPED
Definition: wingdi.h:647
#define MAX_COLUMNS
Definition: treelist.c:102
int iTextPixels
Definition: treelist.c:197
#define TVIS_TRACKED
Definition: treelist.c:122
#define LVIS_STATEIMAGEMASK
Definition: commctrl.h:2298
#define DT_VCENTER
Definition: winuser.h:543
#define TVP_GLYPH
Definition: treelist.c:136
#define COLOR_HIGHLIGHTTEXT
Definition: winuser.h:917
static void CallbackExtra(TreeListData *pData, BaseItem *pEntry, ExtraItem *pExtra, unsigned uItem, unsigned uSub, unsigned uFlags, int *iImage, unsigned *uTextSize, LPCTSTR *pText)
Definition: treelist.c:639
#define TVIS_DROPHILITED
Definition: commctrl.h:3254
#define TVC_TEXT
Definition: treelist.h:141
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
BYTE bCallback
Definition: treelist.c:199
#define TVC_TRACK
Definition: treelist.h:144
#define TA_RIGHT
Definition: wingdi.h:932
COLORREF uColorText
Definition: treelist.c:189
char TCHAR
Definition: xmlstorage.h:189
#define TVC_GRAYED
Definition: treelist.h:153
#define _T(x)
Definition: vfdio.h:22
LPTSTR pText
Definition: treelist.c:194
UINT uState
Definition: treelist.c:175
BYTE bCallback
Definition: treelist.c:187
DWORD COLORREF
Definition: windef.h:285
#define TVS_EX_ITEMLINES
Definition: treelist.h:269
#define GLPS_CLOSED
Definition: treelist.c:139
#define ExtTextOut
Definition: wingdi.h:4432
#define TVC_COLEVEN
Definition: treelist.h:152
COLORREF uColorText
Definition: treelist.c:201
BYTE bFlags
Definition: treelist.c:200
#define TVC_BOXBG
Definition: treelist.h:149
#define TVS_EX_GRAYEDDISABLE
Definition: treelist.h:278
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define TVIS_BKCOLOR
Definition: treelist.c:123
int iTextPixels
Definition: treelist.c:185
#define TVC_MARKODD
Definition: treelist.h:146
#define TVIX_HASBUTTON
Definition: treelist.c:165
#define TVIS_EXPANDED
Definition: commctrl.h:3256
int WINAPI GetRgnBox(_In_ HRGN, _Out_ LPRECT)
#define TVIX_HASIMAGE
Definition: treelist.c:166
#define UNLOCK(d)
Definition: treelist.c:118
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:881
#define ILD_TRANSPARENT
Definition: commctrl.h:403
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define DT_SINGLELINE
Definition: winuser.h:540
LPTSTR pText
Definition: treelist.c:174
#define TVS_EX_BITCHECKBOX
Definition: treelist.h:268
static DrawThemeBackgT pDrawThemeBackg
Definition: treelist.c:364
int iImage
Definition: treelist.c:176
#define TVIS_TEXTCOLOR
Definition: treelist.c:126
#define TVC_LINE
Definition: treelist.h:142
#define TVAX_CHECK
Definition: treelist.c:161
unsigned uParent
Definition: treelist.c:183
#define TVS_HASLINES
Definition: commctrl.h:3220
unsigned uNextItem
Definition: treelist.c:182
#define GetTextExtentExPoint
Definition: wingdi.h:4449
LONG bottom
Definition: windef.h:294
#define TVC_MARKEVEN
Definition: treelist.h:147
#define DT_CENTER
Definition: winuser.h:527
#define TVIS_BOLD
Definition: commctrl.h:3255
#define TA_CENTER
Definition: wingdi.h:930
#define GLPS_OPENED
Definition: treelist.c:142
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define TVS_EX_SUBSELECT
Definition: treelist.h:271
#define TVIS_UNDERLINE
Definition: treelist.h:104
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define TVC_EVEN
Definition: treelist.h:139
unsigned uFirstChild
Definition: treelist.c:179
#define TVS_EX_FULLROWMARK
Definition: treelist.h:272
Definition: