2015-10-06 99 views
-1

基本上,我创建了面板类的扩展,该类添加了在自身上绘制多个位图以创建多个音乐曲谱。我试过在面板上添加一个垂直滚动条,但是没有奏效。我的画图程序与此类似如何将滚动添加到面板

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

你尝试过'AutoScroll'属性(或添加一个'VScrollBar' /'HScrollBar')吗? – varocarbas

+0

是的,这似乎不起作用 – Rariolu

+0

你的意思是“似乎没有工作”?也许你没有正确使用它们。你能解释一下你做了什么吗? – varocarbas

回答

0

AutoScroll property设置为true。

你也可以考虑替代方案:

  • FlowLayoutPanel并添加PictureBoxes动态,而不是画。
  • TableLayoutPanel并动态添加PictureBox而不是绘画。
  • 延伸ListBox并设置DrawMode propertyOwnerDrawFixedOwnerDrawVariable然后覆盖的方法和OnPaintOnMeasureItem(仅用于OwnerDrawVariable)。
0

如果你想继续使用你现有的调用GDI代码的模式来绘制你的控件,你应该添加一个滚动条控件并添加一个事件处理程序到它的change事件中。除了在面板上调用.Invalidate之外,更改处理程序不需要执行任何操作。 。无效是向控件发出的“脏”信号,需要重新绘制。您将需要修改绘画代码以与滚动条值相反的方向偏移绘图。

所以,如果你的滚动条50位,你应该在Y处吸取一切 - 50

如果使用纯GDI的绘制代码没有必要惹AutoScroll属性都没有。仅当您的面板托管比面板大的实际控制时才会使用该功能。

1

刚刚成立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); 
} 

,或者创建并存储的时间提前,以避免油漆事件过程中的成本。

0

正如其他人提到的,您需要将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); 
     } 
    } 
} 

编辑:作为LarsTech在评论中提到正确的,你并不真的需要设置AutoScroll属性在这种情况下。所有其他的保持不变。

+0

AutoScroll实际上只有在面板内有控件时才会使用。当您设置AutoScrollMinSize属性时,您不需要AutoScroll为true。 – LarsTech

+0

@LarsTech:谢谢,你当然是对的!我会纠正答案。现在,当我准备我的答案时,我发现您发布的内容完全一样,对于重复内容抱歉。 –

相关问题