본문 바로가기

부장님의 이야기

[Windows API] 윈도우 프로그래밍 개요

하고싶진 않지만 2학기에 이걸 배운다니

어쩔 수 없이 시작하는 공부!

 

 

1. 윈도우 프로그래밍의 개요

마이크로소프트 윈도우 운영 체제들이 사용하는 API이다. C/C++ 에서 직접 운영 체제와 상호 작용할 수 있도록 만들어졌다.

Windows API(Win32 API)는 윈도우 앱의 기본 플랫폼이다. *API를 통해 시스템 기능 및 하드웨어에 직접 접근해야하는 데스크톱 앱에 가장 적합하다.  API에서 제공하는 기능은 화면 제어, 그래픽 출력, 통신, 프로세스관리, 오디오 처리, 보안 등이 있다. 

 

*API : 운영체제가 프로그램을 위해 제공하는 함수 집합

 

윈도우 프로그램의 특징

  • GUI 기반 : 메뉴, 툴바, 다양한 컨트롤을 통해 사용자에게 편의성을 제공

  • 이벤트 기반 : GUI를 통해 이벤트를 발생시키면 운영체제에서 감지 후, 메시지를 보낸 뒤 그에 따른 반응을 한다.

  • 멀티스레드 기반 : 여러가지 작업을 동시에 처리하고, 이 작업은 메모리, CPU, 디스크 등을 공유한다.

 

 

 

 

 

 

 

 

 

2. Visual Studio 2017 프로젝트 생성

Visual Studio 2017이 설치되어 있다는 가정하에 진행한다.

 

1. 파일 - 새로 만들기 - 프로젝트

 

 

2.  Visual C++ - Windows 데스크톱 - Windows 데스크톱 마법사 - 이름/위치 설정 - 확인

 

 

 

 

3.  데스크톱 애플리케이션(.exe) - 빈 프로젝트 체크 - 확인

 

 

4. 스무스하게 새 항목 추가

 

 

5. 날카로우면서도 부드럽게 소스파일 추가

 

 

6. 예제코드 복사 붙여넣기 후 빌드

#include <windows.h>
#include <TCHAR.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
	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 = _T("Window Class Name");
	RegisterClass(&WndClass);
	hwnd = CreateWindow(_T("Window Class Name"),
		_T("Window Title Name"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL
	);
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
	switch (iMsg)
	{
	case WM_CREATE:
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

 

 

 

 

7. 아래의 창이 뜬다. (성공)

 

 

 

 

 

 

 

 

 

3. Window API의 구조

각 프로그램의 구조

콘솔기반 C 프로그램은 main함수를 기본으로 하고, 필요에 따라 다른 함수들을 추가해 사용한다. 이에 비해 윈도우 프로그램은 크게 메인 부분과 메시지 처리 부분으로 나뉘게 된다.

 

 

동작과정

좌측의 사진은 윈도우 프로그램의 동작 과정을 나타낸 것이다.

 

<메인부분의 역할>

윈도우를 만들고, 화면에 띄우고, 모든 메시지를 전송한다. 이벤트가 발생하게 되면 윈도우 커널이 신호를 보내게 되는데 메인은 이 신호를 하니씩 메시지 처리 부분으로 보낸다.

 

<메시지 처리 부분의 역할>

메시지를 받고 메시지에 약속된 반응을 나타낸다. 메인에서 받은 메시지는 메시지 큐에 차례로 저장 후 처리한다.

 

<메시지의 종류>

마우스 움직임, 버튼 클릭, 키보드 눌림, 컨트롤 메시지, 메뉴 발생 메시지 등이 있다.

 

 

 

 

 

 

 

 

3.  함수 구성

/* 메인 부분 */
int WINAPI WinMain (...) {
	윈도우 생성
    	윈도우 전송
}

/* 메시지 처리 부분 */
LRESULT CALLBACK WndProc(...) {
    메시지에 따른 반응
}

메인부분

WinMain()

  • 윈도우 프로그램의 메인함수

  • 프로그램의 정상/비정상 종료를 정수값으로 반환한다.

WINAPI

  • 콘솔 응용 프로그램이 아닌 Win32 API를 이용하는 윈도우 응용프로그램임을 명시함

 

 

메시지처리부분

WndProc()

  • 함수 이름은 WinMain()에서 윈도우 클래스 등록 시 같이 등록 되어야한다.

CALLBACK

  • *콜백함수 임을 명시한다.

*콜백함수 : 특정 시점에 호출되는 함수

 

LRESULT

  • 32비트의 값을 반환 함을 알린다.

 

 

 

 


 

다음 글에서는 WinMain과 윈도우 클래스에 대하여 알아볼 거시다.

그런 거시다