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; } } } } }