I am making a custom control that displays images, allows zooming in and
out, and can fit the image to the control. The way I am handling all of
this is probably not best, but I was looking for a quick and easy way to
at least get it working for now. I tried to keep this short, but I
couldn't find a way to.
The control has its Autoscroll property set to true. It contains a
PictureBox at 0,0 with its SizeMode set to StretchImage. When selecting
a zoom level, it basically resizes the PictureBox (for example, for a
200% zoom, it multiples the original height and width of the image by
2.) If the PictureBox is then larger than the control, it has scrollbars
because of the autoscroll property.
If the zoom is set to stretch to fit, it calculates a new height and
width based on the size of the control and the height to size ratio of
the original image. If the height of the image would be greater than
the height of the control, it subtracts the
SystemInformation.VerticalScrollBarWidth from the width it ends up using
when resizing the PictureBox, so that horizontal scrollbars are not
there when using stretch to fit.
I'm having two issues so far. Number one, I have it set to recalculate
and resize the PictureBox when the control is resized if stretch to fit
is selected as the zoom level. This works fine when resizing the
control to make it larger, or when maximizing, or restoring a previously
minimized window, as the size is getting larger. However, if I am
resizing the control/form it is on (is anchored top, right, bottom,
left) smaller and move the mouse at a normal rate (not just one pixel at
a time) it ends up drawing the scrollbars anyway, even though the image
is sized properly (the scrollbar width was subtracted when sizing.) If
I minimize, then restore the window, the scrollbar goes away, since it
considers it was resized from 0,0 to the new size (it got larger.) The
image itself is the exact same size (not a pixel different.)
Is this just a quirk with the Resize event?
The second issue I am having is with scrollbars being the incorrect
size. For example, if I set the zoom to 200%, the image is doubled in
size, and I can scroll to view the entire thing. If I then set the zoom
to 25%, the image is resized properly, but the vertical scrollbar is
extremely long. I can scroll down many times the length of the image.
I put in some Debug.WriteLine's to report some information. It was
reporting that the image was 820 pixels high, while the control was 650
pixels high. Obviously, there should only be a small amount of
scrolling to do, but I could probably scroll down as if the image was
2000 pixels high.
If I started at 25%, then went to 200%, I could only scroll through a
small portion of the image (as if it was barely any larger than the
control), but it reported that the image was over 3000 pixels high, yet
I only had a scrollable region of about 800-900 or so.
Are there known issues with the autoscroll? Would the AutoScrollMinSize
be any use to me here? Or should I just give up with autoscroll and add
a horizontal and vertical scrollbar to the control manually. I had
hoped autoscroll would kind of take care of this for me, but boy has it
been a headache.
Big thanks to anyone who took the time to read all of this.
Jeff