C# TreeView复选框未正确显示

C# TreeView复选框未正确显示,c#,winforms,checkbox,treeview,C#,Winforms,Checkbox,Treeview,我需要一些关于带有复选框的TreeView的帮助,因为在隐藏父节点的复选框并只保留子节点的复选框后,它们看起来是被切断的。 树状视图如下所示: 我用于隐藏父节点复选框的代码如下: private const int TVIF_STATE = 0x8; private const int TVIS_STATEIMAGEMASK = 0xF000; private const int TV_FIRST = 0x1100; private const int TVM_SETITEM = TV_FIR

我需要一些关于带有复选框的
TreeView
的帮助,因为在隐藏父节点的复选框并只保留子节点的复选框后,它们看起来是被切断的。 树状视图如下所示:

我用于隐藏父节点复选框的代码如下:

private const int TVIF_STATE = 0x8;
private const int TVIS_STATEIMAGEMASK = 0xF000;
private const int TV_FIRST = 0x1100;
private const int TVM_SETITEM = TV_FIRST + 63;

[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
private struct TVITEM
{
    public int mask;
    public IntPtr hItem;
    public int state;
    public int stateMask;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string lpszText;
    public int cchTextMax;
    public int iImage;
    public int iSelectedImage;
    public int cChildren;
    public IntPtr lParam;
}

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam);

/// <summary>
/// Hides the checkbox for the specified node on a TreeView control.
/// </summary>
private void HideCheckBox(TreeView tvw, TreeNode node)
{
    TVITEM tvi = new TVITEM();
    tvi.hItem = node.Handle;
    tvi.mask = TVIF_STATE;
    tvi.stateMask = TVIS_STATEIMAGEMASK;
    tvi.state = 0;
    SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}

void sharedFolders_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
    if (e.Node.Level == 1 || e.Node.Level == 0)
        HideCheckBox(sharedFolders, e.Node);
    e.DrawDefault = true;
}
private const int TVIF_STATE=0x8;
私有常量int TVIS_stateMageMask=0xF000;
private const int TV_FIRST=0x1100;
私用const int TVM_SETITEM=TV_FIRST+63;
[StructLayout(LayoutKind.Sequential,Pack=8,CharSet=CharSet.Auto)]
私有结构项
{
公共int掩码;
公共IntPtr hItem;
公共国家;
公共int状态掩码;
[Marshallas(UnmanagedType.LPTStr)]
公共字符串lpszText;
公共int cchTextMax;
公共国际形象;
公共int选择图像;
公共儿童;
公共IntPtr LPRAM;
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto)]
私有静态外部IntPtr SendMessage(IntPtr hWnd、int Msg、IntPtr wParam、ref TVTItem LPRAM);
/// 
///隐藏TreeView控件上指定节点的复选框。
/// 
私有void HideCheckBox(TreeView tvw,TreeNode节点)
{
TviItem tvi=新的TviItem();
tvi.hItem=node.Handle;
tvi.mask=TVIF_状态;
tvi.stateMask=TVIS_stateMask;
tvi.state=0;
发送消息(tvw.Handle、TVM_设置项、IntPtr.Zero、参考tvi);
}
void sharedFolders\u DrawNode(对象发送方,DrawTreeNodeEventTargets e)
{
如果(e.Node.Level==1 | | e.Node.Level==0)
HideCheckBox(sharedFolders,e.Node);
e、 DrawDefault=true;
}

有人能帮我显示完整的复选框吗

尝试将您的
TreeView
DrawMode
更改为OwnerDrawAll

sharedFolders.DrawMode = TreeViewDrawMode.OwnerDrawAll;