protected virtual void OnPaint(GroupPaintEventArgs e) { if (Paint != null) { Paint.Invoke(this, e); } }
private void PaintGroup(int i) { var groupId = GetGroupId(i); var rect = new RECT { Top = LVGGR_HEADER }; var rectSize = Marshal.SizeOf(typeof(RECT)); var lParam = Marshal.AllocHGlobal(rectSize); try { Marshal.StructureToPtr(rect, lParam, false); var retVal = SendMessage(_listView.Handle, LVM_GETGROUPRECT, new IntPtr(groupId), lParam); if (retVal == IntPtr.Zero) { return; } var retRc = (RECT)Marshal.PtrToStructure(lParam, typeof(RECT)); using (var g = Graphics.FromHwnd(_listView.Handle)) { var groupRect = new Rectangle(retRc.Left, retRc.Top, retRc.Right - retRc.Left, retRc.Bottom - retRc.Top); var args = new GroupPaintEventArgs(i - 1, g, groupRect); OnPaint(args); } } finally { Marshal.FreeHGlobal(lParam); } }
private void HandleGroupsPaint(object sender, GroupPaintEventArgs e) { if (!_enabled || !GroupColorsAreDefined()) { return; } // We have to redraw whole background. BufferedGraphicsContext is created to prevent flickering. using (var context = new BufferedGraphicsContext()) using (var g = context.Allocate(e.Graphics, e.ClipRectangle)) using (var highlightBrush = new SolidBrush(_theme.ListView.GroupHighlightColor)) using (var backBrush = new SolidBrush(_theme.ListView.GroupBackColor)) using (var foreBrush = new SolidBrush(_theme.ListView.GroupForeColor)) using (var forePen = new Pen(_theme.ListView.GroupForeColor)) using (var columnPen = new Pen(_theme.ListView.ColumnBorderColor)) { var isMouseOver = e.ClipRectangle.Contains(_listView.PointToClient(MousePosition)); g.Graphics.FillRectangle(isMouseOver ? highlightBrush : backBrush, e.ClipRectangle); var font = new Font(_listView.Font, FontStyle.Bold); var textSize = e.Graphics.MeasureString(" " + _listView.Groups[e.GroupId].Header + " ", font); var textRect = new Rectangle( e.ClipRectangle.X + 8, e.ClipRectangle.Y, (int)textSize.Width, e.ClipRectangle.Height - 1); var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; g.Graphics.DrawString(_listView.Groups[e.GroupId].Header, _listView.Font, foreBrush, textRect, sf); var columnOffset = -2; // Initial padding foreach (ColumnHeader column in _listView.Columns) { columnOffset += column.Width; g.Graphics.DrawLine(columnPen, e.ClipRectangle.X + columnOffset, e.ClipRectangle.Y, e.ClipRectangle.X + columnOffset, e.ClipRectangle.Bottom); } var lineY = e.ClipRectangle.Y + e.ClipRectangle.Height / 2; g.Graphics.DrawLine(forePen, textRect.Right, lineY, e.ClipRectangle.Right, lineY); g.Render(e.Graphics); sf.Dispose(); } }