How to center the Panel scroll bars?

G

Guest

I’m using the Panel control that contains a PictureBox control (for
implementing the http://www.codeproject.com/cs/miscctrl/PictureBox.asp).

The Panel is set to AutoScroll = true.

I wish to scroll the appearing vertical and horizontal scrolls bars of the
Panel to the middle of their scrolling range so the contained PictureBox will
be centered inside the Panel.
But I could not find a way to get the scrolls bars for doing that.

Can anybody tell me how can I do that?
 
B

Bob Powell [MVP]

You would set the AutoScrollPosition for this.

After my signature is a simple application that demonstrates the idea.

--
Bob Powell [MVP]
Visual C#, System.Drawing

Ramuseco Limited .NET consulting
http://www.ramuseco.com

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.

using System;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace CenterScrollPanel

{

/// <summary>

/// Summary description for Form1.

/// </summary>

public class Form1 : System.Windows.Forms.Form

{

private System.Windows.Forms.Panel panel1;

private System.Windows.Forms.Button button1;

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.Container components = null;

public Form1()

{

//

// Required for Windows Form Designer support

//

InitializeComponent();

//

// TODO: Add any constructor code after InitializeComponent call

//

}

/// <summary>

/// Clean up any resources being used.

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.panel1 = new System.Windows.Forms.Panel();

this.button1 = new System.Windows.Forms.Button();

this.SuspendLayout();

//

// panel1

//

this.panel1.AutoScroll = true;

this.panel1.AutoScrollMinSize = new System.Drawing.Size(1024, 768);

this.panel1.Location = new System.Drawing.Point(8, 8);

this.panel1.Name = "panel1";

this.panel1.Size = new System.Drawing.Size(272, 208);

this.panel1.TabIndex = 0;

this.panel1.Paint += new
System.Windows.Forms.PaintEventHandler(this.panel1_Paint);

//

// button1

//

this.button1.Location = new System.Drawing.Point(16, 232);

this.button1.Name = "button1";

this.button1.TabIndex = 1;

this.button1.Text = "Recenter";

this.button1.Click += new System.EventHandler(this.button1_Click);

//

// Form1

//

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.ClientSize = new System.Drawing.Size(292, 266);

this.Controls.Add(this.button1);

this.Controls.Add(this.panel1);

this.Name = "Form1";

this.Text = "Form1";

this.ResumeLayout(false);

}

#endregion

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.Run(new Form1());

}

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs
e)

{

e.Graphics.Transform=new
Matrix(1,0,0,1,this.panel1.AutoScrollPosition.X,this.panel1.AutoScrollPosition.Y);

Pen p=new Pen(Color.Red,3);

e.Graphics.DrawLine(p,512,374,512,394);

e.Graphics.DrawLine(p,502,384,522,384);

p.Dispose();

}

private void button1_Click(object sender, System.EventArgs e)

{

this.panel1.AutoScrollPosition=new Point(

this.panel1.AutoScrollMinSize.Width/2-this.panel1.ClientRectangle.Width/2,

this.panel1.AutoScrollMinSize.Height/2-this.panel1.ClientSize.Height/2);

}

}

}
 
G

Guest

Thanks Bob,

If I understand your sample correctly, the code that set the Panel scroll
bars to the middle is:
private void button1_Click(object sender, System.EventArgs e)
{
this.panel1.AutoScrollPosition = new Point(
this.panel1.AutoScrollMinSize.Width/2-this.panel1.ClientRectangle.Width/2,
this.panel1.AutoScrollMinSize.Height/2-this.panel1.ClientSize.Height/2);
}

But this code assume that panel1.AutoScrollMinSize is set to a value other
then zero, and by that causing the scroll bars to be visible at all time
regardless to the fact that it’s needed or not.
When I tried this code it causes my Panel to have large scrolling range that
are visible at all time. This behavior is not good for me, as it degenerate
the functionally of the zooming and auto scrolling (see
http://www.codeproject.com/cs/miscctrl/PictureBox.asp).


Did I miss something?

Is there a way to do the centering of the Panel scroll bars and to keep the
auto scroll bar sizing and auto appearance behavior?
 
J

Jeffrey Tan[MSFT]

Hi Sharon,

I will give this issue a look some time later. I will update you ASAP.
Thanks

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.
 
J

Justin Creasy

I believe you can programmatically set the min and max range of the
scroll bars. If this is so, then you would just determine the size of
your image after zooming, set that to the max, set 0 to the min, and
then use Bob's method to center it. This would have to be done
everytime you zoomed in or out, but if you're using the scroll wheel to
zoom, you can tie into that event.
 
J

Jeffrey Tan[MSFT]

Hi Sharon,

Sorry for letting you wait for so long, I finally have time to look into
this issue.

I think what you want is centering the vertical and horizontal scrollbars,
yes? I think we can get this done, with the code snippet below:

private void button1_Click(object sender, System.EventArgs e)
{
Point pt=new
Point((this.pictureBox1.Location.X+this.pictureBox1.Width-this.panel1.Client
Rectangle.Width)/2,

(this.pictureBox1.Location.Y+this.pictureBox1.Height-this.panel1.ClientRecta
ngle.Height)/2);
this.panel1.AutoScrollPosition=pt;
}
It works well in my test sample project. Hope it helps

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.
 
G

Guest

Thanks a lot for your help.

It works almost perfectly.

The code is now:

public void CenterImage()
{
// Centering the picture inside the panel.
Point pt = m_picBox.Location;
pt.X = (m_outerPanel.ClientSize.Width / 2) - (m_picBox.Width / 2);
pt.Y = (m_outerPanel.ClientSize.Height / 2) - (m_picBox.Height / 2);
m_picBox.Location = pt;

// Setting the panel scroll bars to the center.
pt = new Point((m_picBox.Location.X +
m_picBox.Width -
m_outerPanel.ClientRectangle.Width) / 2,
(m_picBox.Location.Y +
m_picBox.Height -
m_outerPanel.ClientRectangle.Height)/ 2);
m_outerPanel.AutoScrollPosition = pt;
}

And it works, but no perfectly; the panel scrolling is not exactly centering
the image inside the panel, but it's close.
 
J

Jeffrey Tan[MSFT]

Hi Sharon,

I am glad my reply can help you.

Yes, this code only makes the scrollbars of panel scroll to the center, but
it does not keep the images to the center. Thanks

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top