[C#] Label.GetPreferredSize 메서드

2013. 11. 15. 13:33Coders

요즘 뭐 좀 하고 있는데요,

이것저것 다 만들려 하니 힘드네요. 헥헥 거리고 있습니다.


그 중,

메시지 박스를 만드는데, 윈폼에 버튼 올리고, 타이틀바, 아이콘 집어넣는 것 까지는 해결이 되었으나,

메시지 내용의 사이즈에 따라 메시지박스 높이를 설정하려고, 기존에 알고 있던, TextRenderer.MeasureText 메서드를 사용하여 사이즈를 유추(Measure?)하여 새 메시지박스 사이즈를 지정해 봤습니다.


그런데, 예전에 어떤 유능한 개발자로부터 MeasureText 를 믿지 마라는 말을 들었음에도 불구하고, 이래저래 테스트를 해 가며 설정을 해 보았으나, 제대로 안 되는 거죠. 짧은 문장의 경우에는 라인 수가 모자라게 측정(유추)이 되거나, 긴 문장의 경우에는 역으로 라인수가 오버되어 측정이 되는 경우가 계속해서 발생했습니다.


좀 찾아 보니, Label 컨트롤에는 GetPreferredSize 라는 훌륭한 메서드가 존재합니다. 어찌 생각해 보면, Label 컨트롤이 AutoSize 이라는 프로퍼티도 있는데, 제대로 측정하는 메서드가 존재하는 건 당연하다고도 생각이 됩니다만...


참고로, MeasureText 에 대해 좀 잘 나와 있는 소스는 다음 링크에 있습니다.

(사실, 이 소스도 뭔가 NewLine에 대한 처리가 좀 미숙합니다.)

Label Auto Resize


그리고, 다음은 Label.GetPreferredSize 라는 훌륭한 메서드에 대한 MSDN 링크 입니다.

Label.GetPreferredSize


소스는 아직 개발중이라 공개하기가 뭣 합니다만, 일단, Label 의 TextChange 이벤트에서 부모 창 윈도우 사이즈를 조절하는 형태를 취했습니다.(넓이는 고정입니다.) 일부를 적어 놓자면,


//라벨 컨트롤은 부모 폼(메시지박스)에 도킹하여,
//부모폼 사이즈 조절로 메시지 박스 사이즈를 조절합니다.
this.labelMessage.Dock = System.Windows.Forms.DockStyle.Fill;

//this._gapSize 는 Label 을 제외한 나머지 영역의 높이의 합.
this._gapSize = this.Height - this.labelMessage.Height;

this.labelMessage.TextChanged += new EventHandler(labelMessage_TextChanged);

...

private void labelMessage_TextChanged(object sender, EventArgs e)
{
	//기존 사이즈를 주고 측정하게 한다. 뒤에 폰트 높이 하나를 더해준 건,
	//요상하게 한 줄씩 먹는 현상이 있어서임.
	int height = this.labelMessage.GetPreferredSize(this.labelMessage.Size).Height
		 + this.labelMessage.Font.Height;

	//한 줄 밖에 없는 메시지 일 경우, 너무 작으면 이상하니까. 최소 사이즈.
	if (height < 70)
	{
		height = 70;
	}

	this.ClientHeight = this._gapSize + height;

	System.Diagnostics.Debug.WriteLine(height);
}


다음과 같은 메시지 박스 입니다.

- 실제로는 색상이 있습니다만, 암갈색으로 편집했습니다. 아이콘은 시스템 아이콘을 그대로 갖다 썼습니다.

- <여기까지> 라는 녀석은 메시지를 아무 글이나 그대로 막 복사해서 넣는 바람에 맨 아랫 라인까지 제대로 나오고 있는 건지 판단하기 위해 넣어 봤어요.