Beispiel #1
0
        protected unsafe override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
            case 8270:
                NMHDR *ptr = (NMHDR *)((void *)m.LParam);
                if (ptr->code == NM_CUSTOMDRAW)
                {
                    NMTVCUSTOMDRAW nMTVCUSTOMDRAW = (NMTVCUSTOMDRAW)m.GetLParam(typeof(NMTVCUSTOMDRAW));
                    int            dwDrawStage    = nMTVCUSTOMDRAW.nmcd.dwDrawStage;
                    if (dwDrawStage == (CDDS_ITEM | CDDS_PREPAINT))
                    {
                        TreeNode treeNode = TreeNode.FromHandle(this, nMTVCUSTOMDRAW.nmcd.dwItemSpec);
                        if (treeNode != null)
                        {
                            using (Graphics graphics = Graphics.FromHdcInternal(nMTVCUSTOMDRAW.nmcd.hdc))
                            {
                                var bounds = treeNode.Bounds;
                                using (var brush = new SolidBrush(GetNodeRowBackgroundColor(treeNode)))
                                {
                                    graphics.FillRectangle(brush, new Rectangle(0, bounds.Top, this.Width, bounds.Height));
                                }
                            }
                        }
                    }
                }
                break;

            case WM_ERASEBKGND:
                // in this handler erase only part of background that is not covered by nodes
                TreeNode  lastVisible = FindLastVisible(Nodes);
                Rectangle r;
                if (lastVisible != null)
                {
                    r = new Rectangle(0, lastVisible.Bounds.Bottom, Width, Height);
                }
                else
                {
                    r = new Rectangle(0, 0, Width, Height);
                }
                using (var g = CreateGraphics())
                    g.FillRectangle(Brushes.White, r);
                m.Result = (IntPtr)1;
                return;                         // skip default processing

            case WM_HSCROLL:
                Invalidate();
                break;
            }
            base.WndProc(ref m);
        }
        protected void HideCheckBox(TV_ITEM tv_item)
        {
            if (tv_item.ItemHandle != IntPtr.Zero && tv_item.ItemHandle != hidingItemHandle)
            {
                // get TreeNode-object, that corresponds to TV_ITEM-object
                TreeNode currentTN = TreeNode.FromHandle(this, tv_item.ItemHandle);

                HiddenCheckBoxTreeNode hiddenCheckBoxTreeNode = currentTN as HiddenCheckBoxTreeNode;
                // check if it's HiddenCheckBoxTreeNode and
                // if its checkbox already has been hidden

                if (hiddenCheckBoxTreeNode != null)
                {
                    HandleRef treeHandleRef = new HandleRef(this, Handle);

                    // check if checkbox already has been hidden
                    TV_ITEM currentTvItem = new TV_ITEM();
                    currentTvItem.ItemHandle = tv_item.ItemHandle;
                    currentTvItem.StateMask  = TVIS_STATEIMAGEMASK;
                    currentTvItem.State      = 0;

                    IntPtr res        = SendMessage(treeHandleRef, TVM_GETITEM, 0, ref currentTvItem);
                    bool   needToHide = res.ToInt32() > 0 && currentTvItem.State != 0;

                    if (needToHide)
                    {
                        // specify attributes to update
                        TV_ITEM updatedTvItem = new TV_ITEM();
                        updatedTvItem.ItemHandle = tv_item.ItemHandle;
                        updatedTvItem.Mask       = TVIF_STATE;
                        updatedTvItem.StateMask  = TVIS_STATEIMAGEMASK;
                        updatedTvItem.State      = 0;

                        hidingItemHandle = tv_item.ItemHandle;
                        try
                        {
                            // send TVM_SETITEM message
                            SendMessage(treeHandleRef, TVM_SETITEM, 0, ref updatedTvItem);
                        }
                        finally
                        {
                            hidingItemHandle = IntPtr.Zero;
                        }
                    }
                }
            }
        }