[C#] 스플리터를 스무스(?)하게 접기

2015. 6. 10. 16:15Coders

SplitContainer 를 모르시면 우선.

System.Windows.Forms.SplitContainer 는, 두 개의 컨트롤(패널 등)을 올려서 양 쪽의 사이즈를 조절할 수 있게 해 줍니다. 이거 말고, Splitter 라는 단독으로 사용하는 컨트롤도 있으나, 이는, 용도가 약간 다르며, 주로 사용되어지는(제 경우) 컨트롤은 SplitContainer 라고 할 수 있겠습니다.


SplitContainer는, 컨트롤을 2개 다 보여주고, 양 쪽의(위.아래 또는 좌.우) 컨트롤의 사이즈를 조절해 가며 보기 위해 사용하는 것이 대부분이지만, 때로는 어떤 조건에 따라 어느 하나의 컨트롤만 화면에 표시해 줄 경우, Panel1Collapsed, Panel2Collapsed 의 속성(Boolean)을 세팅하여 적절하게 사용할 수 있습니다.


※ 덧붙이자면, Panel1Collapsed, Panel2Collapsed 속성은 둘 다 false 가 될 수는 있어도, 둘 다 true가 될 수는 없습니다.(혹시 되나요?) 어느 한 속성을 true로 세팅하면, 다른 하나는 false 가 됩니다.


단순히 그거 설명하는 글이라면 필요 없겠죠.

패널을 접을 때, 좀 뭔가 움직이는 것 같은 효과를 주는 코드 입니다.(Animatedly? Simultaneously? Smoothly?) 아무튼, 이름은 그냥 ~Animatedly 로 지었습니다.


소스 입니다.(응용하여, SplitContainer를 상속받은 컨트롤을 만들어 쓸 수도 있겠죠.)

using System.Windows.Forms;

/// </summary>
/// 스플리터를 스무스하게 Collapse
/// </summary>
/// </param name="splitter">대상 스플리터</param>
/// </param name="panel1Collapse">Panel1 을 접을 지 여부</param>
/// </param name="stepDivider">사이즈 Divider (클 수록 접는 시간 길어짐)</param>
public static void SplitterCollapseAnimatedly(
	SplitContainer splitter,
	bool panel1Collapse,
	int stepDivider)
{
	try
	{
		Cursor.Current = Cursors.WaitCursor;

		int maxSize = splitter.Orientation == Orientation.Vertical ?
			splitter.Width : splitter.Height;
		int stepSize = (int)(maxSize / stepDivider);

		splitter.Panel1Collapsed = false;
		splitter.Panel2Collapsed = false;

		if (panel1Collapse)
		{
			splitter.SplitterDistance = maxSize;

			while (splitter.SplitterDistance > 0)
			{
				int oldDistance = splitter.SplitterDistance;
				int newDistance = oldDistance;

				newDistance -= stepSize;

				if (newDistance < 0)
				{
					splitter.Panel1Collapsed = true;
					break;
				}

				splitter.SplitterDistance = newDistance;
				Application.DoEvents();

				if (oldDistance == splitter.SplitterDistance)
				{
					splitter.Panel1Collapsed = true;
					break;
				}
			}
		}
		else
		{
			splitter.SplitterDistance = 0;

			while (splitter.SplitterDistance < maxSize)
			{
				int oldDistance = splitter.SplitterDistance;
				int newDistance = oldDistance;

				newDistance += stepSize;

				if (newDistance >= maxSize)
				{
					splitter.Panel2Collapsed = true;
					break;
				}

				splitter.SplitterDistance = newDistance;
				Application.DoEvents();

				if (oldDistance == splitter.SplitterDistance)
				{
					splitter.Panel2Collapsed = true;
					break;
				}
			}

			splitter.Panel2Collapsed = true;
		}
	}
	catch (System.Exception ex)
	{
		throw ex;
	}
	finally
	{
		Cursor.Current = Cursors.Default;
	}
}

사용법은 간단합니다.

//직접 어떤 걸 접을 지 정해주는 경우
SplitterCollapseAnimatedly(this.mySplitContainer, true, 20);

//그냥 토글로 하고 싶을 경우
SplitterCollapseAnimatedly(this.mySplitContainer,
	(this.mySplitContainer.Panel1Collapsed == false), 20);


즐거운 코딩 생활 되셔요. ㅋ