Back to Devexpress

How to: Custom Paint Links

windowsforms-4905-controls-and-libraries-navigation-controls-navigation-bar-examples-appearance-how-to-custom-paint-links.md

latest3.3 KB
Original Source

How to: Custom Paint Links

  • Nov 13, 2018
  • 2 minutes to read

The following sample code handles the NavBarControl.CustomDrawLink event to custom paint links. Links are painted differently in the hot tracked and pressed states.

The image below shows a custom painted hot tracked link:

csharp
private void navBarControl1_CustomDrawLink(object sender, DevExpress.XtraNavBar.ViewInfo.CustomDrawNavBarElementEventArgs e) {
    if (e.ObjectInfo.State == ObjectState.Hot || e.ObjectInfo.State == ObjectState.Pressed) {
        LinearGradientBrush brush;
        NavLinkInfoArgs linkInfo = e.ObjectInfo as NavLinkInfoArgs;
        if (e.ObjectInfo.State == ObjectState.Hot) {
            brush = new LinearGradientBrush(e.RealBounds, Color.Orange, Color.PeachPuff,
                LinearGradientMode.Horizontal);
        }
        else
            brush = new LinearGradientBrush(e.RealBounds, Color.PeachPuff, Color.Orange,
                LinearGradientMode.Horizontal);
        using (brush) {
            e.Cache.FillRectangle(Brushes.OrangeRed, e.RealBounds);
            Rectangle rect = e.RealBounds;
            rect.Inflate(-1, -1);
            e.Cache.FillRectangle(brush, rect);
            if (e.Image != null) {
                Rectangle imageRect = linkInfo.ImageRectangle;
                imageRect.X += (imageRect.Width - e.Image.Width) / 2;
                imageRect.Y += (imageRect.Height - e.Image.Height) / 2;
                imageRect.Size = e.Image.Size;
                e.Cache.DrawImageUnscaled(e.Image, imageRect);
            }
            e.Appearance.DrawString(e.Cache, e.Caption, linkInfo.RealCaptionRectangle, Brushes.White);
            e.Handled = true;
        }
    }
}
vb
Private Sub NavBarControl1_CustomDrawLink(sender As Object, e As CustomDrawNavBarElementEventArgs) Handles NavBarControl1.CustomDrawLink
    If e.ObjectInfo.State = ObjectState.Hot OrElse e.ObjectInfo.State = ObjectState.Pressed Then
        Dim brush As LinearGradientBrush
        Dim linkInfo As NavLinkInfoArgs = TryCast(e.ObjectInfo, NavLinkInfoArgs)
        If e.ObjectInfo.State = ObjectState.Hot Then
            brush = New LinearGradientBrush(e.RealBounds, Color.Orange, Color.PeachPuff, LinearGradientMode.Horizontal)
        Else
            brush = New LinearGradientBrush(e.RealBounds, Color.PeachPuff, Color.Orange, LinearGradientMode.Horizontal)
        End If
        Using brush
            e.Cache.FillRectangle(Brushes.OrangeRed, e.RealBounds)
            Dim rect As Rectangle = e.RealBounds
            rect.Inflate(-1, -1)
            e.Cache.FillRectangle(brush, rect)
            If e.Image IsNot Nothing Then
                Dim imageRect As Rectangle = linkInfo.ImageRectangle
                imageRect.X += (imageRect.Width - e.Image.Width) / 2
                imageRect.Y += (imageRect.Height - e.Image.Height) / 2
                imageRect.Size = e.Image.Size
                e.Cache.DrawImageUnscaled(e.Image, imageRect)
            End If
            e.Appearance.DrawString(e.Cache, e.Caption, linkInfo.RealCaptionRectangle, Brushes.White)
            e.Handled = True
        End Using
    End If
End Sub