Specific renderer of scrollbar

SyntaxEditor for Windows Forms Forum

Posted 10 years ago by Iurii Gazin
Version: 4.0.0282
Avatar
Hi. How can I write specific renderer for a scrollbar only?
We are using Infragistic in our project, and need to set up SyntaxEditor, so his scroll bar would be looking just the same as Infragistic.
How can I do so?
I tried to inherit VisualStudio2005SyntaxEditorRenderer, and override DrawScrollBar<smth> methods. But I just couldn`t get, how to render for example scrollbar slider. I have only Button and Background methods.
And what logic should I use, to "connect" my drawn scroll bar with syntaxEditor?

Thanks for help

Comments (3)

Posted 10 years ago by Actipro Software Support - Cleveland, OH, USA
Avatar
Iurii,

There are 4 methods you can override: DrawScrollBarBackground, DrawScrollBarBlockBackground, DrawScrollBarButton, and DrawScrollBarThumb.

You can either set your custom renderer to the Renderer property of each SyntaxEditor or you can register it as the global default by doing this:
UIRendererManager.RegisterRendererFactory(typeof(ISyntaxEditorRenderer), yourfactory, true);
The "yourfactory" must be a class that implements IUIRendererFactory like this:
IUIRenderer IUIRendererFactory.CreateRenderer() {
    return new YourRenderer();
}


Actipro Software Support

Posted 10 years ago by Iurii Gazin
Avatar
Tnx for your answer.

Yeah, I got this. I have question about implementation...
For example, how I imaging this:
I realize own scrollbar in my code (for example WinForms scrollbar). I set up slider width, sign on scollbar events, slider down, slider up or smth (I`m sorry if this isn`t how WinForms scollbar working, I don`t know, but I think - it is smth like this).
This scrollbar I should render by parts, coz your renderer implementation is separating buttons and slider - I don`t know, how to do this.
This is so difficult, does SyntaxEditor have functionality to simplify this?
Posted 10 years ago by Actipro Software Support - Cleveland, OH, USA
Avatar
Hi Iurii,

Sorry you only use 3 of those methods for the actual scrollbar and they are extremely easy to use. Here's our default code for them with windows classic theme:
public override void DrawScrollBarBackground(PaintEventArgs e, Rectangle bounds, ActiproSoftware.WinUICore.ScrollBar scrollBar) {
    // Draw the background using a Windows Classic appearance
    HatchedBackgroundFill.Draw(e.Graphics, bounds, SystemColors.ControlLightLight, SystemColors.ScrollBar);
}

public override void DrawScrollBarButton(PaintEventArgs e, Rectangle bounds, ScrollBarButton button) {
    // Get the state
    ButtonState state = ButtonState.Normal;
    // Draw a border if enabled
    UIElementDrawState drawState = button.GetDrawState();
    if ((drawState & UIElementDrawState.Disabled) == UIElementDrawState.Disabled)
        state = ButtonState.Inactive;
    else if ((drawState & (UIElementDrawState.Hot | UIElementDrawState.Pressed)) == (UIElementDrawState.Hot | UIElementDrawState.Pressed))
        state = ButtonState.Pushed;

    // Draw the button
    if (button.CommandLink.Command == button.ScrollBar.DecreaseSmallCommand) {
        // Decrease button
        ControlPaint.DrawScrollButton(e.Graphics, bounds, 
            (button.ScrollBar.Orientation == Orientation.Horizontal ? ScrollButton.Left : ScrollButton.Up), state);
    }
    else if (button.CommandLink.Command == button.ScrollBar.IncreaseSmallCommand) {
        // Increase button
        ControlPaint.DrawScrollButton(e.Graphics, bounds, 
            (button.ScrollBar.Orientation == Orientation.Horizontal ? ScrollButton.Right : ScrollButton.Down), state);
    }
}

public override void DrawScrollBarThumb(PaintEventArgs e, Rectangle bounds, ScrollBarThumb thumb) {
    // If the scrollbar is enabled...
    if (thumb.ScrollBar.Enabled) {
        // Draw the thumb/gripper using a Windows Classic appearance
        e.Graphics.FillRectangle(SystemBrushes.Control, bounds);
        e.Graphics.DrawLine(SystemPens.ControlLight, bounds.Left, bounds.Bottom - 2, bounds.Left, bounds.Top);
        e.Graphics.DrawLine(SystemPens.ControlLight, bounds.Left, bounds.Top, bounds.Right - 2, bounds.Top);
        e.Graphics.DrawLine(SystemPens.ControlDarkDark, bounds.Right - 1, bounds.Top, bounds.Right - 1, bounds.Bottom - 1);
        e.Graphics.DrawLine(SystemPens.ControlDarkDark, bounds.Right - 1, bounds.Bottom - 1, bounds.Left, bounds.Bottom - 1);
        e.Graphics.DrawLine(SystemPens.ControlLightLight, bounds.Left + 1, bounds.Bottom - 3, bounds.Left + 1, bounds.Top + 1);
        e.Graphics.DrawLine(SystemPens.ControlLightLight, bounds.Left + 1, bounds.Top + 1, bounds.Right - 3, bounds.Top + 1);
        e.Graphics.DrawLine(SystemPens.ControlDark, bounds.Right - 2, bounds.Top + 1, bounds.Right - 2, bounds.Bottom - 2);
        e.Graphics.DrawLine(SystemPens.ControlDark, bounds.Right - 2, bounds.Bottom - 2, bounds.Left + 1, bounds.Bottom - 2);
    }
}


Actipro Software Support

The latest build of this product (v2020.1 build 0400) was released 24 days ago, which was after the last post in this thread.

Add Comment

Please log in to a validated account to post comments.