본문 바로가기
C & C++/C & C++

[API] 화면 출력 API

by izen8 2011. 4. 25.

GDI의 개요

윈도우의 클라이언트 영역에 무엇인가를 그리기 위해서는 윈도우의 그래픽 장치 인터페이스 함수(GDI)를 사용해야 합니다.

예를 들면 TextOut(hdc, x좌표, y좌표, 출력 할 텍스트, 출력할 길이) 입니다.

이 때 첫 번째 인자로 DC 핸들을 필요로 합니다.

DC(Device Context)란 출력에 필요한 모든 정보를 가지는 데이터 구조체이며 GDI 모듈에 의해 관리됩니다.

DC에는 그래픽 속성을 저장하고 있습니다.

이들 속성은 GDI 함수의 동작과 관련된 사항을 정의합니다.

출력될 내용의 색상이나 배경 색상, 좌표 등을 저장하고 있다가 이를 바탕으로 화면에 출력되게 해줍니다.

윈도우용 프로그램이 화면에 무엇인가를 출력하려면 DC를 얻어야 합니다.

DC 핸들을 윈도우로부터 얻어올 때 윈도우는 이 DC를 기본값으로 채워줍니다.

DC는 윈도우의 자원이므로 사용이 끝나면 반드시 해제해야 합니다.

윈도우에는 사용할 수 있는 그래픽 자원이 한정적이므로 해제하지 않는다면 이 그래픽 자원을 더 이상 할당할 수 없어서 화면에 출력하는 것을 더 이상 하지 못하게 될 것입니다.

이 자원의 사용량을 알고 싶다면 CTRL + ALT + DELETE를 눌러서 작업관리자를 호출한 후 [보기] – [열 선택] – GDI 개체를 선택하면 됩니다.

 

 

 

DC를 얻는 방법

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

DC를 얻는 첫 번째 방법은 WM_PAINT 메시지를 처리할 때 사용할 수 있습니다.

WM_PAINT 메시지 처리 루틴에서는 BeginPaint 함수로 얻으며 핸들을 해제할 때는 EndPaint 함수를 사용합니다.

BeginPaint WM_PAINT 메시지 내에서 그림 그리기 준비를 하는 전문적인 함수입니다.

HDC hdc;

//HDC: unsigned in

hdc = BeginPaint (hwnd, &ps) ;

EndPaint (hwnd, &ps);

 

BeginPaint 함수는 윈도우 핸들 외에도 페인트 정보 구조체를 인수로 요구하며 이 구조체는 그림 그리기에 필요한 정보를 저장합니다.

WndProc 선두에서 PAINTSTRUCT형의 구조체를 지역 변수로 선언하고 BeginPaint 함수를 호출한 후 그 리턴 값을 hdc라는 변수에 대입받아 GDI 함수에 사용하고 EndPaint로 그리기를 종료하면 됩니다.

 

두 번째 방법은 GetDC함수를 사용하여 DC를 얻고 사용 후 ReleaseDC로 해제해 주는 것입니다.

HDC hdc;

hdc = GetDC (hwnd);

ReleaseDC (hwnd, hdc);

 

DC는 주로 하나의 윈도우와 연관되는 출력정보를 가지게 됩니다.

그래서 인수로 어떤 윈도우에 대한 DC가 필요한가를 밝혀주어야 합니다.

GetDC hwnd가 가리키는 윈도우의 클라이언트 영역에 해당하는 DC를 만들어 줍니다.

따라서 GetDC로 생성된 DC로는 클라이언트 영역에만 그래픽을 출력할 수 있습니다.

만일 윈도우 전체에 그래픽을 출력하고자 한다면 GetWIndowDC를 이용해서 DC를 생성해야만 합니다.

이 때는 WM_NCPAINT 메시지도 같이 처리해 주어야 합니다.


GetDC를 활용한 문자열 출력

마우스 왼쪽 버튼이 눌러질 때 문자열을 출력하기 위하여 WM_LBUTTONDOWN 메시지를 WndProc 에서 메시지를 처리해 주면 됩니다.

1. [파일] – [새로 만들기] – [프로젝트] 메뉴 항목을 사용하여 기본 창이 있는 Win32 Application 프로젝트를 생성합니다.

2. 굵은 문자로 표시한 부분을 수정합니다.

#include <windows.h>

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

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

                    PSTR szCmdLine, int iCmdShow)

{

     TCHAR szAppName[] = TEXT ("DC Test") ;

     HWND         hwnd ;

     MSG          msg ;

     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;

     wndclass.lpfnWndProc   = WndProc ;

     wndclass.cbClsExtra    = 0 ;

     wndclass.cbWndExtra    = 0 ;

     wndclass.hInstance     = hInstance ;

     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;

     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;

     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

     wndclass.lpszMenuName  = NULL ;

     wndclass.lpszClassName = szAppName ;

 

     if (!RegisterClass (&wndclass)) 

     {

          MessageBox (NULL, TEXT ("This program requires Windows NT!"),

                      szAppName, MB_ICONERROR) ;

          return 0 ;

     }

     hwnd = CreateWindow (szAppName, TEXT ("DC Test No1"),

                          WS_OVERLAPPEDWINDOW,

                          CW_USEDEFAULT, CW_USEDEFAULT,

                          CW_USEDEFAULT, CW_USEDEFAULT,

                          NULL, NULL, hInstance, NULL) ;

 

     ShowWindow (hwnd, iCmdShow) ;

     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))

          {

          TranslateMessage (&msg) ;

          DispatchMessage (&msg) ;

          }

     return (int)(msg.wParam) ;

     }

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    HDC hdc;

        switch(message)

        {

        case WM_DESTROY:

               PostQuitMessage(0);

               return 0;

        case WM_LBUTTONDOWN:

             hdc=GetDC(hwnd);

             TextOut(hdc,100,100,TEXT("DC Test"),7);

             ReleaseDC(hwnd, hdc);

             return 0;

        }

     return DefWindowProc (hwnd, message, wParam, lParam) ;

}

WndProc WM_LBUTTONDOWN 메시지를 처리하는 코드가 추가되었는데 처리해야 할 메시지가 추가될 때마다 switch문의 case만 늘려주면 됩니다.

문자열을 출력하기 전에 GetDC 함수로 DC를 얻고 TextOut 함수로 문자열을 출력한 후 ReleaseDC 함수로 DC를 해제합니다.


위의 예제에서

case WM_LBUTTONDOWN:

             hdc=GetDC(hwnd);

             TextOut(hdc,100,100,TEXT("DC Test"),7);

             ReleaseDC(hwnd, hdc);

             return 0;

이 부분을 아래와 같이 수정합니다.

 

        case WM_LBUTTONDOWN:

               hdc=GetWindowDC(hwnd);

               TextOut(hdc,0,0,TEXT("DC Test"),7);

               ReleaseDC(hwnd, hdc);

               return 0;

수정하면 글자는 타이틀 바에 출력될 것입니다.

 

 


WM_PAINT 메시지

위의 프로그램은 문자열이 출력된 윈도우를 다른 윈도우로 살짝 가렸다가 다시 드러나도록 하거나 윈도우의 크기를 변경시키면 출력되어 있던 문자열이 사라져 버릴 것입니다.

운영체제인 윈도우즈가 화면을 보관 및 복구해 주지 않기 때문입니다.

이러한 문제를 해결하는 방법은 윈도우가 가려졌다가 다시 그려질 때 또는 사라졌다가 다시 나타날 때 화면에 다시 출력해주면 됩니다.

이러한 작업은 WM_PAINT 메시지를 이용해서 할 수 있습니다.

WM_PAINT 메시지가 호출되는 경우

ð  윈도우를 이동하거나 가려진 윈도우가 화면에 표시될 때

ð  윈도우 크기를 조정할 때

ð  InvalidateRect() 또는 InvalidateRgn()을 호출할 때

ð  윈도우 위에 있는 대화상자나 메시지 박스를 윈도우가 제거할 때

ð  메뉴가 열리거나 닫힐 때

ð  화면에 도움말이 표시될 때

ð  마우스 커서나 아이콘을 클라이언트 영역 위에서 드래그 할 때

WM_PAINT 메시지는 앞의 예제를 수정하여 WM_LBUTTONDOWN 메시지에 있는 문자열 출력문을 WM_PAINT로 옮겨봅시다.

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

        HDC hdc;

        PAINTSTRUCT ps;

        switch(message)

        {

        case WM_DESTROY:

               PostQuitMessage(0);

               return 0;

        case WM_PAINT:

               hdc=BeginPaint(hwnd,&ps);

               TextOut(hdc,100,100,TEXT("DC Test"),7);

               EndPaint(hwnd,&ps);

               return 0;

        }

     return DefWindowProc (hwnd, message, wParam, lParam) ;

}

 

문자열 출력 문이 WM_PAINT 메시지 처리 루틴에 있으므로 여기서 출력한 문자열 출력은 지워져도 다시 복구되므로 항상 그 자리에 있는 것처럼 보이게 됩니다.

윈도우에서 화면을 보관하거나 복구하는 방법은 항상 이런 식이므로 항상 보여져야 하는 그림은 WM_PAINT 메시지에 작성해야 합니다.

WM_PAINT에 아무런 코드도 작성하지 않고 즉 DefWindowProc()에게 넘기지 않고 return 만 하면 프로그램은 문제가 발생합니다.

이 코드를 만나면 아무런 코드도 없으므로 클라이언트 영역을 어떻게 생성하는 것인지를 몰라서 프로그램은 윈도우에게 계속해서 클라이언트 영역을 어떻게 그려야 하는 지를 묻게 됩니다.

아무런 코드도 작성하지 않고 CPU 사용률을 확인하면 알 수 있습니다.

 


TextOut

TextOut 함수는 문자열을 출력하는 함수입니다.

함수의 원형은 다음과 같습니다.

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

첫 번째 인수는 당연히 DC의 핸들인 hdc입니다.

이 함수뿐만 아니라 화면에 무엇인가를 출력하는 모든 함수들의 첫 번째 인수는 항상 hdc입니다.

DC GetDC BeginPaint 함수에 의해 구해질 것입니다.

이 때 DC에는 글자 색과 배경 색이 저장되어 있는데 디폴트는 글자 색은 검정색이고 배경색은 흰색입니다.

(nXStart, nYStart)는 문자열이 출력될 좌표이며 이 때 사용하는 영역은 클라이언트 영역이며 lpszString은 출력할 문자열을 담고 있는 문자열 포인터이며 cbString이 출력할 문자열의 길이입니다.

TextOut 함수는 항상 문자열의 길이를 지정해 주어야 합니다.

글자 수를 이용해서 출력 공간을 설정하기 때문입니다.

 

문자열의 정렬 방법을 변경하는 함수는 SetTextAlign이라는 함수입니다.

UINT SetTextAlign(HDC hdc,UINT fMode);

보다시피 이 함수도 첫 번째 인수로 DC의 핸들 즉, hdc을 받아 들이고 있습니다.

.두 번째 인수 fMode가 지정하는 정렬 정보에 따라 hdc의 정렬 상태를 변경하게 되며 이후부터 hdc를 참조하여 출력되는 모든 문자열은 이 함수가 지정한 정렬 상태를 따르게 됩니다.

fMode의 값은 다음과 같으며 두 개 이상의 플래그를 OR로 연결하여 사용한다.

                        설명

TA_TOP                지정한 좌표가 상단좌표가 됩니다.

TA_BOTTOM         지정한 좌표가 하단 좌표가 됩니다.

TA_CENTER         지정한 좌표가 수평 중앙 좌표가 됩니다.

TA_LEFT              지정한 좌표가 수평 왼쪽 좌표가 됩니다.

TA_RIGHT             지정한 좌표가 수평 오른쪽 좌표가 됩니다.

TA_UPDATECP      지정한 좌표대신 CP를 사용하며 문자열 출력 후에 CP를 변경합니다.

TA_NOUPDATACP CP를 사용하지 않고 지정한 좌표를 사용하며 CP를 변경하지 않습니다.

디폴트 정렬 상태는 TA_TOP | TA_LEFT로 되어 있으며 지정한 좌표를 좌 상단으로 하여 문자열이 출력됩니다.

물론 정렬 상태를 변경하면 지정한 좌표를 문자열의 어느 지점으로 사용할 것인가를 변경할 수 있습니다.

수평 정렬 위치를 변경하는 플래그가 세 개 있고 수직 정렬 위치를 변경하는 플래그가 두 개 있습니다.

이런 정렬 옵션을 사용하면 다음과 같이 여러 개의 문자열을 중앙 정렬하여 출력할 수 있게 됩니다.

             case WM_PAINT:

               hdc=BeginPaint(hwnd,&ps);

               SetTextAlign(hdc, TA_CENTER);

               TextOut(hdc,200,60,TEXT("DC Test"),7);

               TextOut(hdc,200,80,TEXT("is"),2);

               TextOut(hdc,200,100,TEXT("API First Day"),13);

               EndPaint(hwnd,&ps);

                return 0;

TextOut 출력을 하기 전에 SetTextAlign 함수로 중앙 정렬하도록 하였습니다.

수평 좌표값을 모두 200으로 지정하였지만 이 좌표를 문자열의 중앙 좌표로 해석하도록 지정하였기 때문에 문자열이 모두 수평 위치 200을 기준으로 중앙 정렬되었습니다.

만약 이런 중앙 정렬 없이 왼쪽 정렬만 가능하다면 문자열의 길이에 따라 출력 시작 위치를 일일이 계산해야만 할 것입니다.

정렬 위치를 지정한 플래그 외에 두 개의 플래그가 더 있는데 이 플래그들은 CP(Current Position)의 사용 여부를 결정합니다.

텍스트 모드에서 다음 문자가 출력될 위치를 커서(Cursor)가 표시하듯이 그래픽 모드에서는 다음 그래픽이 출력될 위치를 CP가 가지고 있습니다.

TA_UPDATECP 플래그를 사용하면 출력 위치를 지정하는 인수를 무시하고 항상 CP의 위치에 문자열을 출력하며 출력 후에 CP를 문자열의 바로 다음 위치로 옮겨 줍니다.

         case WM_PAINT:

               hdc=BeginPaint(hwnd,&ps);

               SetTextAlign(hdc, TA_UPDATECP);

               TextOut(hdc,200,60,TEXT("One "),4);

               TextOut(hdc,200,80,TEXT("Two "),4);

               TextOut(hdc,200,100,TEXT("Three"),5);

               EndPaint(hwnd,&ps);

               return 0;

TextOut의 인수에 좌표를 지정하는 값들이 있지만 이 좌표는 사용되지 않고 무시되며 무조건 CP위치에 출력하게 되므로 이와 같이 일직선으로 세 개의 문자열이 출력됩니다.

 


현재 화면 영역의 크기 구하기

GetClientRect(HWND hWnd, LPRECT lpRect): hWnd 윈도우 핸들에 해당하는 클라이언트 영역을 매개변수에 전달

LPRECT: RECT 자료형의 포인터 변수

long 자료형의 bottom, left, right, top 4개의 멤버로 구성

화면 정 중앙에 문자열을 출력

 

HDC hdc;

        PAINTSTRUCT ps;

        TCHAR str[256] = TEXT("중앙에출력");

        RECT rt;

     switch (message)

     {

         case WM_PAINT:

               hdc=BeginPaint(hwnd,&ps);

               GetClientRect(hwnd,&rt);

               SetTextAlign(hdc,TA_CENTER);

               TextOut(hdc,rt.right/2, rt.bottom/2,str,lstrlen(str));

               EndPaint(hwnd,&ps);

               return 0;

 

     case WM_DESTROY:

          PostQuitMessage (0) ;

          return 0 ;

     }

     return DefWindowProc (hwnd, message, wParam, lParam) ;


DrawText

사각형의 영역을 지정하여 문자열을 출력할 수 있습니다.

int DrawText(HDC hDC, LPCSTR lpstring, int nCount, LPRECT plRect, UINT uFomat);

LPCSTR lpstring: 문자열

int nCount: 출력할 문자수

-1을 입력하면 컴퓨터가 자동적으로 문자열의 끝까지 출력해주게 됩니다.

LPRECT plRect: 사각형 영역

UINT uFomat

uFormat

의미

DT_LEFT

DT_RIGHT

DT_CENTER

DT_BOTTOM

DT_VCENTER

DT_WORDBREAK

DT_SINGLELINE

DT_NOCLIP

왼쪽 맞춤

오른쪽 맞춤

가운데 맞춤

아래 맞춤

중앙 맞춤

자동 줄 바꿈

한 줄로 출력

사각 영역을 벗어나도 문자열을 그대로 출력

 

사각형 영역 만들기

RECT 변수명 = {시작x좌표, 시작y좌표, x좌표, y좌표}

 

RECT x = {100, 100, 400, 400;}

char str[] = “반갑습니다 안녕하세요.”

            다시 만나서 반갑습니다.”

case WM_PAINT:
               hdc=BeginPaint(hwnd,&ps);

              DrawText( hdc,str, -1, &x, DT_CENTER | DT_WORDBREAK);

               EndPaint(hwnd,&ps);
return 0;
작도 함수
1) 하나의 픽셀에 점 그리기
COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);
X: x좌표
Y: y좌표
crColor: 색상
 
2) 픽셀의 색상 값 얻기
COLORREF GetPixel(HDC hdc, int nXPos, int nYPos);
 
3) 직선 그리기
DWORD MoveToEx(hdc, x, y, lpPoint);
선의 시작 좌표와 이전 좌표로 이전 좌표에서 x, y좌표로 현재 위치를 설정합니다.
BOOL LineTo(hdc, x, y);
현재 위치에서부터 x, y좌표까지 실제 선을 그리는 함수
 
4) 사각형 그리기
BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
핸들, 시작 x좌표, 시작 y좌표, 종료 x좌표, 종료 y좌표
 
5) 원 그리기
BOOL Ellipse(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
핸들, 시작 x좌표, 시작 y좌표, 종료 x좌표, 종료 y좌표의 사각형 내에 내접 원을 만들어 줍니다.
 
6) 다각선 그리기
Polyline(HDC hdc, CONST POINT *lppt,  int cPoints )
PolylineTo(HDC hdc, CONST POINT *lppt,  int cPoints )
 
7) 모서리가 둥근 사각형
BOOL RoundRect( HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidth, int nHeight )
 
8) 다각형 그리기
Polygon(HDC hdc, CONST POINT *lppt,  int cPoints )

9) 곡선 그리기
BOOL PolyBezier(HDC hdc, CONST POINT* lppt, DWORD cPoints);
BOOL PolyBezierTo(HDC hdc, CONST POINT* lppt, DWORD cPoints);
 
10) 호 그리기
BOOL Arc(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, 
int nBottomRect, int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2);
 
11) 타원의 일부분 그리기
BOOL Pie(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, 
int nBottomRect, int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2);
 
BOOL Chord(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, 
int nBottomRect, int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2);
 
 

예제)

HDC   hdc;

        PAINTSTRUCT  ps;

        RECT rect;

        POINT prevpos;

        POINT triline[4] = {200,200, 300,300,100,300,200,200};

POINT tblock[9] ={100,100,150,100,150,150,200,150,200,200,50,200,50,150,100,150,100,100};

 

  switch(message)

  {

  case WM_PAINT :

        hdc = BeginPaint (hwnd, &ps);

        GetClientRect(hwnd, &rect);

        Rectangle(hdc, rect.left+10, rect.top+10, rect.right-10,rect.bottom-10);

        RoundRect(hdc, rect.left+20 , rect.top+20 , rect.right-20,rect.bottom-20, 20, 20);

        Ellipse(hdc, rect.left+10, rect.top+10, rect.right-10,rect.bottom-10);

        MoveToEx(hdc, rect.left+10, rect.top+10, &prevpos);

        LineTo(hdc, rect.right-10, rect.bottom-10);

        Polyline(hdc,triline,4);

        Polygon(hdc,tblock,9);

        EndPaint(hwnd, &ps);

   return 0;


예제) 호와 타원의 일부분 그리기

HDC   hdc;

PAINTSTRUCT  ps;

switch(message)

{

case WM_PAINT:

        hdc = BeginPaint (hwnd, &ps);

        Arc(hdc,0,0,100,100,50,0,0,50);

        Pie(hdc,100,100,200,200,150,100,100,150);

        Chord(hdc,200,200,300,300,250,200,200,250);

        EndPaint(hwnd, &ps);

return 0;

 

case WM_DESTROY :

        PostQuitMessage (0);

        return 0;

}

 

예제) 곡선 그리기

HDC   hdc;

        PAINTSTRUCT  ps;

        POINT pt[4] = {200,200,300,100,300,300, 400,200};

       

  switch(message)

  {

  case WM_PAINT:

        hdc = BeginPaint (hwnd, &ps);

        PolyBezier(hdc,pt,4);

        EndPaint(hwnd, &ps);

  return 0;

 

  case WM_DESTROY :

        PostQuitMessage (0);

        return 0;

  }


메시지 박스
메시지 박스는 화면에 작은 메시지를 출력할 목적으로 윈도우를 만들어서 사용자에게 정보를 전달하는 대화상자 입니다.
int MessageBox ( HWND hWnd,        // 윈도우 핸들
  LPCTSTR lpText,     // 메시지 박스에 출력할 내용
  LPCTSTR lpCaption,  // 메시지 박스의 캡     
  UINT uType          // 메시지 박스 스타일
);
uTtpe
의미
MB_OK - 0x00000000L
MB_OKCANCEL - 0x00000001L
MB_ABORTRETRYIGNORE - 0x00000002L
MB_YESNOCANCEL - 0x00000003L
MB_YESNO - 0x00000004L
MB_RETRYCANCEL - 0x00000005L
확인
확인, 취소
중지, 재시도, 무시
, 아니오, 취소
, 아니오
재시도, 취소
 
아이콘 모양
uType OR로 연결
의미
MB_ICONHAND - 0x00000010L
MB_ICONSTOP 
MB_ICONERROR
MB_ICONQUESTION - 0x00000020L
MB_ICONEXCLAMATION - 0x00000030L
MB_ICONWARNING
MB_ICONASTERISK - 0x00000040L
MB_ICONINFORMATION 
중지
 
 
물음표
경고
 
정보
 
 

리턴값
의미
IDABORT
중지
IDCANCEL
취소
IDIGNORE
무시
IDNO
아니오
IDOK
확인
IDRETRY
재시도
IDYES

 

리턴 처리 방법
버튼이 1개인 경우
if(MessageBox(인수) == 리턴값)
{
               처리 내용
}
버튼이 2개인 경우
if(MessageBox(인수) == 리턴값)
{
               처리 내용;
}
else
{              
               처리 내용;
}
 

버튼이 3개 이상인 경우는 메시지 박스의 리턴 값을 변수에 저장한 후 처리 내용을 분기문으로 작성

HDC hdc;

        int result;

        switch(message)

        {

        case WM_DESTROY:

               PostQuitMessage(0);

               return 0;

        case WM_LBUTTONDOWN:

               hdc = GetDC(hwnd);

               result = MessageBox(hwnd,TEXT("메시지박스테스트"),TEXT("메세지박스"),MB_YESNOCANCEL);

               if (result==IDYES)

                {

                       TextOut(hdc,100,100,TEXT("예를 선택하셨습니다"),10);

               }

               else if(result == IDNO)

               {

                       TextOut(hdc,100,100,TEXT("아니오를 선택하셨습니다"),12);

               }

               else if(result == IDCANCEL)

               {

                       TextOut(hdc,100,100,TEXT("취소를 선택하셨습니다"),11);

               }

               ReleaseDC(hwnd,hdc);

               return 0;

         }

'C & C++ > C & C++' 카테고리의 다른 글

[API] 리소스 사용  (0) 2011.04.25
[API] API 메시지 처리  (0) 2011.04.25
API 란 무엇인가?  (0) 2011.04.25
메시지 훅(Message Hook)  (0) 2011.04.25
[MFC] 프로세스 간의 통신  (0) 2011.04.25

댓글