■ jwFreeNote_01
글자의 너비와 높이 회전 및 줄간격 자동개행 여백조정 함수(TextOutExp) | VC++ 일반 | 2007-05-20 오후 9:04:01 |
박종철 (isnothing7777) | 번호: 7644 / 평점: (-) / 읽음:912 |
/******************************************************************************************** * * Function TextOutExp (c)2007-05-20 make by park jong churl * * 기능 : 글자의 기울기와 장평 높이 줄간격 조정 출력 * 자동 줄넘기기(자동 개행) * 위쪽,왼쪽,오른쪽 ,아랫쪽 여백 설정 * DC에 출력하고 문자열이 남을 경우 남은 문자열을 리턴해 준다.(대량의 문자열을 출력할 경우) * pDC==CDC 포인터(글자를 쓸곳) * rct ====RECT 구조체(위쪽,왼쪽,오른쪽,아랫쪽) * szValues======문자열 * lf =============LOGFONT 구조체 포인터 * iFontSize=========글자의 크기(기본 11) * iGag===글자의 기울기(기울기 각도 기본0) * nHeight========글자의 높이(1에 대한 배율, 기본10) * nWidth========글자의 너비(1에 대한 배율 ,0일 경우에는 자동조정 기본 0) * fSpace ====줄간격(1에 대한 배율 소수점 허용 ,기본 1) * TCHAR * ==========리턴값 문자열을 모두 DC에 프린트 했을때 NULL 포인터 * 문자열이 많아 DC에 출력하고 남아 있으면 나머지 문자열 포인터 * DC에 출력하고 문자열이 남을 경우를 대비해서 리턴값을 추가했습니다. * 또한 아랫쪽 여백도 설정 가능하도록 수정했습니다. (2005-07-21) ********************************************************************************************* 원래 있던 GetLine 함수와 vb버젼 FontStuff함수를 조작하여 만든 함수 -_-;; *********************************************************************************************/ TCHAR *TextOutExp(CDC *pDC, RECT rct,TCHAR *szValues,LOGFONT *lf,int iFontSize=11,int iGag=0, long nHeight=10,long nWidth=0,float fSpace=1); TCHAR *GetLine(CDC *pDC,TCHAR *pDest, TCHAR *pStr, int *len,int margin); TCHAR *TextOutExp(CDC *pDC, RECT rct,TCHAR *szValues,LOGFONT *lf,int iFontSize,int iGag, long nHeight,long nWidth,float fSpace) { const double pi = 3.14159265358979; CFont newFont; TCHAR pTemp[256]={0}; long cx,cy;//그리기 좌표 long i=0;//초기값을 지정해야 한다. int len=0; int y=pDC->GetDeviceCaps(VERTRES);//DC의 길이를 구한다. if(szValues==NULL)return NULL;//넘어온 문서에 내용이 없으면 끝낸다. lf->lfEscapement = 10 * iGag; //rotation angle, in tenths lf->lfHeight = (iFontSize * -20) / 15 ; lf->lfWidth = (iFontSize * 10) / 15 ; lf->lfHeight = lf->lfHeight * nHeight; lf->lfWidth = lf->lfWidth * nWidth; newFont.CreateFontIndirect(lf); //새 오브젝트 폰트 생성 CFont *hPrevFont = (CFont *) pDC->SelectObject(& newFont) ;//생성 오브젝트 폰트 선택후 //이전 오브젝트 폰트 핸들 저장 while(*szValues!=_T('\0'))//문서의 끝 까지 읽는다. { //도무지 이해가 가지 않는 로직 특히 sin,cos -_-;; cx = cos((iGag * pi / 180) - pi / 2) * abs(lf->lfWidth * fSpace) * i + rct.left; cy = sin((iGag * pi / 180) + pi / 2) * abs(lf->lfHeight * fSpace) * i + rct.top ; //DC의 길이를 초과해서 프린트할 경우 루틴을 끝내고 나머지 문자열 위치 포인터를 리턴한다. if(cy>=y-rct.bottom) { pDC->SelectObject(hPrevFont) ;//이전 폰트로 환원 newFont.DeleteObject();//생성 폰트 제거 return szValues; } /*문자열 중에서 다음 줄넘김 문자를 찾아서 이전의 문자를 리턴한다 GetLine(DC포인터,원본문자열을 라인별로 잘라서 저장할 포인터(배열),원본문자열, 글자수를 넘겨 받을 정수형 포인터) 리턴값은 최종 복사한 문자의 위치 포인터*/ szValues=GetLine(pDC,pTemp,szValues,&len,rct.left+rct.right); //반드시 복사한 문자열을 출력해야 한다. 원본 문서(szValues)는 안됨 pDC->TextOutW((int)cx,(int)cy,pTemp,wcslen(pTemp));//DC에 글자를 출력한다. i++; } pDC->SelectObject(hPrevFont) ;//이전 폰트로 환원 newFont.DeleteObject();//생성 폰트 제거 return NULL;//정상적으로 프린트가 끝났을때는 NULL포인터를 리턴한다. } TCHAR *GetLine(CDC *pDC,TCHAR *pDest, TCHAR *pStr, int *len,int margin) { CSize size(0,0); int sum=0; int x=pDC->GetDeviceCaps(HORZRES);//DC의 너비를 구한다. TCHAR temp[2];//임시로 한글자를 저장할 장소(최하2이상 정한다 쓰레기 값때문에) memset(temp,0,sizeof(temp));//쓰레기 값을 제거한다. *len=0; if(pDest==NULL) return pStr; *pDest='\0'; if(pStr==NULL) return NULL; while(*pStr!='\0')//문서의 끝까지 읽어 들인다. { if(*pStr=='\n')//캐리지 리턴(강제 줄넘김) 확인 { pStr++; break; } if(*pStr=='\r')//줄넘김 문자의 삽입은 무시 { //'\r' Skip } else { *temp=*pStr;//한글자씩 읽어서 size=pDC->GetTextExtent(temp);//글자의 너비를 계산한다. sum+=size.cx;//총 너비를 계산한다. if(sum>=x-margin)break;//총 너비가 DC너비 보다 크면 루프 탈출 *pDest=*pStr;//계속해서 한글자씩 버퍼에 복사한다. (*len)++; pDest++; } pStr++;//포인터 커서를 다음 문자로 옮긴다. } *pDest='\0'; return pStr; } /** 사용방법: 프린터에 인쇄할때 예시 TCHAR *pTemp=NULL;//함수의 리턴 값을 받을 포인터 TCHAR *szValues=_T("이것은 프린터에 인쇄하는 것입니다. 물론 화면에도 됩니다"); int dpiX = pDC->GetDeviceCaps(LOGPIXELSX); int dpiY = pDC->GetDeviceCaps(LOGPIXELSY); RECT rct={10*dpiX/72,300*dpiY/72,20*dpiX/72,0};//RECT 구조체 생성 LOGFONT lf;//LOGFONT 구조체 생성 memset(&lf,0,sizeof(lf));//구조체를 초기화 시키다. wcscpy_s(lf.lfFaceName,10, _T("굴림")) ;글꼴 설정 pTemp=TextOutExp(pDC,rct,szValues,&lf,15,45,10,0,3); 또는 pTemp=TextOutExp(pDC,rct,szValues,&lf); 기본값 **/ |
댓글
댓글 쓰기