public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
Dictionary<int, TreeNode> map = new Dictionary<int, TreeNode>();
for (int i = 0; i < 100; i++)
{
TreeNode node = new TreeNode(i.ToString());
if (i % 10 == 0)
_tree.Nodes.Add(node);
map.Add(i, node);
if (i % 10 != 0)
{
map[Convert.ToInt32(Math.Floor(i/10.0)) * 10].Nodes.Add(node);
node.SetNodeHeight(2);
}
}
}
}
public static class TreeViewExtendMethod
{
[StructLayout(LayoutKind.Sequential)]
struct TVITEMEX
{
public Mask mask;
public IntPtr item;
public uint state;
public uint stateMask;
public IntPtr pszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int iChildren;
public IntPtr lParam;
public int iIntegral;
// ... plus some windows 6+ crap
}
[Flags]
enum Mask : uint
{
Text = 1,
Image = 2,
Param = 4,
State = 8,
Handle = 16,
SelectedImage = 32,
Children = 64,
Integral = 128,
}
public static int GetNodeHeight(this TreeNode tn)
{
TVITEMEX tvix = new TVITEMEX();
tvix.mask = Mask.Handle | Mask.Integral;
tvix.item = tn.Handle;
tvix.iIntegral = 0;
IntPtr hParam=Marshal.AllocHGlobal(Marshal.SizeOf(tvix));
Marshal.StructureToPtr(tvix, hParam, false);
win32.SendMessage(tn.TreeView.Handle, win32.TVM_GETITEM, IntPtr.Zero, hParam);
return tvix.iIntegral;
}
public static void SetNodeHeight(this TreeNode tn, int height)
{
TVITEMEX tvix = new TVITEMEX();
tvix.mask = Mask.Handle | Mask.Integral;
tvix.item = tn.Handle;
tvix.iIntegral = height;
IntPtr hParam=Marshal.AllocHGlobal(Marshal.SizeOf(tvix));
Marshal.StructureToPtr(tvix, hParam, false);
win32.SendMessage(tn.TreeView.Handle, win32.TVM_SETITEM, IntPtr.Zero, hParam);
}
}
Выше пример кода, после того, как с помощью PINV, чтобы изменить высоту узла вручную, когда щелчок в нижней части полосы прокрутки, то TreeView будет прокручиваться, который не должен прокрутите его, как только щелчок.После установки высоты узла дерева, TreeView свиток неправильно
Сначала я думаю, что это может быть вызвано полосой прокрутки, она не работает должным образом после того, как я установил прокрутку Msg para (8) для завершения прокрутки. Наконец, в то время как ловить прокрутку msg (0x115), выходит из WndProc, а затем он работает. Я понятия не имею, что происходит, поскольку я не могу найти какой-либо msg, чтобы отменить прокрутку, кроме настройки wParam на 8, которая, безусловно, не работает.