
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form, IMessageFilter
{
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);
//버튼 이벤트 등록
this.button_add.Click += new EventHandler(this.button_add_Click);
Application.AddMessageFilter(this); //IMessageFilter 사용하기 위해 등록!
}
public bool PreFilterMessage(ref Message m) //IMessageFilter 콜백
{
if (m.Msg == 0x20a) // WM_MOUSEWHEEL (마우스 휠)
{
if (panel1.Bounds.Contains(PointToClient(Cursor.Position)))
{
short x = (short)(((int)m.WParam >> 16) & 0xffff);
if (x < 0)
{
ScrollMove(20);
}
else
{
ScrollMove(-20);
}
return true;
}
}
return false;
}
private void ScrollMove(int move)
{
int preValue = scrollPosition;
scrollPosition += move;
scrollPosition = Math.Max(scrollPosition, 0);
scrollPosition = Math.Min(panel1.DisplayRectangle.Width - panel1.Width, scrollPosition);
panel1.HorizontalScroll.Value = scrollPosition;
//기존 값과 같다면 동작하지 않게 합니다.
if (preValue == scrollPosition)
{
return;
}
UpdateThumbnail(scrollPosition);
}
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] NamedPipe 통신 예제 (IPC) (0) | 2024.11.30 |
---|---|
[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 |