/// <summary> /// Осуществляет Custom Draw для TreeView применително к checkbox /// </summary> private void TreeViewCustomDraw(ref Message msg, Win32.NMTVCUSTOMDRAW tvDraw) { try { int hTreeNode = (int)tvDraw.nmcd.dwItemSpec; if (hTreeNode == 0) { msg.Result = new IntPtr((int)Win32.CDRF.CDRF_DODEFAULT); return; } TreeNode curNode = TreeNode.FromHandle(this, new IntPtr(hTreeNode)); if (curNode == null) { msg.Result = new IntPtr((int)Win32.CDRF.CDRF_DODEFAULT); return; } TreeView tree = curNode.TreeView; if (tree != null) { if (this.nonCheckedNodes.Contains(curNode)) { UnckeckNode(curNode.Handle.ToInt32()); } } } finally { msg.Result = new IntPtr((int)Win32.CDRF.CDRF_DODEFAULT); } }
/// <summary> /// Проверяет, содержит ли сгобщение флаг CUSTOMDRAW и если /// да, то обрабатывает его /// </summary> private void CheckAndProceedCustomDrawMsg(ref Message m) { // Обработка сообщения NMTVCUSTOMDRAW, а именно - не осуществляется отрисовка checkbox'ов у // узлов, находящихся в nonCheckedNodes Win32.NMHDR nmHeader = (Win32.NMHDR)m.GetLParam(typeof(Win32.NMHDR)); if (nmHeader.code == (int)Win32.NM_CUSTOMDRAW) { Win32.NMTVCUSTOMDRAW tvDraw = (Win32.NMTVCUSTOMDRAW)m.GetLParam(typeof(Win32.NMTVCUSTOMDRAW)); if ((int)Win32.CDDS.CDDS_PREPAINT == tvDraw.nmcd.dwDrawStage) { m.Result = new IntPtr((int)Win32.CDRF.CDRF_NOTIFYITEMDRAW); } else if ((int)Win32.CDDS.CDDS_ITEMPREPAINT == tvDraw.nmcd.dwDrawStage) { TreeViewCustomDraw(ref m, tvDraw); } } }