我在http://www.codeproject.com/KB/miscctrl/CustomAutoScrollPanel.aspx找到了自定义具有自动滚动属性的面板,该面板包含Panel
AutoScroll = True
的<{1}}。
我喜欢这个控件,因为它提供了“performScrollHorizontal”和“performScrollVertical”方法。但是,它使用Windows API函数而不是ScrollableControl
及其VerticalScroll
和HorizontalScroll
属性。
这是一个很好的控制使用?我认为它应该使用ScrollableControl
而不是Windows API。你怎么看?有更好的控制可用吗?我甚至需要一个控件吗?我认为ScrollableControl
提供了我需要的一切。
编辑:我找到了HScrollBar和VScrollBar控件。我应该使用它们吗?
这两个其他控件很不错但是没有办法像上面的控件那样控制滚动条。
我真正想要的是一个控件:
非常感谢任何建议,帮助或要查看的领域。控制会很好,因为我还不是那么好。
答案 0 :(得分:2)
可以使用的一些代码。它支持焦点,平移和滚动。缩放是工作,我的笔记本电脑的鼠标垫阻碍了它的测试。使用计时器在边缘实现自动滚动。
using System;
using System.Drawing;
using System.Windows.Forms;
class ZoomPanel : Panel {
public ZoomPanel() {
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.Selectable, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.AutoScroll = this.TabStop = true;
}
public Image Image {
get { return mImage; }
set {
mImage = value;
Invalidate();
mZoom = 1.0;
this.AutoScrollMinSize = (mImage != null) ? mImage.Size : Size.Empty;
}
}
protected override void OnMouseDown(MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
this.Cursor = Cursors.SizeAll;
mLastPos = e.Location;
this.Focus();
}
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e) {
if (e.Button == MouseButtons.Left) this.Cursor = Cursors.Default;
base.OnMouseUp(e);
}
protected override void OnMouseMove(MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
this.AutoScrollPosition = new Point(
-this.AutoScrollPosition.X - e.X + mLastPos.X,
-this.AutoScrollPosition.Y - e.Y + mLastPos.Y);
mLastPos = e.Location;
Invalidate();
}
base.OnMouseMove(e);
}
protected override void OnMouseWheel(MouseEventArgs e) {
if (mImage != null) {
mZoom *= 1.0 + 0.3 * e.Delta / 120;
this.AutoScrollMinSize = new Size((int)(mZoom * mImage.Width),
(int)(mZoom * mImage.Height)); \
// TODO: calculate new AutoScrollPosition...
Invalidate();
}
base.OnMouseWheel(e);
}
protected override void OnPaint(PaintEventArgs e) {
if (mImage != null) {
var state = e.Graphics.Save();
e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y);
e.Graphics.DrawImage(mImage,
new Rectangle(0, 0, this.AutoScrollMinSize.Width, this.AutoScrollMinSize.Height));
e.Graphics.Restore(state);
}
//if (this.Focused) ControlPaint.DrawFocusRectangle(e.Graphics,
// new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height));
base.OnPaint(e);
}
protected override void OnEnter(EventArgs e) { Invalidate(); base.OnEnter(e); }
protected override void OnLeave(EventArgs e) { Invalidate(); base.OnLeave(e); }
private double mZoom = 1.0;
private Point mLastPos;
private Image mImage;
}