using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private const int buttonOffset = 10;
private List<Button> buttonList = new List<Button>();
private List<Control> focusedList = new List<Control>();
private int scrollPosition;
public Form1()
{
InitializeComponent();
panel1.AutoScroll = true; //스크롤 활성화
//스크롤 이벤트
this.panel1.Resize += new System.EventHandler(this.panel1_Resize);
this.panel1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.panel1_Scroll);
}
private void button_add_Click_(object sender, EventArgs e)
{
Button button = new Button();
button.Text = buttonList.Count.ToString("D4");
button.Hide();
panel1.Controls.Add(button);
panel1.AutoScrollMinSize = new Size(panel1.AutoScrollMinSize.Width + button.Width + buttonOffset, 0);
buttonList.Add(button);
UpdateThumbnail(scrollPosition);
}
private void UpdateThumbnail (int startPosition)
{
int totalWidth = 0;
//돌면서 그려줘야 할 영역에 대해서만 그려주기!
for (int i = 0; i < buttonList.Count; ++i)
{
totalWidth += buttonList[i].Width + buttonOffset;
//처음으로 커지는 구간을 찾기! 시작 지점!
if (totalWidth >= startPosition)
{
int showPositionX = totalWidth - startPosition - buttonList[i].Width - buttonOffset;
List<Control> newFocusList = new List<Control>();
for (int j = i; j < buttonList.Count; ++j)
{
Point position = new Point(showPositionX, 0);
showPositionX += buttonList[j].Width + buttonOffset;
buttonList[j].Location = position;
buttonList[j].Show();
newFocusList.Add(buttonList[j]);
if (this.Width <= showPositionX)
{
break;
}
}
//현재 영역에 들어있지 않은 기존 항목은 제거해줍니다.
foreach (Control item in focusedList)
{
if (newFocusList.Contains(item) == false)
{
item.Hide();
}
}
//현재 항목을 갱신합니다.
focusedList = newFocusList;
break;
}
}
}
private void panel1_Scroll(object sender, ScrollEventArgs e)
{
scrollPosition = e.NewValue;
Console.WriteLine("scrollPosition : " + scrollPosition);
UpdateThumbnail(scrollPosition);
}
private void panel1_Resize(object sender, EventArgs e)
{
if (panel1.AutoScrollMinSize.Width - panel1.Width <= scrollPosition)
{
Console.WriteLine("*************************** 크기 변경!!!");
scrollPosition = Math.Max(0, panel1.AutoScrollMinSize.Width - panel1.Width);
panel1.HorizontalScroll.Value = scrollPosition;
}
UpdateThumbnail(scrollPosition);
}
}
}
'C# > Windows Form' 카테고리의 다른 글
[C# Windows Form] GDI+ 이미지 돌리기 (돌아간 크기에 맞추어 이미지 크기 확장!) (cos, sin) (1) | 2024.06.03 |
---|---|
[C# Windows Form] Invoke, InvokeRequired - (Cross Thread) (0) | 2024.05.08 |
[C# Windows Form] 둥근 버튼 만들기 (GraphicsPath) (0) | 2024.03.11 |
[C# Windows Form] 디자인 문서개요 (요소 계층 구조 표현) (0) | 2024.03.11 |
[C# Windows Form] 로그 클래스 (CallerMemberName) (0) | 2024.02.17 |