基本上,我已经创建了一个面板类的扩展,它添加了多个位图到自身,以创建多个音乐谱表。我已经尝试在面板上添加一个垂直滚动条但是没有工作。我的Paint程序与此类似
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);
}
}
答案 0 :(得分:1)
只需设置AutoScrollMinSize属性:
start()
在绘制事件期间,您需要使用TranslateTransform方法平移绘图的位置。此外,您需要在绘制位图后处置它们:
panel1.AutoScrollMinSize = new Size(0, 1000);
或提前创建和存储它们以避免在绘画事件期间产生这种成本。
答案 1 :(得分:0)
将AutoScroll
property设置为true。
您也可以考虑替代方案:
FlowLayoutPanel
并动态添加PictureBoxes而不是绘画。TableLayoutPanel
并动态添加PictureBoxes而不是绘画。ListBox
并将DrawMode
property设置为OwnerDrawFixed
或OwnerDrawVariable
,然后覆盖方法OnPaint
和OnMeasureItem
(仅适用于{{ 1}})。答案 2 :(得分:0)
如果要继续使用调用GDI代码的现有模式来绘制控件,则应添加滚动条控件并为其change事件添加事件处理程序。除了在面板上调用.Invalidate
之外,更改处理程序不需要执行任何操作。 .Invalidate是控件发出“脏”的信号,需要重新绘制。您需要修改绘制代码,以便在滚动条值的反方向上偏移绘图。
因此,如果您的滚动条位于第50位,您应该在Y - 50处绘制所有内容。
如果您使用纯GDI绘图代码,则根本不需要混淆AutoScroll属性。仅当您的面板承载的实际控件大于面板时才使用。
答案 3 :(得分:0)
正如其他人提到的,您需要将随时添加或删除位图(或者如果它们已修复,则在开头),您需要使用公式AutoScroll
设置为true。但是,AutoScrollMinSize
设置bitmapCount * bitmapHeight
高度。同样在您的绘图处理程序中,您需要考虑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);
}
}
}
编辑:在评论中正确提到LarsTech,在这种情况下,您实际上不需要设置AutoScroll
属性。其他所有都保持不变。