'graphic'에 해당되는 글 10건

  1. 2010.07.23 WinApi 그래픽 [TEXT COLOR]
  2. 2010.07.22 WinApi 그래픽[폰트]
posted by nsakura 2010. 7. 23. 00:22

폰트 업,젝트외에 출력되는 문자열에 영향을 주는 여러 가지 함수가 있다. 오늘은

COLORREF SetTextColor(HDC hdc,COLORREF crColor);  //텍스트의 색을 지정
COLORREF SetBkColor(HDC hdc,COLORREF crColor);    //텍스트의 배경을 지정
int SetBkMode(HDC hdc, int iBkMode);                        //배경색상을 사용할 방법을 설정.

보통 Set 함수가 있으면 Get함수가 있는법.

GetTextColor
GetBkColor

함수도 있다. 기능은 set의 반대이다.


iBkMode 인자의 값은

 OPAQUE  배경의 색상에 따라 뒷쪽의 그림이 사라진다.
 TRANSPARENT  투명한 배경을 사용한다 그래서 문자를 출력한 후에도 배경은 투명이다

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
 HFONT hFont,saveFont;
 HBRUSH hBrush,saveBrush;
 
 TCHAR *str=TEXT("GFP입니다.");

 static LOGFONT lFont;

 switch(iMessage){
 case WM_CREATE:
  lFont.lfHeight=50;
  lFont.lfWidth=0;
  lFont.lfEscapement=0;
  lFont.lfOrientation=0;
  lFont.lfWeight=0;
  lFont.lfItalic=0;
  lFont.lfUnderline=0;
  lFont.lfStrikeOut=0;
  lFont.lfCharSet=HANGEUL_CHARSET;
  lFont.lfOutPrecision=0;
  lFont.lfClipPrecision=0;
  lFont.lfQuality=0;
  lFont.lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
  lstrcpy(lFont.lfFaceName,TEXT("궁서"));
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  hBrush=CreateHatchBrush(HS_CROSS,RGB(0,0,255));
  saveBrush=(HBRUSH)SelectObject(hdc,hBrush);

  Rectangle(hdc,10,10,500,200);
  SelectObject(hdc,saveBrush);

  hFont=CreateFontIndirect(&lFont);
  saveFont=(HFONT)SelectObject(hdc,hFont);

  SetTextColor(hdc,RGB(255,0,0));
  SetBkColor(hdc,RGB(255,255,0));

  TextOut(hdc,20,20,str,lstrlen(str));

  SetBkMode(hdc,TRANSPARENT);

  TextOut(hdc,120,120,str,lstrlen(str));

  DeleteObject(SelectObject(hdc,saveFont));
  DeleteObject(SelectObject(hdc,saveBrush));
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}

결과는.. 다음과 같다.



'Computer > Win API' 카테고리의 다른 글

소켓 통신 관련해서 .....  (0) 2013.12.13
WinApi 컨트롤  (0) 2010.07.23
WinApi 그래픽[폰트]  (0) 2010.07.22
WinApi 그래픽 [비트맵 bitmap]  (0) 2010.07.22
WinApi RopMode2 [확장]  (0) 2010.07.22
posted by nsakura 2010. 7. 22. 22:53

이번에는 폰트에 대해서 실습을 해보자.

폰트도 페이나 브러시와 마찬가지로 gdi 오브젝트이다.

폰트를 만들기 위해서는 CreatePen 함수를 사용한다. 그런데 이 함수 원형은. 인수가 14개나 된다.

하지만 그중 쓰는건 거의 정해져있으니까 걱정할필요는 없다

포스팅하는 본인만 손가락이 아플 뿐 ...

HFONT CreateFont(int,int,int,int,int,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCTSTR)

 인수  내용 
 nHeight  폰트의 높이를 논리적인 단위로 지정 값이0이면 디폴트값
 nWidth  폰트의 폭을 지정하되 이값이 0이면 nHeight에서 지정한 높이에 따라 폭을 자동으로 결정.
 nEscapement  폰트의 각도를 0.1도 단위로 설정
 nOrientation  글자 한 자와 x축과의 각도를 지정한다. nEscapement는 전체의 문자열의 기울기를 지정하지만 이 인수는 개별 문자의 기울기
 fnWeight  폰트의 두께를 설정한다.
 fdwltalic  기울임체, DWORD지만 True False 사용가능
 fdwUnderline  밑 줄,DWORD지만 True False 사용가능
 fdwStrikeOut  관통선,DWORD지만 True False 사용가능
 fdwCharSet  문자 코드와 문자의 대응관계를 정하는 문자셋
 fdwOutputPrecision  출력 정확도를 설정한다
 fdwClipPrecision  클리핑 정확도를 설정한다
 fdwQuality  논리적 폰트를 물리적 폰트에 얼마나 근접시킬 것인가 지정한다.
 fdwPitchAndFamily  폰트의 피치와 그룹을 설정한다
 lpszFace  글꼴의 이름을 나타내는 문자열을 설정한다.

많은 인자가 있찌만 이중 실질적으로 변경해 야 할 필요가 있는 인수는 문자의 크기를 지정하는 nHeight와 글꼴 모양을 지정하는

lpszFace정도이다. 나머지 인수는 디폴트나 폰트 열거툴로 조사한 정보를 사용하면 일단은 큰 무리 없이 사용 가능.

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
 HFONT hFont,saveFont;
 
 TCHAR *str=TEXT("GFP입니다.");

 switch(iMessage){
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  hFont=CreateFont(50,0,0,0,0,0,0,0,HANGEUL_CHARSET,0,0,0,VARIABLE_PITCH|FF_ROMAN,TEXT("궁서"));
  saveFont=(HFONT)SelectObject(hdc,hFont);
  TextOut(hdc,10,10,str,lstrlen(str));
  DeleteObject(SelectObject(hdc,saveFont));
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}


그런데 저렇게 인수를 적어나가는건 상당히 헛갈리기도 한다.

그래서 저 인수를 하나로 묶어서[구조체로] 인자를 던져주는 방법이 있다.

함수명이 바뀌긴하는데 오히려 개인적으로는 이방법이 편하다.

이 함수의 인자는 LOGFNT구조체인데 폰트의 특을 다 정의하고 있기 때문에. 이 구조체에 값만 대입해서.

함수로 던져주면 된다.

한번 사용해보자.

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
 HFONT hFont,saveFont;
 
 TCHAR *str=TEXT("GFP입니다.");

 static LOGFONT lFont;

 switch(iMessage){
 case WM_CREATE:
  lFont.lfHeight=50;
  lFont.lfWidth=0;
  lFont.lfEscapement=0;
  lFont.lfOrientation=0;
  lFont.lfWeight=0;
  lFont.lfItalic=0;
  lFont.lfUnderline=0;
  lFont.lfStrikeOut=0;
  lFont.lfCharSet=HANGEUL_CHARSET;
  lFont.lfOutPrecision=0;
  lFont.lfClipPrecision=0;
  lFont.lfQuality=0;
  lFont.lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
  lstrcpy(lFont.lfFaceName,TEXT("궁서"));
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  hFont=CreateFontIndirect(&lFont);
  saveFont=(HFONT)SelectObject(hdc,hFont);
  TextOut(hdc,10,10,str,lstrlen(str));
  DeleteObject(SelectObject(hdc,saveFont));
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}

이렇게 구조체를 사용하는게 개발할때 편할것이다.

결과는 위와 동일합니다.

참고로 CreatePenIndirect,CreateBrushIndirect 등의 함수도 있다.

'Computer > Win API' 카테고리의 다른 글

WinApi 컨트롤  (0) 2010.07.23
WinApi 그래픽 [TEXT COLOR]  (0) 2010.07.23
WinApi 그래픽 [비트맵 bitmap]  (0) 2010.07.22
WinApi RopMode2 [확장]  (0) 2010.07.22
WinApi 그래픽 [DrawMode]  (1) 2010.07.22