2014-10-12 2 views
1

내 사용자 정의 컨트롤에 대한 스크롤은 어떻게 구현합니까? 내 컨트롤은 완전히 사용자 지정 그리기 및 그 높이가 변수이며 컨트롤의 일부가 메뉴를 포함하므로 컨트롤에 많은 항목이 있으면 스크롤 막대를 넣을 수 있어야합니다. 나는 이것을 어떻게하는지에 대한 단서를 찾을 수 없었습니다. 내가 ScrollableControl에 관해 무엇인가 보았다. 그러나 그것이 내가 필요로하는 것이라면 나는 아직도 확신하지 않고있다.사용자 정의 컨트롤에 대한 스크롤은 어떻게 구현합니까?

내 컨트롤은 스크롤 막대를 표시해야 할 때 어떻게 알 수 있습니까? 내 컨트롤은 완전히 사용자 정의 된 것이기 때문에 거기에 진짜 "컨트롤"이 없습니다. 그저 그 위에 그려지는 픽셀의 무리 일 뿐이므로 AutoScroll을 true로 설정할 수있는 것처럼 보이지 않습니다. 어쨌든 AutoScroll을 설정할 수는 없습니다. 스크롤이 필요한 컨트롤의 주요 부분입니다. 컨트롤의 특정 위치에 스크롤 막대가 있어야합니다.

답변

-1

PanelAutoScroll = true과 함께 사용할 수 있습니다. 그 후, 만약 당신이 그 안에 어떤 컨트롤을 넣으면, 그 크기가 패널의 크기보다 크다면, 패널은 자동으로 스크롤 바를 보여줄 것입니다. 당신이 배치하는 한, 그 트릭은 어떤 커스텀 컨트롤에도 잘 사용될 수 있습니다. AutoScroll 패널 내부에 배치하고 필요할 때 크기만큼 커야합니다.

1

두 가지 옵션이 있습니다.

좋은 새로운 것은 그것이 가능하고 둘 다 정말 어렵지 않다는 것입니다.

  • 나쁜 새가 하나의 옵션에 대한 모든 드로잉 코드에 적응해야 할 것입니다 :

먼저 컨트롤을 만들을, 나는 당신이 필요로하는 그런 Autoscroll=true;

을 가지고하는 Panel를 사용 하나를 추가하려면 더미 컨트롤을 추가로 다른 Panel을 사용하면 오른쪽 및 아래쪽으로 충분히 멀리 들어가서 ScrollBars을 표시 할 수 있습니다.

public Form1() 
{ 
    InitializeComponent(); 

    Panel panelDummy = new Panel(); 
    panelDummy.Size = new Size(1,1); 
    panelDummy.Location = new Point(yourMaxX,yourMaxY); 
    panel1.Controls.Add(panelDummy); 
} 

그리고 드로잉 코드를 수정해야합니다. 그림 결과를 엉망 피하기 위해

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    int xx = panel1.HorizontalScroll.Value; 
    int yy = panel1.VerticalScroll.Value; 

    e.Graphics.FillRectangle(Brushes.Wheat, new Rectangle(11 - xx, 22 - yy, 22, 311)); 
    e.Graphics.FillRectangle(Brushes.RosyBrown, new Rectangle(11 - xx, 280 - yy, 22, 3)); 
} 

private void panel1_Scroll(object sender, ScrollEventArgs e) 
{ 
    panel1.Invalidate(); 
} 

내가 Scroll 이벤트에 Invalidate을 추가 한 방법은 다음과 같습니다이다.

  • 다른 옵션은 간단하다 : 포함하는 패널에 전체 스크롤 사업을 위임합니다 모든 그려 컨트롤과 AutoScroll=true;이와Panel 안에 넣어 그것을 을 보유 할만큼 충분히 컨트롤이 큰합니다.

    컨트롤의 ClientSize.Height이 yourHeight보다 큰
    this.AutoScrollMinSize = New Size(yourWidth, yourHeight); 
    

    경우 : 사용자 지정 컨트롤은 Panel 컨트롤에서 상속하는 경우

4

, 당신은이 설정 사용자 지정 컨트롤의 내용 자신의 크기를 설정 , 당신은 어떤 스크롤바도 얻지 못할 것입니다. 그것이 적다면 스크롤바가 생깁니다.당신의 페인트 방법에

, 시작이 추가 : 페인트

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

이제 모든 것이 자동으로 스크롤 좌표로 변환됩니다.

+0

감사하지만 스크롤이 필요한 컨트롤의 전체 크기가 아니라 스크롤 막대가 필요한 컨트롤의 약 4 분의 1에 불과합니다. (버튼이있는 패널 컨트롤을 생각하고 버튼을 클릭하면 스크롤 가능한 메뉴가 나타납니다.) 그러나 솔루션을 사용하면 전체 컨트롤이 제대로 스크롤됩니다. –

+0

@ jay_t55 당신의 통계에 초점을 맞추 었습니다 : '내 컨트롤은 완전히 사용자 지정되었습니다.'스크롤되는 부분에는 자체 컨테이너가 있어야합니다. – LarsTech

+0

문제가 해결 되었습니까? 응답 중 하나가 사용 되었다면 _accept_를 원할 수 있습니다. – TaW

-1

나는 Control에서 상속 받고 완전히 OnPaint에 그려진 사용자 지정 컨트롤을 만들어서이 문제를 부분적으로 해결했습니다. 지금까지의 내 솔루션은 ScrollBarRenderer을 사용하여 스크롤 단추를 그리는 것입니다. 그런 다음 스크롤 가능한 영역에 대한 Rectangle을 정의합니다. 그런 다음 스크롤 가능한 내용을 그릴 이미지를 만들고 TranslateTransform DrawImage를 사용하여 내가 만든 스크롤 가능한 내용 사각형에 그리기 전에 해당 이미지를 해당 위치로 스크롤하십시오. 그것은 내가 아직 MouseOver와 Click 이벤트를 모두 처리해야하므로 완전히 작동하지는 않았지만 약속을 보여주고 있습니다.

관련 문제