Win32 API

2013.10.01 _API 새창띄우기

성엽이 2013. 10. 1. 15:39

   API   


▶ Visual Studio 프로젝트 파일 생성 순서

: New Project - Win32 - Win32 Project - Empty File - FileName.c


API WinMain Source ( 새 창 만들기 )

#include <windows.h>


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  // 사용자와 시스템이 보내오는 메시지를 처리한다. 프로그램의 실질적인 처리를 하는 곳

HINSTANCE g_hInst;                                    


LPCTSTR lpszClass = TEXT("KKIMSSI");  // 창 제목 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)  // WinMain , API Main 함수, Entry point

{                                                                  // nCmdShow = 인자의 갯수
  HWND hWnd;    // Window Handler                                  // LPSTR 는 char * 배열 C의 main 의 2번째 인자
  MSG Message;    
  WNDCLASS WndClass;  /* 1. 윈도우 구조체 생성 ( Class ) */
  g_hInst = hInstance;  

  /* 2.1 구조체에 값을 넣어 스타일을 변화시켜준다 */
  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;
  /* 2.2 앞에 모든 Class 값을 등록시켜주는 함수 */
  RegisterClass(&WndClass);  

  /* 3. 창 만들기 */
  hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,(HMENU)NULL,hInstance,NULL);
  /* 4. 창을 화면에 출력 하는 함수 호출*/
  ShowWindow(hWnd,nCmdShow);

  /* 5. 창에서 일어나는 메세지 처리 (클릭, 닫기 등등..) */
  while(GetMessage(&Message,NULL,0,0))   // 메시지 큐 : 시스템이나 사용자로부터 발생된 메시지가 잠시 대기하는 메시지 임시 저장 영역
  {                                       // 메시지 큐에서 메시지를 읽어 들인다 

    TranslateMessage(&Message);           // 입력메시지를 가공해서 프로그램에 쉽게 사용하도록 해준다
    DispatchMessage(&Message);            // 꺼낸 메시지를 윈도우 메시지 처리함수(WndProc)로 전달한다
  }
  return (int)Message.wParam;
}

/* 마우스나 키보드를 움직이면 OS 에서 자동으로 호출 */
/* 메세지 처리는 여기서 처리된다 */

/* 여기서 코드가 핵심 */
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  switch(iMessage)
  {
  case WM_DESTROY:
    PostQuitMessage(0);  // 창닫기 가능
    return 0;
  case WM_LBUTTONDOWN:  // 클릭 시 Beep
    MessageBeep(0);
    return 0;

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


   실행순서  


실행결과



 TextOut.c

#include <windows.h>

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

LPCTSTR lpszClass = TEXT("KKIMSSI");  // 창 제목 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)  // WinMain , API Main 함수
{                                                    // nCmdShow = 인자의 갯수
  HWND hWnd;    // Window Handler                                  // LPSTR 는 char * 배열 C의 main 의 2번째 인자
  MSG Message;    
  WNDCLASS WndClass;  /* 1. 윈도우 구조체 생성 ( Class ) */
  g_hInst = hInstance;  

  /* 2.1 구조체에 값을 넣어 스타일을 변화시켜준다 */
  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;
  /* 2.2 앞에 모든 Class 값을 등록시켜주는 함수 */
  RegisterClass(&WndClass);  

  /* 3. 창 만들기 */
  hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,(HMENU)NULL,hInstance,NULL);
  /* 4. 창을 화면에 출력 하는 함수 */
  ShowWindow(hWnd,nCmdShow);

  /* 5. 창에서 일어나는 메세지 처리 (클릭, 닫기 등등..) */
  while(GetMessage(&Message,NULL,0,0))
  {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }
  return (int)Message.wParam;
}

/* 마우스나 키보드를 움직이면 OS 에서 자동으로 호출 */
/* 메세지 처리는 여기서 처리된다 */
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_LBUTTONDOWN:
    //  hdc = GetDC(hWnd);                  /* 창의 그리기 정보를 가져온다, Device Context */ /* 인자 hWnd 는 현재 창의 정보 */
    //  TextOut(hdc,100,100,TEXT("Beautiful Korea"),15);  /* 그리기 정보 TextOut(hdc, x=100, y=100, 문자열, 문자열 갯수) */ 
                                                          /* 한글도 한 글자로 인식 */
    //  ReleaseDC(hWnd,hdc);                /* 사용했던 GetDC 를 ReleaseDC 로 다시 반환해준다 */
    //  return 0;
    case WM_PAINT:                      /* 작업영역의 일부가 지워져도 빠르게 다시 복구시킴 */
      hdc = BeginPaint(hWnd,&ps);              /* 호출이 많이 될 확률이 높으므로 BeginPaint 를 사용 */
      TextOut(hdc,100,100,TEXT("Beatiful Korea"),15);    /* WM_PAINT 안에서만 BeginPaint 사용 */
      EndPaint(hWnd,&ps);                  /* BeginPaint - EndPaint */
      return 0;
  }
  return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}



실행결과



▶ 사라지지 않아!!