2015-01-07 3 views
1

Dendrograms를 그리는 응용 프로그램을 this one과 같이 만들려고합니다. 내가 그렇게 라벨을 많이 가지고있다스크롤링 PictureBox

foreach (var line1 in lines) 
{ 
    i++; 
    gpx.DrawString(line1, myFont, Brushes.Green, new PointF(2, 10 * i)); 
} 

그러나 문제 :

그래서 나는의 WinForm에 PictureBox을 추가하고, 시작을,이 코드를 사용하여 그림과 같이 모든 레이블을 작성하고 싶었 800x600 픽셀로 그 중 일부만 기록합니다. 스크롤 막대를 추가하고 싶었지만 전혀 작동하지 않습니다. 이미지를 PictureBox으로 설정할 때만 작동합니다.

PictureBox의 유무에 관계없이 다른 방법이 있습니까?

+0

여기 http://stackoverflow.com/questions/4710145/how-can-i-get-scrollbars-on-picturebox 내가 한 – Mitz

+0

을 볼 경우 당신은 내가,? 패널 내부에 PictureBox를 추가하려고 했나 모든 관련 주제를 보았습니다. 말했듯이, 그것은 이미지와 함께 잘 작동하지만 서면으로 된 단어로는 잘 작동하지 않습니다. – user3548153

+0

그건 아직 방법입니다. 주의해야 할 것은 PictureBox를 그릴 물건을 담을 수있을만큼 충분히 커야한다는 것입니다. PictureBox의 top__을 __on으로 작성합니까? (그렇다면 'Paint' 이벤트에서!?!) 또는 __into__ 이미지를 작성 하시겠습니까? 올바른 'Size'를 찾으려면'MeasureString'을 사용할 필요가 있습니다. – TaW

답변

2

PictureBox는 매우 간단한 컨트롤이며 사진을 표시하는 것이 좋습니다. 필요한 기능이 하나도 없기 때문에 콘텐츠를 스크롤 할 수 있습니다. 그래서 그것을 사용하지 마십시오.

Winforms에서 자신 만의 컨트롤을 만드는 것은 매우 간단합니다. 기본적인 시작점은 스크롤링을 지원하는 컨트롤 인 Panel로 시작하여 자신 만의 클래스를 파생시켜 작업에 적합하도록 사용자 정의합니다. 프로젝트에 새 클래스를 추가하고 아래 표시된 코드를 붙여 넣습니다. 엮다. 새 컨트롤을 도구 상자의 위쪽에서 폼으로 끌어다 놓습니다. 디자이너 또는 코드를 사용하여 Lines 속성을 설정하는 방법에 유의하십시오. Paint 이벤트를 사용하여 덴 드로 그램을 그립니다. 클래스에서 OnPaint() 메서드를 확장하면 원하는대로 멋지게 만들 수 있습니다.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

class DendrogramViewer : Panel { 
    public DendrogramViewer() { 
     this.DoubleBuffered = this.ResizeRedraw = true; 
     this.BackColor = Color.FromKnownColor(KnownColor.Window); 
    } 

    public override System.Drawing.Font Font { 
     get { return base.Font; } 
     set { base.Font = value; setSize(); } 
    } 

    private int lines; 
    public int Lines { 
     get { return lines; } 
     set { lines = value; setSize(); } 
    } 

    private void setSize() { 
     var minheight = this.Font.Height * lines; 
     this.AutoScrollMinSize = new Size(0, minheight); 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
     e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y); 
     base.OnPaint(e); 
    } 
} 
+1

흠. 음, PictureBox는 또한 이미지를 확대/축소하거나 바둑판 식으로 배열하고 이미지를 캐싱하고 저장하는 작업을 잘 수행합니다. AutoScroll Panel에 하나를 떨어 뜨리는 것도 어렵지 않습니다. 따라서 Panel을 서브 케슬링하는 것이 실제적인 두뇌를 추가 할 때만 유용합니다. 그것이 여기에 적용되는지 확실하지 않습니다 ..하지만 내 프로젝트에서 다음에 그것을 고려할 것입니다 .. – TaW

+0

두 분 모두 고맙습니다. 컨트롤이 완벽하게 작동하고 확장하기가 쉽습니다. 친애하는!! – user3548153