'output'에 해당되는 글 5건

  1. 2010.07.16 WinApi 여러가지 출력
  2. 2010.07.15 WinApi DrawText
posted by nsakura 2010. 7. 16. 16:37

그래픽 출력

그래픽 출력도 문자열 출력과 같은 방법과 다르지 않다.

몇가지 그래픽 출력 함수를 소개 하겠다.

COLORREF SetPixel(hdc,nXPos,nYPos,clrref)
DWORD MoveTOEx(hdc,x,y,lpPoint);
BOOL LineTo(hdc,x,y,lpPoint);
BOOL Rectangle(hdc,nLeftRect,nTopRect,nRightRect,nBoottomRect);
BOOL Ellipse(hdc,nLeftRect,nTopRect,nRightRect,nBoottomRect);

SetPixel함수는 화면에 점을 출력 한다. 2 3번째 인자는 좌표 clrref는 색상을 지정한다.

선을 그을 때는 MoveToEx함수와 LineTo 함수를 같이 사용해야한다.

MoveToEx함수로 시각점을 찍는다.

LineTo함수로 끝점까지 선을 긋는다.

Rectangle은 사각형을 그리는데. 전 예제의 사각형을 이용해 문장을 출력하는데... 그것과 같은 이치다.

Ellipse도 Rectangle과 같다 단지 원을 그릴뿐.







#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_Inst;

LPCTSTR lpszClass=TEXT("GFP GraphOut");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_Inst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

 ShowWindow(hWnd,nShowCmd);

 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }

 return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;

 switch(iMessage){
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  SetPixel(hdc,10,10,RGB(255,0,0)); //10 10좌표에 붉은점 찍는다
  MoveToEx(hdc,50,50,NULL); //좌표를 50 50으로 이동
  LineTo(hdc,300,90); //현 자표에서 (50 50) 300 90까지 선을 그어라
  Rectangle(hdc,50,100,200,180); //50 100좌표를 기준점으로 200 180을 끝점으로 하는 사각형을 그린다
  Ellipse(hdc,200,100,400,200); //위와 같다 하지만 원을 그릴뿐

  EndPaint(hWnd,&ps);
  return 0;
 }

 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}

결과는 다음과 같습니다. 빨간점은 잘

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

WinApi input WM_CHAR  (0) 2010.07.17
WinApi MessageBox  (0) 2010.07.17
WinApi DrawText  (0) 2010.07.15
WinApi DC 예제  (0) 2010.07.15
WinApi 예제1의 확장  (0) 2010.07.15
posted by nsakura 2010. 7. 15. 21:56

TextOut은 한줄만 출력하므로 기능이 너무 단순하다. 이보다 조금 더 복잡한(+기능) 문자열 출력 함수로 DrawText 함수가 있다.

int DrawText(HDC hDC, LPCTSTR lpString, int nCount,LPRECT lpRect, UINT uFormat);

이 함수는 사각형 영역을 정의하여 영역 안에 문자열을 출력할수 있고 여러 가지 포맷을 설정하는 기능이 있다. 윈도우즈에서 사각영역을

정의할 때는 다음과 같이 정의된 RECT 구조체를 사용한다.

typedef struct _RECT{
 LONG left;
 LONG top;
 LONG right;
 LONG bottom;
}RECT;

각 인자 설명은 그림으로 보는게 더 빠를것 이다.

단 직사각형만 표현할수 있다.

이제 함수 인자에 대해 설명하겠다.

첫번째 인자는 HDC이다.

두번째 인자가 출력할 문자열

세 번째 인수는 출력할 문자열의 길이이며 이 값이 -1이면 널 종료 문자로 간주

ps:TextOut와 달리 널 종료 문자열을 인식하므로 문자열 상수를 곧바로 출력 할 수 있다. 다섯번째 인수 uFormat은 DrawText 함수가

문자열을 출력할 방법을 지정하는 플래그 아래표는 그 플래그표 이다.

 DT_LEFT  수평 왼쪽 정렬
 DT_RIGHT  수평 오른쪽 정렬
 DT_CENTER  수평 중앙 정렬
 DT_BOTTOM  사각영역의 바닥에 무나열 출력
 DT_VCENTER  사각영역의 수직 중앙에 문자열 출력
 DT_WORDBREAK  사각영역의 오른쪽 끝에서 자동 개행되도록 한다.
 DT_SINGLELINE  한 줄로 출력한다.
 DT_NOCLIP  사각영역의 경계를 벗어나도 문자열을 자르지 않고 그대로 출력한다.




#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_Inst;

LPCTSTR lpzClass=TEXT("GFP DrawText");

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
 RECT rt={100,100,400,300};

 TCHAR *str=TEXT("팡야도 잘안되고... 날씨는 덥고.. 냉면은 먹고 싶고.."
  "돈은 없고... 배는 부르고"
  "우어엉어 비가 내렸으면.... 장마는 빠이빠이.");

 switch(iMessage){
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  DrawText(hdc,str,-1,&rt,DT_CENTER|DT_WORDBREAK);
  EndPaint(hWnd,&ps);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}


int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_Inst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpzClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpzClass,lpzClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

 ShowWindow(hWnd,nShowCmd);

 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;

}


결과는 이렇습니다.

사각영역을 100,100을 기준점으로  가로 세로 400 300끝점으로 하는 영역  -1(문장의 끝을 만날때) 까지 str을 출력  중앙 정렬 및 자동 개행

플래그 사용.

TextOut을 이용해서 여러줄 써도 되지만 그것보다는 DrewText를 이용하면 한줄에 해결!

뭐 그런겁니다..

그런데 TextOut을 더 많이 사용한다!

 책에 재미있는게 있어서 적어둔다.
 
  위 코드에서 str 문자열에 아주 긴 문자열을 초기화하기 위해 연속된 문자열을 여러행에 걸쳐 썼다. 이런 초기화가 가능한 이유는 C가 인접한 문자열 상수를 하나로 합치기 때문이다 행 끛에 행 계속 문자인\를 두고 다음 줄 첫 열에 문자열을 계속 적는 방법도 있지만 이방법이 더 깔끔 하다 C를  좀 한다는 사람도 이런 초기화 방법은 잘 모르는 경우는 많은데 알아두면 무척 편리하다.

라고 한다.

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

WinApi MessageBox  (0) 2010.07.17
WinApi 여러가지 출력  (0) 2010.07.16
WinApi DC 예제  (0) 2010.07.15
WinApi 예제1의 확장  (0) 2010.07.15
WinApi 예제 1  (1) 2010.07.15