gpt4 book ai didi

winforms - 如何禁用 WinForms TreeView 节点复选框?

转载 作者:行者123 更新时间:2023-12-02 15:54:21 24 4
gpt4 key购买 nike

我需要能够禁用 WinForms 应用程序的 TreeView 控件中的某些复选框,但标准 TreeView 控件中没有内置此类功能.

我已经在使用 TreeView.BeforeCheck 事件,如果节点被禁用并且工作得很好,则取消它。

我还将禁用节点的 ForeColor 更改为 GrayText

有人有一个简单而强大的解决方案吗?

最佳答案

由于 C++ 支持,我们可以使用 p/invoke 来解决它。

这是 p/invoke 部分的设置,只需将其提供给调用类即可。

    // constants used to hide a checkbox
public const int TVIF_STATE = 0x8;
public const int TVIS_STATEIMAGEMASK = 0xF000;
public const int TV_FIRST = 0x1100;
public const int TVM_SETITEM = TV_FIRST + 63;

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
IntPtr lParam);

// struct used to set node properties
public 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;

}

我们希望逐个节点地确定。最简单的方法是在绘制节点事件上。为了这个事件,我们必须将树设置为所有者绘制,因此请务必将其设置为默认设置以外的其他设置。

this.tree.DrawMode = TreeViewDrawMode.OwnerDrawText;
this.tree.DrawNode += new DrawTreeNodeEventHandler(tree_DrawNode);

在您的tree_DrawNode函数中确定正在绘制的节点是否应该有一个复选框,并在适​​当时隐藏它。然后将 Default Draw 属性设置为 true,因为我们不想担心绘制所有其他细节。

void tree_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
if (e.Node.Level == 1)
{
HideCheckBox(e.Node);
e.DrawDefault = true;
}
else
{
e.Graphics.DrawString(e.Node.Text, e.Node.TreeView.Font,
Brushes.Black, e.Node.Bounds.X, e.Node.Bounds.Y);
}
}

最后,实际调用我们定义的函数:

private void HideCheckBox(TreeNode node)
{
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
IntPtr lparam = Marshal.AllocHGlobal(Marshal.SizeOf(tvi));
Marshal.StructureToPtr(tvi, lparam, false);
SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
}

关于winforms - 如何禁用 WinForms TreeView 节点复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/698369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com