문제

MSN Messenger에서 실행될 C# 앱 용 Coloumns Of Text를 만들려고합니다. 나는 모든 것을 줄을 서서 극복하고 있습니다.

다음은 내가 원하는 출력의 예입니다.

1)  Pizza Hut                                            123 Fake St.
2)  Domino's Pizza                                       123 Fake St.
3)  The Cheesecake Cafe                                  123 Fake St.
4)  Capital Pizza & Steakhouse                           123 Fake St.
5)  Funky Pickle Pizza                                   123 Fake St.
6)  Boston Pizza                                         123 Fake St.
7)  Rose Bowl Rouge Lounge                               123 Fake St.
8)  Royal Pizza                                          123 Fake St.
9)  A Columbus Pizza & Donair Inc                        123 Fake St.

그러나 가변 너비 글꼴이기 때문에 다음과 같이 표시됩니다.

1)  Pizza Hut                                        123 Fake St.
2)  Domino's Pizza                                   123 Fake St.
3)  The Cheesecake Cafe                                  123 Fake St.
4)  Capital Pizza & Steakhouse                               123 Fake St.
5)  Funky Pickle Pizza                                   123 Fake St.
6)  Boston Pizza                                     123 Fake St.
7)  Rose Bowl Rouge Lounge                               123 Fake St.
8)  Royal Pizza                                          123 Fake St.
9)  A Columbus Pizza & Donair Inc                    123 Fake St.

C# string.padright () 함수를 사용하고 공백과 탭을 사용하여 패딩을 추가하는 자체 기능을 작성하려고 시도했습니다. 둘 다 고정 너비 글꼴로 잘 작동하지만 가변 너비 글꼴로 중단됩니다.

주어진 글꼴에서 문자열의 너비를 결정하는 방법이 있습니까?

아니면 다른 제안이 있습니까?

도움이 되었습니까?

해결책

그냥 사용하십시오 Textrenderer 수업. 가장 간단한 경우 :

Size size = TextRenderer.MeasureText("Hello world", someFont);

System.Windows.Fonts에 액세스 할 수없는 경우 그래픽 .measurestring 여전히 제한 사항이 있지만 작업을 수행해야합니다.

Bitmap bmp = new Bitmap(1,1);
Graphics graphics = Graphics.FromImage(bmp);
SizeF size = graphics.MeasureString("Hello world", someFont);

그러나 텍스트의 글꼴과 공간이 동일 해야하는 경우 텍스트를 완벽하게 정렬 할 수없는 경우가 있습니다. 귀하의 경우 MSN 메신저가 무엇을 할 수 있는지 모르겠지만 HTML의 최소한 하위 집합에 액세스 할 수있는 경우에는 완벽한 출력이 없습니다.

또한 로컬 컴퓨터에서 측정하고 올바른 글꼴을 설치하지 않고 다른 컴퓨터로 보내는 경우 열은 더 이상 열처럼 보이지 않으므로 모든 컴퓨터에서 글꼴 선물의 기본 서브 세트로 제한됩니다.

다중 운영 체제 지원이 요구 사항 인 경우 Mac 및 PC의 Arial Font가 정확히 동일하게 보이거나 측정하지 않기 때문에 큰 문제가 발생합니다.

다른 팁

그래픽 클래스를 사용하여 특정 글꼴로 주어진 문자열의 길이를 측정 한 다음 사용할 탭의 수를 결정하는 데 사용할 수 있습니다.

단일 텍스트 필드에서 ASCII 에서이 모든 것을 렌더링하려고하는 것 같습니다. 예? 그렇다면, 그것은 매우 까다 롭습니다. 지금 당장 고정 된 수의 탭이있는 것 같습니다. 이것이 문제가 될 것입니다. 대신 공백을 할 수 있습니다. Padright로하고 있다고 생각합니다 (특정 기능에 익숙하지 않음).

그러나 핵심은 가변 너비 글꼴로 표시된 순수한 ASCII를 사용하면 두 번째 열에 완벽하게 정렬되지 않는다는 것입니다. 부지런하다면 가까이 갈 수 있지만, 그것은 자본 W가 많고, 다른 소문자가 많은 줄이 있다면, 당신이 무엇을하든 상관없이 폭이 큰 차이가있을 것입니다. GDI에서 렌더링하는 경우 가장 좋은 방법은 열당 grawText로 한 번 호출하는 것입니다. 원하는 경우 각 열에서 하나의 큰 문자열을 만들고 첫 번째 열에서 측정 값을 호출하여 두 번째 열을 위해 이동 해야하는 공간의 양을 결정할 수 있습니다.

또는 이것이 HTML을 수행 할 수있는 인터페이스 인 경우 테이블 또는 div가 잘 작동합니다. 환경의 세부 사항에 따라 다릅니다. 또한 WinForms 등 FlowLayout 패널에 두 개의 자동 높이 설정 레이블이있는 것과 같은 작업을 수행 할 수 있습니다.

편집 : 또한 웹 서비스에서 그래픽 클래스 인스턴스를 얻는 방법에 대해 물었습니다. 당신은 다음과 같은 일을 할 수 있습니다 :

    private static Bitmap bitmap = new Bitmap( 1, 1 );
    private static Graphics graphics = null;

    public static Graphics GetGeneralGraphics()
    {
        if ( graphics == null )
            graphics = Graphics.FromImage( bitmap );
        return graphics;
    }

웹 서비스 컨텍스트에서 해당 로컬 변수 (완료시 적절하게 폐기)를 만들고 싶을 것입니다.

아마도 HTML에서 모든 것을 포맷해야 할 것입니다. 그러면 열의 TR/TD 요소 만 출력 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top