none
font orientation 관련 질문 RRS feed

  • 질문

  • 폰트의 orientation 을 변경했을때 글자의 위치가 예상과 다르게 나타는 것 같아서 정확한 이해나 원하는 위치에 글자를 표시할 수 있는 방법을 질문드립니다.

    void test_escape_orient(HDC hDC, int x, int y, int escape, int orient)
    {
    	HFONT hFont = CreateFont(
                       -20, 
                       -20, 
                       escape, 
                       orient, 
                       FW_NORMAL, 0, 0, 0, 
                       ANSI_CHARSET, 
                       OUT_TT_ONLY_PRECIS, 
                       CLIP_STROKE_PRECIS, 
                       PROOF_QUALITY, 
                       FIXED_PITCH|FF_MODERN, 
                       _T("Courier"));
    	if(hFont) {
    		HFONT hOldFont = (HFONT)SelectObject(hDC, hFont);
    		TCHAR tc[128];
    		_stprintf(tc, _T("x %d,y %d string"), x, y);
    		TextOut(hDC, x, y, tc, _tcslen(tc));
    		//mark origin of textout
    		RECT rc;
    		::SetRect(&rc, x-1, y-1, x+1, y+1);
    		::Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
    		SelectObject(hDC, hOldFont);
    		DeleteObject(hFont);
    	}
    }
    void CtxtView::OnPaint()
    {
        CPaintDC dc(this);	
        CDC hDC = dc.GetSafeHdc();
        SetGraphicsMode(hDC, GM_ADVANCED);
        SetTextAlign(hDC, TA_LEFT | TA_BOTTOM|TA_NOUPDATECP);
        test_escape_orient(hDC, 100, 100, 0, 0);
        test_escape_orient(hDC, 100, 150, 0, 1800);
        test_escape_orient(hDC, 100, 200, 0, 900);
        test_escape_orient(hDC, 100, 250, 0, 2700);
    }

    font의 orientation 값을 0, 1800, 900, 2700 각 네방향으로 다르게 돌아가게 해서 일정한 글씨를 찍었습니다.

    TextAlign 은 left, bottom 을 기준으로 하게 했습니다. TextAlign이 맞게 되는가를 확인하기 위해서 TextOut에 지정한 x,y 좌표에 작은 박스를 그리게 했습니다.

    아래는 결과 입니다.

    x 위나 아래에 조그만 박스는 TextOut에 지정한 x,y 좌표 위치입니다.

    1. 첫줄은 예상한 위치에 그러니깐 글자 X의 left, bottom 에 박스가 그려 졌습니다. 만족입니다.

    2. 둘째줄은 약간의 예상을 벗어 났습니다. 첫글자 X의 left bottom 에 박스가 그려지지 않고 right bottom에 그려졌습니다. (TextAlign의 기준에 대한 설명을 msdn에서도 찾기가 어렵네요)

    3. 세째 줄 과 넷째 줄이 정말 이해 되지 않는 위치에 그려져 있씁니다. TextOut 에 넘겨준 x,y의 위치를 박스로 표시했다고 했는데요. 그려진 위치는 무엇을 기준으로 해 보아도 left/bottom 은 아니라서요.  세째줄은 horz center/vertical center 같고 네째줄은 left/center 이거나 center /bottom 등으로... 보여요. align의 정확한 기준이 첫글자를 기준으로 하는 건지 스트링이 기준인지... 모르겠지만 세,네째줄은 어느것을 기준으로 바꾸어 생각해 보아도 설명이 안되요. 시험이 잘 못된 건지...

    <질문1>

    제 목표는 orientation이 90/270도 회전되어 있을때에도 정확하게 첫글자의 left/bottom에 그려지는 겁니다. 아래 그림처럼 말이지요. 아래처럼 박스가 그려진 위치를 x,y 좌표로 주었을때 A가 오른쪽에 그려지는 것이 목표입니다. 방법이 있을까요?

     

    <질문2>

    첫줄과 두번째 줄은 고정폭 폰트로 글자간의 간격이 잘 맞았는데 세번째 줄과 네번째 줄에도 윗줄과 같이 폭이 일정하게 그리고 싶습니다. orientation이 90/270일때도 폭을 일정하게 그릴 수 있을까요?

    감사합니다.

    2012년 4월 29일 일요일 오전 8:54

모든 응답

  • 1. 폰트를 각도에 따라서 회전해서 출력하는 경우, 각을 지정하기 때문에 해당 각도에 사각형이
        위치하도록 하면 됩니다. 즉, 폰트의 중심위치를 중점으로 하고 폰트의 크기를 지름으로
        하는  원을 그리고 그 원위의 지정한 각도에 해당하는 지점에 사각형을 그리면 됩니다.
        이작업은 삼각함수를 활용하면 구현할수 있으며, 먼저 아래의 글을 참고하시기 바랍니다.

        http://www.tipssoft.com/bulletin/tb.php/FAQ/603
        http://www.tipssoft.com/bulletin/tb.php/update/138

     

    2. 폰트중에 굴림, 굴림체 와 같이 "체" 가 붙어 있는 폰트를 사용하시면 폭을 일정하게 유지할수 있습니다.
        아니면, 폰트를 생성하실때, 폭을 고정하겠다고 옵션을 지정할수도 있습니다. 이부분에 대해서는
        제가 따로 정리해둔 글이 없어서 링크는 힘들것 같네요. CreateFont 함수의 도움말을 잘 살펴보시고
        폰트에 대해서 공부를 좀더 하셔야 할듯합니다.

    • 답변으로 표시됨 Jina LeeModerator 2012년 5월 2일 수요일 오전 1:07
    • 답변으로 표시 취소됨 WindnLake 2012년 5월 2일 수요일 오전 4:57
    2012년 4월 29일 일요일 오전 9:21
    중재자
  • 1. 삼각함수를 사용할 필요는 없습니다. 90도 180도 270도 0도 로만 출력되는 것을 확인하는게 목표라서요.

    2. 제가 질의 드린 내용은 폰트가 출력되는 사각형과 관련된 것이 아니라 출력을 요청한 포인트를 기준으로 어디에 글씨가 그려지는냐와 관련된 겁니다. orientation이 0일때는 SetTextAlign에 지정된 LEFT , BOTTOM 으로 정확히 ALIGN이 맞는데 ORIENTATION이 90,180,270도 일때는 ALIGN이 제 멋대로 출력되는 것 같아서요.

    아래 그림의 X 근처에 조금만하고 그려진 네모 위치를 잘 관찰해 주세요. 요 지점이 TextOut function에 출력 요청된 좌표입니다. 이 좌표를 기준으로 SetTextAlign(LEFT|BOTTOM) 요청했는데 LEFT,BOTTOM으로 출력되지 않는다는 내용입니다.

    2. 위에 올린 코드를 보면 말씀해 주신 폰트를 생성할때 폭을 고정하겠다고 옵션을 지정했습니다.

        FIXED_PITCH|FF_MODERN 로 지정하면 폭 고정으로 알고 있습니다. 그래서 ORIENTATION이 0도 180도 일때는 고정으로 출력되었는데 90도 270도 일때는 위에 그림처럼 고정으로 출력되지 않아서요. 0도 180도 일때와 같은 길이로 90도 270도 일때도 출력하고 싶은데요...

    검토해 주셔서 감사합니다.

    첨언>> 질문내용이 어려운 건 아닌데 잘 설명하기 어려워 복잡해 보여서 연락처를 남깁니다. 혹 궁금하신 내용이 있으시면 공일공 팔육일공에 팔칠사공입니다. 간단히 말씀드려서 문자열을 회전시키는 문제가 아닌 문자를 회전시키는 orientation에 따른 align이 일정하지 않다는 문제입니다.


    • 편집됨 WindnLake 2012년 4월 30일 월요일 오전 3:29 추가 설명..
    2012년 4월 30일 월요일 오전 2:17