你的状态掩码有误,没有TVIS_CHECKED 状态掩码(实际上没有TVIS_CHECKED,稍后会详细介绍)。复选框通过图像列表进行管理,documentation 对此进行了说明。
另外,当然,你必须打电话给TreeView_SetItem:
const
TVIS_CHECKED = 2 shl 12;
var
Node: TTreeNode;
TVItem: TTVItem;
begin
Node := TreeView1.Selected;
if Assigned(Node) then begin
TVItem.mask := TVIF_STATE;
TVItem.hItem := Node.ItemId;
TreeView_GetItem(Node.TreeView.Handle, TVItem);
TVItem.stateMask := TVIS_STATEIMAGEMASK;
TVItem.state := TVIS_CHECKED;
TreeView_SetItem(Node.TreeView.Handle, TVItem);
end;
end;
通常我会建议打电话给
TreeView_SetCheckState,但VCL 在宏的翻译中有一个奇怪的错误。
这是标题中的宏:
#define TreeView_SetCheckState(hwndTV, hti, fCheck) \
TreeView_SetItemState(hwndTV, hti, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), TVIS_STATEIMAGEMASK)
在哪里
#define INDEXTOSTATEIMAGEMASK(i) ((i) << 12)
这就是为什么虚构的TVIS_CHECKED 是 2000 美元,当fCheck 为真时,定义向左移动 2 个 12 位(2 是选中图像的索引,1 是未选中)。
这是VCL的翻译:
function TreeView_SetCheckState(hwndTV: HWND; hti: HTreeItem; fCheck: BOOL): UINT;
var
LState: UINT;
begin
if IndexToStateImageMask(Integer(fCheck)) = 0 then
LState := 1
else
LState := 2;
Result := TreeView_SetItemState(hwndTV, hti, LState, TVIS_STATEIMAGEMASK);
IndexToStateImageMask 在哪里
Result := I shl 12;
奇怪的是,VCL 将 fCheck 移动了 12 位,然后调用 TreeView_SetItemState,其状态对于状态图像掩码没有意义(TVIS_FOCUSED (1)、TVIS_SELECTED (2))。
这是 XE2,如果您使用更高版本,我建议先测试宏。