박하의 나날

1,2일차 기본

프로그래밍/WIN32 API

2015.03.12. 15:51

 

#include <windows.h>
#include <tchar.h>
/*

<windows.h> : API 함수들의 원형과 사용하는 상수들이 정의되어 있음.

<tcahr.h> : 유니코드 기반의 코드 작성을 위한 헤더.

 

<Unicode>
wchar: Unicode
2byte:16bit
ex)TCHAR *szString  = L"ABC"

char: ASCIIcode
1byte:8bit
ex) char *szString  = "ABC"
*/

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//LRESULT = long: OS에게 보고용자료

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR strCmdLine, int nShowCmd)

//

 WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR strCmdLine, int nShowCmd )

프로그램(인스턴스) 핸들 / 이전 프로그램(인스턴스) 핸들 / 파일 경로?   / 윈도우 출력 방법(숨긴다, 최소화, 활성화 ...)

/*

윈도우 클래스 객체 하나 생성 

만들려 하는 윈도우 속성을 설정(멤버에 값을 대입함으로써)

이렇게 만든 클래스 이름을 “MyWindow”로 저장

윈도우 클래스 등록(register).

저장한 클래스를 이용해 윈도우 생성.

생성한 윈도우를 디스플레이에 띄움.

사용자 혹은 시스템으로부터 들어오는 메시지를 불러들여 WndProc으로 전달.

WM_QUIT 메시지가 들어오면 while문을 빠져나오고 메인 함수 종료.

WINAPI WinMain: Windows 실행방식
HINSTANCE hInstance: 프로그램 번호
*/

{
 WNDCLASSEX wcex;
 // 윈도우정보구조체
 memset(&wcex, 0, sizeof(wcex));

 wcex.cbSize    = sizeof(wcex);
 //윈도우구조체크기
 wcex.style    = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
 // 윈도우 스타일
 wcex.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
 //클라이언트 배경색
 wcex.hCursor   = LoadCursor(NULL, IDC_ARROW);
 //커서모양
 wcex.hIcon    = LoadIcon(NULL, IDI_APPLICATION);
 //아이콘모양
 wcex.hInstance   = hInstance;
 //프로그램번호
 wcex.cbClsExtra   = 0;
 wcex.cbWndExtra   = 0;
 /*
  wcex.cbClsExtra   = 0;
  wcex.cbWndExtra   = 0;
 
 →윈도우즈 예역영역
 */
 wcex.hIconSm   = NULL;
 //작은아이콘
 wcex.lpszMenuName  = NULL;
 //메뉴. 리소스에디터로 제작
 wcex.lpfnWndProc  = WndProc;
 //메시지처리함수
 wcex.lpszClassName   = L"MyWindow";
 // 위 설정의 윈도우 클래스 이름
 RegisterClassEx(&wcex);
 //윈도우에 등록

 HWND hWnd = CreateWindow(L"MyWindow", L"MyWindow", WS_OVERLAPPEDWINDOW,
  /*

HWND CreateWindow( lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam)

클래스 이름 / 타이틀 바 문자열 / 윈도우 스타일 / x, y 좌표, 너비, 높이 / 부모 윈도우 핸들 / 메뉴 핸들 / 프로그램 핸들/ 파라미터?  

 

  CreateWindow 윈도우 생성함수
  L"MyWindow" 첫번째는 생성하고자하는 클래스
  L"MyWindow" 두번째는 윈도우캡션
  WS_ 윈도우형태
  */
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
 /*  CW_USEDEFAULT, CW_USEDEFAULT: 윈도우 x, y 위치   
  CW_USEDEFAULT, CW_USEDEFAULT: 윈도우 width, height (길이)
  NULL: 부모윈도우
  NULL: 윈도우의 MENU ID값
  hInstance: 프로그램번호와 윈도우 연결
  NULL: 특수목적
 */
 if(hWnd == NULL) 
 {
  MessageBox(NULL, L"윈도우생성실패", L"에러", MB_ICONERROR | MB_OK);

//상자를 소유할 윈도우의 핸들(owner) / 출력할 문자열 / 타이틀 바 문자열 / 버튼 종류
  return -1;
 }
 ShowWindow(hWnd, SW_SHOW);

/*

BOOL ShowWindow( hWnd , nCmdShow )

위에서 만든 윈도우의 핸들 / 윈도우 출력 방법

*/

 MSG msg;
 memset(&msg, 0, sizeof(msg));
 while(GetMessage(&msg, NULL, 0, 0))
  /*(메시지 구조체 포인터, 메시지 얻어올 장소, 메시지 최소값, 메시지 최대값)

(메시지 구조체 변수의 주소 / 대상 윈도우의 핸들* / 최소(범위) / 최대(범위) )

*대상 윈도우의 핸들값이 NULL이면 현재 메시지를 호출한 윈도우와 관련된 메시지를 보게 됨.

*대상 윈도우가 존재한다면 대상 윈도우와 그 자식 윈도우 관련 메시지를 보게 됨.
*/

 

{​

 

 

TranslateMessage(&msg);
//키값 조사
DispatchMessage(&msg);
//메시지 처리

 

 

return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/*
hWnd: 누가  핸들, void pointer
uMsg: 메시지 제목 
wParam: 내용1  
lParam: 내용2
*/
{
 switch(uMsg)
  //조사
 {
 case WM_DESTROY :
  // 윈도우창이 파괴된 메시지
  {
   PostQuitMessage(0);
   // WM_QUIT발생
   break;
  }
 }
 return DefWindowProc(hWnd, uMsg, wParam, lParam);
 //윈도우보고용
}

'프로그래밍 > WIN32 API' 카테고리의 다른 글

마우스좌표 나타내기  (0) 2017.04.06
Basic  (0) 2017.04.06
Pen, Brush  (0) 2017.04.06
Text Out  (0) 2017.04.06