본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 7 GDI - 6 글꼴과 문자열


글꼴에 따른 문자열을 출력하는 코드이다.

프로젝트명은 TextOutDemo 이며

속성은 전과 같은 SDI 이다.



/////////////////////////////////////////////////////

void CTextOutDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting
int nY = 0;
CFont Font;
CFont* pOldFont;

LOGFONT lf;
::ZeroMemory(&lf, sizeof(lf));

wsprintf(lf.lfFaceName,TEXT("%s"), TEXT("Arial"));
//wsprintf 는 우측의 내용을 좌측에 출력하는 함수이다.
//위에 있는 코드의 내용은 lf의 글꼴명을 Arial로 한다 라는 코드이다.
 

for(int i = 10; i<25;i++)
{
lf.lfHeight= i;
nY +=i;
Font.CreateFontIndirect(&lf);
//Arial, 크기 10~24 까지 폰트 객체를 생성한다.
pOldFont = dc.SelectObject(&Font);
dc.TextOut(10,nY,TEXT("Test String!"));    //왼쪽에서 10 의 거리 위에서부터 nY의 거리의 지점에 텍스트를 출력한다.
dc.SelectObject(pOldFont);         //폰트값을 초기화한다.

//생성된 폰트로 Test String! 이라는 문자열을 출력한다.

Font.DeleteObject(); 
//폰트 객체를 삭제한다.
}//반복한다.
}


///////////////////////////////////////

출력화면

 


 x좌표는 고정되고 y좌표와 글씨 크기가 변경되어 출력되는 화면이 나온다.


////////////////////////////////////////////////////////////////////////////////////////


다음으로는 좀 더 정교한 출력을 위한 코드이다.



void CTextOutDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting

int nY = 50;
CFont Font;
CFont* pOldFont;

LOGFONT lf;
::ZeroMemory(&lf, sizeof(lf));

wsprintf(lf.lfFaceName,TEXT("%s"), TEXT("Arial"));
//wsprintf 는 우측의 내용을 좌측에 출력하는 함수이다.
//위에 있는 코드의 내용은 lf의 글꼴명을 Arial로 한다 라는 코드이다.

lf.lfHeight = 24; //글꼴의 높이를 픽셀 단위로 정하는 멤버. 값이 0이면 기본크기로 결정.[음수 사용해도 절대값으로 계산됨]
lf.lfWidth = 24;           //문자간의 장평을 결정하는 멤버
lf.lfOrientation = 50;               //글자의 각도를 0.1도 단위로 명시하는 멤버
lf.lfEscapement = 50;            //문자열의 기울기를 0.1도 단위로 명시하는 멤버
lf.lfWeight = FW_BOLD;         //글꼴의 굵기를 명시하는 멤버, 보통 0 부터 900까지의 값이며 값은 100단위로 증가. 
//보통 일반 글꼴은 400(FW_NORMAL)정도이며 흔히들 굵게 로 하는것은 700(FW_BOLD) 정도 라고 함.
lf.lfItalic = true;                     //이탤릭체 유무
lf.lfUnderline = true;               // 밑줄 유무
lf.lfStrikeOut = true;                //취소줄 유무.



Font.CreateFontIndirect(&lf);
//Arial, 크기 10~24 까지 폰트 객체를 생성한다.
pOldFont = dc.SelectObject(&Font);
dc.TextOut(100,nY,TEXT("Test String!")); //왼쪽에서 10 의 거리 위에서부터 nY의 거리의 지점에 텍스트를 출력한다.
dc.SelectObject(pOldFont);

//생성된 폰트로 Test String! 이라는 문자열을 출력한다.

Font.DeleteObject();
//폰트 객체를 삭제한다.
}


여러 글꼴의 속성에관한 멤버들을 사용한 코드이다.

내용은 주석으로 처리해두었으니 그걸 보면 된다.


출력하면 코딩된 속성이 다 들어가버린 문자열이 나온다.




다음은 탭 이 먹히는 텍스트 아웃 과 먹히지 않는 텍스트 아웃의 비교 코드이다.

void CTextOutDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting


CFont Font;

CFont* pOldFont;
LOGFONT lf;
::ZeroMemory(&lf,sizeof(lf));
lf.lfHeight = 36;
wsprintf(lf.lfFaceName, TEXT("%s"),TEXT("Arial"));
Font.CreateFontIndirect(&lf);
pOldFont = dc.SelectObject(&Font);

dc.TextOutW(20,20, TEXT("\tTest String!"));
//TextOut 을 이용하면 그냥 출력되며 '\t'가 반영되지 않는다.
int nTabStop = 40;
dc.TabbedTextOut(20,70,TEXT("\tTest String!"),1, &nTabStop, 20);
dc.TabbedTextOut(20,120,TEXT("\t\tTest String!"),1, &nTabStop, 20);
//TabbedTextOut를 이용하면 '\t' 가 들어간 문자열이 출력된다.

dc.SelectObject(pOldFont);

}


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

출력화면

 
\\\\\\\\\\\\\\\\\\\\\\\

tabbedtextout 을 사용하면 \t 의 기능이 작동하여 출력되고

그냥 textout을 사용하면 \t가 있어도 작동하지 않는다. 그 외의 특별한 내용은 없는 코드.

그냥 텍스트 아웃과 다른점은 출력시에 문자열 뿐만이 아닌 탭의 크기도 넣어주어야 한다는 것이다.



여기까지 프로젝트 파일의 업로드.