c# ListBox 아이템의 문자열 정렬(align)하기
쎌의 문자열을 가운데에 두려면 번거롭지만 쎌 출력을 직접 제어해야 한다. 방법은 간단하다. 쎌과 문자열의 폭들을 각각 구한 뒤 이들의 차이를 반으로 나눈 지점에서부터 출력을 시작하면 된다. 그러나 구현을 하는 데에 있어서는 몇 가지 주의해야 할 것들이 있다.
우선 모든 단위들은 정수가 아니라 실수다. 따라서 정수로 구한 다음에 반올림을 하거나 형 변환을 하지 않도록 유의한다.
열이 하나인 경우 쎌의 출력 범위와 ListBox의 폭은 다르다. 전자는 후자보다 4픽쎌 작다. 양옆으로 두 픽쎌씩 패딩되어 있다. 따라서 계산을 할 때 ListBox.width를 변수로 쓰면 안 되고 e.bounds.width로 해야 한다.
위아래로 스크롤을 하면 자동으로 수직 스크롤바가 그려질 때 폭도 같이 자동으로 계산되므로 신경 쓰지 않아도 된다.
private void listBox1_DrawItem(object sender, DrawItemEventArgs e) // DrawMode = OwnerDraw ...
{
e.DrawBackground();
SizeF sizeF = e.Graphics.MeasureString(listBox1.Items[e.Index].ToString(), e.Font);
RectangleF rectangleF = new((float)(e.Bounds.Width - sizeF.Width) / 2, 0, (float)sizeF.Width, (float)sizeF.Height);
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, Brushes.Black, rectangleF);
}