private PaintTreeItemEventArgs GetPaintTreeItemEventArgs(NMTVCUSTOMDRAW customDrawInfo) { TreeNode node = TreeNode.FromHandle(this, (IntPtr)customDrawInfo.nmcd.dwItemSpec); return (new PaintTreeItemEventArgs ( node, Graphics.FromHdc(customDrawInfo.nmcd.hdc), (customDrawInfo.nmcd.uItemState & (int)CustomDrawItemStateFlags.CDIS_FOCUS) != 0, (customDrawInfo.nmcd.uItemState & (int)CustomDrawItemStateFlags.CDIS_SELECTED) != 0, Rectangle.FromLTRB(customDrawInfo.nmcd.rc.left, customDrawInfo.nmcd.rc.top, customDrawInfo.nmcd.rc.right, customDrawInfo.nmcd.rc.bottom) )); }
private bool NotifyTreeCustomDraw(ref Message message) { message.Result = (IntPtr)CustomDrawReturnFlags.CDRF_DODEFAULT; NMTVCUSTOMDRAW customDrawInfo = (NMTVCUSTOMDRAW)message.GetLParam(typeof(NMTVCUSTOMDRAW)); IntPtr thisHandle = Handle; if (customDrawInfo.nmcd.hdr.hwndFrom == Handle) { switch (customDrawInfo.nmcd.dwDrawStage) { case (int)CustomDrawDrawStateFlags.CDDS_PREPAINT: message.Result = (IntPtr)CustomDrawReturnFlags.CDRF_NOTIFYITEMDRAW; break; case (int)CustomDrawDrawStateFlags.CDDS_ITEMPREPAINT: message.Result = (IntPtr)CustomDrawReturnFlags.CDRF_NOTIFYPOSTPAINT; PaintTreeItemEventArgs args = GetPaintTreeItemEventArgs(customDrawInfo); try { args.ForeColor = SystemColors.WindowText; args.BackColor = SystemColors.Window; if (DoPrePaintItem(args)) { DoPostPaintItem(args); message.Result = (IntPtr)CustomDrawReturnFlags.CDRF_SKIPDEFAULT; } customDrawInfo.clrTextBk = RGB ( args.BackColor.R, args.BackColor.G, args.BackColor.B ); customDrawInfo.clrText = RGB ( args.ForeColor.R, args.ForeColor.G, args.ForeColor.B ); Marshal.StructureToPtr(customDrawInfo, message.LParam, true); } finally { args.Graphics.Dispose(); } break; case (int)CustomDrawDrawStateFlags.CDDS_ITEMPOSTPAINT: args = GetPaintTreeItemEventArgs(customDrawInfo); try { DoPostPaintItem(args); } finally { args.Graphics.Dispose(); } break; } } return(false); }