2015-07-14 3 views
0
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, которая, безусловно, не работает. enter image description here

ответ

0

Наконец-то я нашел решение, хотя и не изящное, но оно должно работать. Вот решение,

 protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x115) 
     { 
      if (((int)m.WParam & 5) == (5) || 
       ((int)m.WParam & 4) == (4) 
       ) 
      { 
       int para = (int)m.WParam; 
       int temp = (para - (para % 2 == 0 ? 4 : 5)) >> 16; 

       // store the current position, if the position doesn't change, no need to handle 
       if (temp == pos) 
        return; 
       else 
        pos = temp; 
      } 
      if (((int)m.WParam & 8) == 8) 
       return; 

      //Debug.WriteLine(m.WParam); 
      //if (DisableScroll) 
      // return; 
      // //m.WParam = (IntPtr)8; 
      //SCROLLINFO si = new SCROLLINFO(); 
      //si.cbSize = Marshal.SizeOf(si); 
      //si.fMask = (int)(ScrollInfoMask.SIF_POS | ScrollInfoMask.SIF_PAGE | ScrollInfoMask.SIF_RANGE | ScrollInfoMask.SIF_TRACKPOS); 
      //GetScrollInfo(this.Handle, 1, ref si); 
      ////Debug.WriteLine(string.Format("Max pos:{0}, Min pos: {1}", si.nMin, si.nMax)); 
      //Debug.WriteLine(string.Format("wParam:{0} hParam:{1}", m.WParam, m.LParam)); 
      //Debug.WriteLine(string.Format("It page size: {0}, position: {1}, range: {2}, track pos: {3}", si.nPage, si.nPos, si.nPage, si.nTrackPos)); 
      //if (si.nPage + Math.Max(si.nPos, si.nTrackPos) >= si.nMax) 
      //{ 
      // return; 
      //} 
     } 
     base.WndProc(ref m); 
    } 
Смежные вопросы