Esempio n. 1
0
 protected virtual void OnPaint(GroupPaintEventArgs e)
 {
     if (Paint != null)
     {
         Paint.Invoke(this, e);
     }
 }
Esempio n. 2
0
        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();
                                    }
        }