. 탭 관련 코드 수정

마진이 잘 출력되기는 했는데 위 그림을 자세히 보면 뭔가 제대로 되지 않는 부분이 있다. 대충 봐서는 문제점을 얼른 파악하기 힘든데 탭의 위치가 잘못된 것이다. 탭은 TabSize의 배수 위치에 설정되는데 마진을 고려하지 않고 무조건 화면 왼쪽에서부터 탭의 배수 위치를 찾기 때문에 while이후의 출력위치가 잘못되어 있다. 탭문자 하나가 있는 while 왼쪽의 여백은 탭문자 두 개가 있는 그 다음 줄 여백의 절반이 되어야 하는데 뭔가 계산이 잘못되었기 때문에 그렇지가 못하다.

탭 위치를 마진폭에 상관없이 설정하려면 먼저 현재 x 위치에서 마진폭을 뺀 상태에서 탭위치를 계산하고 다시 마진폭을 더하면 된다. 즉 마진폭을 무시하고 탭의 배수 위치를 찾은 후에 마진폭을 재적용하는 것이다. 이런 식으로 다음 다섯 개의 함수를 수정한다.

 

함수

코드

GetLine

acwidth =((acwidth-MarginWidth)/TabSize+1)*TabSize+MarginWidth;

GetXPosOnLine

acwidth =((acwidth-MarginWidth)/TabSize+1)*TabSize+MarginWidth;

DrawSegment

docx=((docx-MarginWidth)/TabSize+1)*TabSize+MarginWidth;

GetXYFromOff

x = ((x-MarginWidth)/TabSize+1)*TabSize+MarginWidth;

GetOffFromXY

chWidth=((acwidth-MarginWidth)/TabSize+1)*TabSize-acwidth+MarginWidth;

 

사용하는 변수가 다를 뿐이지 모두 동일한 수식이다. 이 다섯 개 함수의 수식만 수정하면 탭이 제 위치에 정렬됨은 물론이고 마우스 클릭시 이동 위치나 캐럿의 좌표 계산도 모두 정확해진다. TabSize를 참고하는 모든 함수를 다 수정했으며 이제 탭이 있는 문장도 산뜻하게 출력될 것이다.