如何添加滚动面板
本文关键字:滚动 添加 何添加 | 更新日期: 2023-09-27 18:16:22
基本上,我已经创建了面板类的扩展,它在自身上添加了多个位图,以便创建多个音阶。我试过在面板上添加一个垂直滚动条,但没有效果。我的绘制过程类似于
private void StavePanel_Paint(object sender, PaintEventArgs e)
{
for(int i = 0; i < linenumber; i++)
{
Bitmap bmp = new Bitmap(Width, 200);
//edit bmp to resemble stave
e.Graphics.DrawImage(bmp,new Point(0,200*i);
}
}
设置AutoScrollMinSize属性:
panel1.AutoScrollMinSize = new Size(0, 1000);
在绘制事件期间,您需要使用TranslateTransform方法来转换绘图的位置。此外,您需要在绘制位图后处理它们:
e.Graphics.TranslateTransform(panel1.AutoScrollPosition.X, panel1.AutoScrollPosition.Y);
using (Bitmap bmp = new Bitmap(Width, 200)) {
//edit bmp to resemble stave
e.Graphics.DrawImage(bmp,new Point(0,200*i);
}
或提前创建并存储它们,以避免在绘制事件期间的成本
设置AutoScroll
属性为true
你也可以考虑其他选择:
-
FlowLayoutPanel
并动态添加PictureBoxes而不是绘制。 -
TableLayoutPanel
和添加PictureBoxes动态代替绘画。 - 扩展
ListBox
并将DrawMode
属性设置为OwnerDrawFixed
或OwnerDrawVariable
,然后覆盖OnPaint
和OnMeasureItem
方法(仅适用于OwnerDrawVariable
)。
如果您想继续使用调用GDI代码的现有模式来绘制控件,您应该添加一个滚动条控件并为其更改事件添加事件处理程序。除了调用面板上的.Invalidate
之外,更改处理程序不需要做任何事情。invalidate是控件的一个信号,表示它是"脏的",需要重新绘制。您需要修改您的绘制代码,以在与滚动条值相反的方向上偏移绘制。
如果你的滚动条在位置50,你应该把所有的东西都画在Y - 50。
如果你使用的是纯GDI绘图代码,那么根本不需要使用AutoScroll属性。
AutoScroll
设置为true。但是,无论何时添加或删除位图(或者在开始时,如果它们是固定的),您都需要使用公式bitmapCount * bitmapHeight
设置AutoScrollMinSize
的高度。同样在你的油漆处理程序中,你需要考虑AutoScrollPosition.Y
属性。下面是这个概念的一个小例子:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Tests
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new Form();
var panel = new Panel { Dock = DockStyle.Fill, Parent = form };
// Setting the AutoScrollMinSize
int bitmapCount = 10;
int bitmapHeight = 200;
panel.AutoScrollMinSize = new Size(0, bitmapCount * bitmapHeight);
panel.Paint += (sender, e) =>
{
// Considering the AutoScrollPosition.Y
int offsetY = panel.AutoScrollPosition.Y;
var state = offsetY != 0 ? e.Graphics.Save() : null;
if (offsetY != 0) e.Graphics.TranslateTransform(0, offsetY);
var rect = new Rectangle(0, 0, panel.ClientSize.Width, bitmapHeight);
var sf = new StringFormat(StringFormat.GenericTypographic) { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
for (int i = 0; i < bitmapCount; i++)
{
// Your bitmap drawing goes here
e.Graphics.FillRectangle(Brushes.Yellow, rect);
e.Graphics.DrawRectangle(Pens.Red, rect);
e.Graphics.DrawString("Bitmap #" + (i + 1), panel.Font, Brushes.Blue, rect, sf);
rect.Y += bitmapHeight;
}
if (state != null) e.Graphics.Restore(state);
};
Application.Run(form);
}
}
}
EDIT:正如LarsTech在评论中正确提到的,在这种情况下,您实际上不需要设置AutoScroll
属性。