MSDN API (Text 및 Font)

Font 2017. 1. 3. 15:55

AddFontMemResourceEx
HANDLE AddFontMemResourceEx(
  _In_ PVOID pbFont,     //font resource 포인터
  _In_ DWORD cbFont,     //리소스 bytes 수
  _In_ PVOID pdv,        //reserved
  _In_ DWORD *pcFonts    //폰트리소스에 1개이상의 폰트가 있을 수 있다. 그럴때 설치될 폰트갯수.
);

문서나 웹페이지에 임베디드된 폰트 추가할때 사용.
프로세스에 private함.

RemoveFontMemResourceEx
BOOL RemoveFontMemResourceEx(
  _In_ HANDLE fh     // AddFontMemResourceEx의 리턴값.

);

AddFontResource
int AddFontResource(
  _In_ LPCTSTR lpszFilename
);

여러개의 파일을 지정할 수 있는데 " |" 로 구분된다 (ex. abcxxxx.pfm | abcxxxxxx.pfb)
시스템폰트에서 폰트를 추가/삭제를 한 애플리케이션은 WM_FONTCHANGE 메세지를 통해 top-level 윈도우들에게 notify해야한다.
SendMessage 함수에 hwnd를 HWND_BROADCAST로 설정해서 보내야함.

RemoveFontResource함수로 삭제가능.

현재 세션에 폰트를 설치. 시스템이 재시작되면 폰트는 없어짐. 재시작후에도 폰트가 존재하도록하려면 레지스트리에 등록해야함.

%windir%\fonts\ 폴더에 설치 + 레지스트리에 있으면 , 폰트는 수정되거나 삭제되거나 대체될 수 없음.
RemoveFontResource로 삭제가능. 

CreateFont
HFONT CreateFont(
  _In_ int     nHeight,     //logical unit단위의 높이를 말함. if 0, default height value 적용.
                            //if > 0, device unit으로 변환 후 폰트에서 사용가능한 cell height로 매칭.
                            //if < 0, 절대값을 device unit으로 변환 후 폰트에서 사용가능한 character height로 매칭.
  _In_ int     nWidth,      //
  _In_ int     nEscapement,
  _In_ int     nOrientation,
  _In_ int     fnWeight,
  _In_ DWORD   fdwItalic,
  _In_ DWORD   fdwUnderline,
  _In_ DWORD   fdwStrikeOut,
  _In_ DWORD   fdwCharSet,
  _In_ DWORD   fdwOutputPrecision,
  _In_ DWORD   fdwClipPrecision,
  _In_ DWORD   fdwQuality,
  _In_ DWORD   fdwPitchAndFamily,
  _In_ LPCTSTR lpszFace
);

- 모든 height 비교에서 font mapper는 request size를 넘지 않는 가장 큰 값을 찾는다.
     - 매핑은 폰트가 처음 사용되어질 때 발생, MM_TEXT mapping mode에서는 다음의 식을 써서 height를 구함.
   - nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

logical unit, device unit, cell height, character height ?

ExtTextOut
BOOL ExtTextOut(
  _In_       HDC     hdc,     //dc 핸들
  _In_       int     X,
  _In_       int     Y,
  _In_       UINT    fuOptions, //어플리케이션에서 정의한 rectangle을 사용하는 방법 정의(?)
  _In_ const RECT    *lprc,
  _In_       LPCTSTR lpString,
  _In_       UINT    cbCount,
  _In_ const INT     *lpDx
);

fuOptions
    • ETO_CLIPPED
      •   text clipped.
    • ETO_GLYPH_INDEX
      •   lpString이 glyph_index이냐를 말해줌.
      •   glyph_indexing은 truetype폰트에만 적용됨.
    • ETO_IGNORELANGUAGE
      •   reserved for system use. 이 flag를 set하면 international script 지원을 잃게 되고, 텍스트가 안나올수도 있다.
    • ETO_NUMERICSLATIN
      •   숫자를 표기할때 European digit을 쓸것인가. (1,2,3,4, ..)
    • ETO_NUMERICSLOCAL
      •   숫자를 표기할대, 로케일에 따라 할것인가
    • ETO_OPAQUE
      •   백그라운드컬러가 rectangle을 채울것인지.
    • ETO_PDY
      • set되면, lpDx 어레이가 pair 값을 가진다. (set 아니면 x좌표값만 가지는듯).
      • 첫번째 값은 인접한 캐릭터의 셀과의 거리를 나타낸다. 두번째 값은 글꼴의 세로방향으로 거리를 나타냄.
    • ETO_RTLREADING
      •   RTL string을 표현. set안되면 무조건 LTR.
      •   SetTextAlign 함수에서 TA_RTLREADING 값도 같은 역할을 한다.

ETO_GLYPH_INDEX와 ETO_RTLREADING 은 같이 사용될 수 없다. 글리프인덱스는 language 프로세싱 적용이 끝난거라서 ETO_RTLREADING을 무시함.
     (glyph_index면 uniscribe를 콜하지 않아서 그런듯.)

lprc
     optional RECT struct. 
     clipping, opaquing 에 쓰임.

lpString
     draw될 텍스트. zero로 끝날필요없다. 왜냐면 cbCount가 있기때문.

cbCount
     length of the string pointed to by lpString.
     8192가 max.
lpDx
     인접한글자와의 변위를 나타냄. lpDx[i]는 i번째 character cell과 i+1번째 chararcter cell 사이의 변위를 나타낸다.

GetTextExtentExPoint 
BOOL GetTextExtentExPoint( 
  _In_  HDC     hdc,
  _In_  LPCTSTR lpszStr,
  _In_  int     cchString,
  _In_  int     nMaxExtent,     //maximum allowable width.(logical unit)
  _Out_ LPINT   lpnFit,         //maximum number of characters. NULL이면 nMaxExtent 무시.
  _Out_ LPINT   alpDx,          //partial string extents array. (logical unit)
  _Out_ LPSIZE  lpSize
);

특정 공간에 맞게 들어갈 수 있는 글자수를 찾아주는 함수. 각각의 캐릭터의 text_extent로 array를 채워준다. ( text extent란 시작점부터 해당 글자까지의 거리? 해당글자의 끝까지의 거리?)
word-wrapping 할때 유용하다.

alpDx [out]
    • nMaxExtent까지 fit 되는 글자까지 text extent값들을 array로 갖고있음. 최소한 cchString의 캐릭터수만큼 크기를 가져야 함.

character sequence가 임의의 개수의 glyphs로 바뀔 수 있는 complex 스크립트의경우 alpDx 배열의 값이 codepoint와 1:1 매칭됨. (glyph가 아닌 codepoint에 매칭된다는 뜻인듯)

Remarks
    •  alpDx가 null 이면 GetTextExtentPoint를 콜한것과 같다.
    • 텍스트가 horizontal이라 가정하고 extent 계산함. (escapement 값이 0). 만약 escapement 가 0이 아닌 폰트를 써도 계산 x.
    • GM_ADVANCED 로 그래픽모드가 설정되있고 character orientation이 print orientation으로부터 90degrees 일 경우에는 예외.
    • char orientation과 print orientation이 일치할경우, 


SetTextJustification
BOOL SetTextJustification(
  _In_ HDC hdc,
  _In_ int nBreakExtra,
  _In_ int nBreakCount
);

텍스트의 스트링을 break character에 더해야하는(add) space 크기를 Set.

nBreakExtra[in]
    • 텍스트이 라인에 더해져야하는 total extra space (logical unit).
    • MM_TEXT 매핑모드일 경우, nBreakExtra로 설정한 값이 반올림 처리됨. 
nBreakCount[in]
    • number of break characters in the line

Return Value
    • 성공하면 nonzero.

break char는 일반적으로 space character(ASCII 32)이다. 하지만 폰트에 따라 다른 글자가 될 수도 있다. GetTextMetrics 함수로 폰트의 break character들을 찾을 수 있다.
TextOut 함수는 남은 공간을 break chars에 골고루 분배한다.

GetTextExtentPoint32 함수는 항상 SetTextJustification 함수와 같이 쓰임.

DrawTextEx

int DrawTextEx(
  _In_    HDC              hdc,
  _Inout_ LPTSTR           lpchText,     //pointer to String
  _In_    int              cchText,
  _Inout_ LPRECT           lprc,
  _In_    UINT             dwDTFormat,
  _In_    LPDRAWTEXTPARAMS lpDTParams
);

lpchText[in, out]
    • pointer to the string. dwDTFormat에 DT_MODIFYSTRING이 켜져있으면 4개의 additional char를 붙인다.
    • 스트링을 담고 있는 버퍼는 여분의 캐릭터를 담을 수 있을만큼 커야함.
cchText [in]
    • length of the string. -1 이면 lpchText를 null로 보고, 자동으로 character count를 계산한다.
lprc [in, out]
    • pointer to a RECT struct. (logical coordination). 텍스트가 맞춰질 사각형.
dwDTFormat
    • DT_BOTTOM   
      • bottom 정렬. DT_SINGLELINE일 경우에만 쓰임.
    • DT_CENTER    
      • horizontal center.
    • DT_TOP
    • DT_RIGHT
    • DT_LEFT
    • DT_VCENTER
      • vertical center 정렬.
    • DT_CALCRECT
      • lprc를 보고 width에 맞는 height 계산. 1줄만 있다면 width를 텍스트에 맞춘다.
    • DT_EDITCONTROL
      • 멀티라인 에디트 컨트롤의 text-displaying 특성을 복제한다. 특히 avgCharWidth는 edit control과 같은 방식으로 계산되며, 마지막라인은 디스플레이하지 않는다. (?)
    • DT_END_ELLIPSIS
      •      디스플레이텍스트에 대해, rectangle에 맞춰 마지막 텍스트를 타원으로 바꿈. DT_MODIFYSTRING이 켜져잇으면 텍스트 자체를 수정하는듯.
      • 각 줄의 끝이 아닌 Rect를 넘는 모든 텍스트를 생략하고 타원으로 변경.
      • DT_PATH_ELLIPSIS / DT_WORD_ELLIPSIS와 비교.
    • DT_PATH_ELLIPSIS 텍스트의 중간을 생략하고 ... 으로 변경.
      • 스트링이 "\"를 포함하고있다면 최대한 마지막 "\" 뒤의 글자를 보존하도록 한다.
      • 역시 DT_MODIFYSTRING이 없으면 스트링을 수정하지않음.
    • DT_WORD_ELLIPSIS
      • rect에 맞지 않는 어떤 단어라도 자르고 ellipses를 붙인다.
    • DT_EXPANDTABS
      • 탭출력. (8칸이 기본)
    • DT_TABSTOP
      • 탭 간격 설정. lpDTParams가 가리키는 DRAWTEXTPARAMS struct에 정의 되어 있음.
    • DT_EXTERNALLEADING
      • line height에 external leading 값을 포함한다.
      • 일반적으로는 포함되지 않음.
    • DT_HIDEPREFIX
      • ampersans(&)를 무시함. 
    • DT_NOPREFIX
      • '&' 을 없애고 다음글자에 underscore를 그리고, '&&'을 '&'으로 그려주는 작업을 하지 않는다. 적은 그대로 나옴.
    • DT_PREFIXONLY
      • underscore만 그림.
    • DT_INTERNAL
      • 텍스트 메트릭을 계산하는데 시스템폰트를 사용한다.
    • DT_MODIFYSTRING
      • 디스플레이텍스트와 매칭하기 위해 실제 스트링을 수정함. DT_END_ELLIPSIS나  DT_PATH_ELLIPSIS를 같이쓰지 않으면 효과x.
    • DT_NOCLIP
      • Draw without clipping.
    • DT_DTFULLWIDTHCHARBREAK
      • DBCS(Double Byte Character string)에서 line-breaking이 일어나지 않도록 한다. 예를들어 한글을 쓸 때, 영어처럼 단어단위로 줄바꿈이 일어나도록 해준다. DT_WORDBREAK가 안켜져있으면 효과x.
    • DT_RTLREADING
      • Hebrew나 Arabic font가 선택되었을경우, RTL ordering layout을 한다.
    • DT_SINGLELINE
      • 싱글라인으로만 디스플레이한다. 캐리지리턴(CR)이나 라인피드(LF) 가 linebreak 하지않게됨.
    • DT_WORDBREAK
      • Break words. 단어가 lprc의 rect를 넘어가게 되면 line-breaking이 일어남. CR LF도 마찬가지로 줄바꿈을 일으킨다.


'Font' 카테고리의 다른 글

Uniscribe 분석 (1)  (0) 2016.07.06
Uniscribe 분석 (0)  (0) 2016.07.05
Posted by outshine90
,