'ReleaseDC'에 해당되는 글 1건

  1. 2012.10.28 문자열, 그래픽 출력

DC(Device Context)

출력에 필요한 모든 정보를 가지는 데이터 구조체이며 GDI모듈에 의해 관리된다. 문자열의 모양을 지정하는 폰트, 선의 색상과 굵기, 채움 무늬와 색상, 그리기 모드 등등이 모두 출력에 필요한 정보들이다.

그리기 함수에서는 DC의 핸들을 넘겨받아 그리기에 필요한 추가정보는 모두 DC에 정의되어있는 값을 사용한다.

DC는 그리기 함수들이 참조하는 원점의 정보를 제공한다.

DC는 현재 상황에서 어떤 영역이 출력 허가된 영역인가를 계산하여 허가된 영역에만 출력을 내보낸다.

 

DC를 얻는방법

화면으로 출력을 하기위해서는 반드시 DC가 있어야하며 DC를 얻는 방법에는 두가지가있다.

 

1. 첫번째방법

HDC GetDC(HWND hWnd);

int ReleaseDC(HWND hWnd, HDC hDC);

GetDC함수를 사용하여 DC를 얻고 사용한후 ReleaseDC로 해제한다. GetDC는 hWnd가 가리키는 윈도우에 적당한 DC를 만들어 그 핸들을 리턴한다. GetDC에 의해 얻어진 핸들은 사용후에 반드시 ReleasDC함수로 해제애햐한다 DC도 메모리를 차지하므로 할당 후 해제 원칙이 반드시 준수되어야 한다.

 

2. 두번째방법(WM_PAINT매세지 내에서만 사용가능!)

HDC BeginPaint(HWND hwnd,LPPAINTSTRUCT lpPaint);

BOOL EndPaint(HWND hWnd,const PAINTSTRUCT *lpPaint);

DC를 얻는 두번째 방법은 WM_PAINT메세지 루틴에서만 사용할수 있다. WM_PAINT메세지 처리 루틴에서는 DC핸들을 BeginPaint함수로 얻으며 핸들을 해제할때는 EndPaint함수를 사용한다. GetDC는 DC핸들을 얻는 일반적인 방법이며 BeginPaint는 WM_PAINT메세지 내에서 그림그리기를 준비하는 좀더 전문적인 함수이되 그 외의 메세지에서는 절대로 사용할 수 없다.

BeginPaint함수는 윈도우 핸들 외에도 페인트 정보 구조체를 인수로 요구하여 이 구조체에 그림 그리기에 필요한 여러가지 복합한 정보를 리턴한다.

 

문자열 출력

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) {

        HDC hdc;

        TCHAR* str;

 

        switch(iMessage) {    

        case WM_LBUTTONDOWN:

               hdc=GetDC(hWnd);

               str=TEXT("Lueseypid");

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

               ReleaseDC(hWnd, hdc);

               return 0;

 

        case WM_DESTROY:

               PostQuitMessage(0);

               return 0;

        }

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

}

예제 : 마우스 오른쪽버튼이 눌려질때 문자열을 출력(TextOut)

WM_LBUTTONDOWN(마우스 왼족버튼 눌림)이 되면 GetDC함수로 DC를 얻어 TextOut함수로 (100, 100)좌표에 문자열을 출력하고 DC를 해제함

 

문자열을 출력하는

함수

 BOOL TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cchString);

              hdc:DC, nXStart,nYStart:출력될 xy좌표 위치, lpString:문자열, cchString:문자열의 길이

 

 

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

 

typedef struct tagRECT

{

    LONG    left;

    LONG    top;

    LONG    right;

    LONG    bottom;

} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

TextOut은 한줄만 출력하므로 기능이 단순하기떄문에 좀더 복잡하게 출력하기 위해서는 DrawText를 이용한다. 이 함수는 사각형을 정의하여 영역안에 문자열을 출력할 수 있으며 여러가지 포멧을 설정하는 기능이 있다. 윈도우즈에서 사각형 영역을 정의할때는 RECT구조체를 사용한다.

 

첫번째 인수는 DC이며 두번째 인수가 출력할 문자열, 세번째 인수는 출력할 문자열의 길이이되 -1이면 널종료 문자열로 간주한다. 네번째 인수는 RECT구조체의 주소값, 다섯번째 인수는 문자열을 출력할 방법을 지정하는 플래그이다.

 값

설명 

DT_LEFT 

 수평 왼쪽정렬한다. 

DT_RIGHT 

 수평 오른쪽 정렬한다 

DT_CENTER 

 수평 중앙 정렬한다 

DT_BOTTOM 

 사각영역의 바닥에 문자열을 출력한다 

DT_VCENTER 

 사각영역의 수직 중앙에 문자열을 출력한다 

DT_WORDBREAK 

 사격영역의 오른쪽 끝에서 자동 개행하도록한다 

DT_SINGLELINE 

 한줄로 출력한다 

DT_NOCLIP 

 사각영역의 경계를 벗어나도 문자열을 자르지않고 그대로출력한다. 

 

WM_PAINT메세지

WM_PAINT메세지는 윈도우가 최소화되거나 다른 윈도우창에 의해 가려졌다가 다시 나타날때 메시지가 전달된다.

멀티태스킹 시스템인 윈도우즈에서는 여러개의 윈도우가 겹칠 수 있으므로 한번 출력해 놓은 문자열이 언제까지고 그대로 그 자리에 있다는 보장이 없다. 다른 윈도우에 의해 가려졌다가 다시 나타나게 되면 가려졌던 윈도우의 새로 드러나 부분은 지워져있게 된다. 윈도우즈는 가려졌던 윈도우 화면을 보관 및 복구하는 책임을 지지 않으며 지워진 화면 복구하는 책임은 전적으로 프로그램 자신에게 있다.

따라서 윈도우즈 상에 출력된 객체가 지속적으로 유지하기 위해서는 WE_PAINT메세지가 호출될때 다시 그려지도록 해야한다.

case WM_PAINT//해당 윈도우의 클라이언트 영역을 다시 그려야하는경우 메시지가 전달된다. 

        str2=TEXT("Luesey");

        hdc=BeginPaint(hWnd, &ps);

        TextOut(hdc, 100, 200, str2, lstrlen(str2));

        EndPaint(hWnd, &ps);

        return 0;

 

그래픽 출력

 hdc=BeginPaint(hWnd, &ps);

SetPixel(hdc, 10, 10, RGB(255,0,0));  //점

MoveToEx(hdc, 50, 50, NULL); 

LineTo(hdc, 300, 90);                 //선 (MoveToEx를 통해 찍힌점부터 300,90 까지

Rectangle(hdc, 50, 100, 200, 180);    //사각형

Ellipse(hdc, 220, 100, 400, 200);     //원, 타원

EndPaint(hWnd, &ps);

return 0;

 

'Developer > Win32 API' 카테고리의 다른 글

기본 윈도우 출력  (0) 2012.10.28
Window API배우기전 알아야할것들  (0) 2012.10.28
Posted by No names
,