SysTreeView32,需先 InitCommonControlsTVS_HASBUTTONS (展開/收合 ±)、TVS_HASLINES (連接線)、TVS_LINESATROOT (根節點也顯示線/按鈕)TVM_* 訊息控制控制項WM_NOTIFY (含 NMHDR + 擴充結構) 通知父視窗,代碼以 TVN_* 開頭hParent = 父項目控制代碼 (TVI_ROOT/NULL 表根節點)
hInsertAfter = TVI_FIRST/TVI_LAST/TVI_SORT
item.imask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE ...
item.pszText = 項目標籤字串指標
item.iImage = 圖示索引 (未選取)
item.iSelectedImage = 圖示索引 (選取)
ImageList_Create(cx, cy, flags, cInitial, cGrow) → 取得 HIMAGELISTLoadBitmap 從資源載入點陣圖ImageList_Add(himl, hbm, NULL) 加入圖示 (自動按寬高切割)DeleteObject(hbm) 釋放點陣圖SendMessage(hwndTV, TVM_SETIMAGELIST, TVSIL_NORMAL, himl) 關聯TVM_GETITEM 需預設 TVITEM.imask 與 hItemTVM_GETNEXTITEM 旗標:TVGN_CARET (焦點)、TVGN_CHILD、TVGN_DROPHILITE (拖放目標)、TVGN_ROOT、TVGN_NEXT/PREVIOUS 等TVN_BEGINDRAG:TVM_CREATEDRAGIMAGE 產生拖放專用圖示列表 → ImageList_BeginDrag(hDrag, 0, 0, 0) 設熱點 → ImageList_DragEnter(hwndTV, x, y) 顯示 → SetCapture(hwnd) 捕捉滑鼠WM_MOUSEMOVE:ImageList_DragMove(x,y) 更新位置 → ImageList_DragShowNolock(FALSE) 隱藏拖放圖示 → TVM_HITTEST 檢測目標項目 → 若命中 TVM_SELECTITEM(TVGN_DROPHILITE, hItem) 高亮 → ImageList_DragShowNolock(TRUE) 恢復WM_LBUTTONUP:ImageList_DragLeave/DragEnd/Destroy 清理 → TVM_GETNEXTITEM(TVGN_DROPHILITE) 取得目標 → TVM_SELECTITEM(TVGN_CARET) 正式選取 → TVM_SELECTITEM(TVGN_DROPHILITE, 0) 取消高亮 → ReleaseCapture原文提供完整可編譯範例:建立視窗、TreeView、ImageList、插入根/子節點、處理 WM_NOTIFY/WM_MOUSEMOVE/WM_LBUTTONUP 實現拖放,註解詳盡。