나의 브을로오그으

[C++] WinAPI32 프로그래밍 개요 본문

Game/WinAPI

[C++] WinAPI32 프로그래밍 개요

__jhp_+ 2022. 3. 1. 10:14

[Win32API 프로그래밍이란?]
: 윈도우 운영체제가 제공하는 함수를 이용한 c언어 기반의 프로그래밍

c언어는 함수를 기반으로 프로그래밍
c++언어는 클래스를 기반으로 프로그래밍

결국 윈도우 프로그래밍은 os의 함수를 가지고 자원을 사용하여 프로그래밍
과거에는 MS-DOS가 있었음. 단일 프로세스만 가능했음.

Window OS는 멀티 프로세스임.

WIN프로그래밍은 자원을 독점하고 반환하고 이를 반복하여 프로그래밍을 한다. 

[OS의 변화로 인한 프로그래밍 방식의 변화]
- 윈도우 운영체제 이전
프로그래밍이 운영체제를 제어
모든 프로그래밍을 프로그래머가 전담.
(키보드, 마우스 등을 직접 프로그래밍)
-> 메모리 상주 프로그램, BIOS

- 윈도우 운영체제 이후
: 운영체제로부터 모든 정보를 얻는다.
키보드, 마우스, 비디오카드, 프린터, 사운드 형태 등의 모든 자원을 os가 관리하며
응용 프로그램에서 사용 시 메시지 형태로 전달 받아 사용함.
사용하고 나면 반환함.

- 메시지 처리 방식이 중요하다!!!


[프로그래밍 형식의 변화]
main() -> WinMain() : 응용 프로그램 윈도우 생성(ENTRY)
		  WinProc() : 메시지 처리(PROCEDURE)

어떤 자원을 이용하겠다는 메시지가 발생하면
OS는 해당 자원을 사용할 수 있도록 윈도우 프로시저에 메시지를 보내줌.


[프로그래밍 구조 비교]
- C언어 코드
#include <stdio.h>
#include <conio.h>

int main()
{
	int nKey;

	while(1)
	{
		if (_kbhit()) // 키보드 입력이 들어왔을 떄 값을 받음.
		{
			nKey = getch(); // 버퍼에 키보드 입력이 들어오므로 버퍼에서 1바이트 반환
			printf("%c", nKey);
		}
	}

	return 0;
}


- Win32API 윈도우 프로그래밍 코드
int APIENTRY _tWinMain(HINSTANCE ...)
{
	MSG msg;
	HACCEL hAccelTable;
	...

	while(GetMessage(&msg, ...))
	{
		WndProc(hwnd, ...);
	}
	return hInstance;
}

메시지 처리는 WinProc으로 WM_CHAR메시지를 보냄.

... 200줄에 가까움.

기존 c프로그래밍과 WIN프로그래밍과의 가장 큰 차이점은
기존의 모든 실행은 os가 하며
os에게 요청하거나 전달받은 메시지를 통해 
결과만 보여줌.



[윈도우 명칭]
타이틀바
최대화, 최소화, 닫기 버튼
시스템 메뉴 (좌측 상단의 아이콘)
메뉴바 (메뉴)
클라이언트 영역


[윈도우 데이터형]
메모리 크기 = 그 안에 저장된 값의 크기를 알 수 있음.
값이 중요하다!!!!!!!!!!!!

C언어 데이터형
char, short, int, long, float, double, long double

C++ 언어 데이터형
C언어 데이터형 + BOOL

 

[데이터형|

데이터형 정의
BYTE typedef unsigned char BYTE
BOOL typedef int BOOL;(TRUE, FALSE)
CHAR typedef char CHAR
COLORREF typedef DWORD COLORREF
DWORD typedef unsigned long DWORD
PVOID typedef void* PVOID
HANDLE typedef PVOID HANDLE (중요)
HDC typedef HANDLE HDC
HGDIOBJ typedef HANDLE HGDIOBJ
HINSTANCE typedef HANDLE HINSTANCE
HWND typdef HANDLE HWND
LPVOID typedef void* LPVOID
LPWORD typdef void* LPVOID
LPSTR typedef CHAR* LPSTR
LPWSTR typedef WCHAR* LPWSTR
LPTSTR #ifdef UNICODE
typdef LPWSTR LPTSTR;
    #else
typedef LPSTR LPTSTR;
#endif

TCHAR #ifdef UNICODE
typdef WCHAR TCHAR;
    #else
typdef CHAR TCHAR;
#endif;
UINT typedef unsigned int UINT
VOID #define void VOID;
WINDAPI #define WINAPI __stdcall;
WORD typedef unsigned int WORD;
WPARAM typedef UINT_PTR WPARAM;
UINT_PTR #if defined(_WIN64)
    typdef unsigned __int64 UINT_PTR;
#else
    typedef unsigned int UINT_PTR;
#endif;
LPARAM typedef LONG_PTR LPARAM;
LONG_PTR #if defined(_WIN64)
    typedef __int64 LONG_PTR;
#else 
    typedef int LONG_PTR;
#endif;

 

윈도우에서의 데이터형은 그저 c/c++에서 사용하던 기본 자료형을
윈도우 스타일로 만들어서 사용하는 것일 뿐!!!!!


[인스턴스와 핸들] (중요도 : *****)

현대 OS는 멀티 태스킹 운영체제이다.
메모장 4개를 띄어놨다. 서로 다른 데이터를 저장했다.
이를 어떻게 구별할까?
바로 윈도우 별로 핸들값이 존재한다.

- 운영체제가 응용 프로그램을 실행 또는 구분하는 방법이 인스턴스와 핸들
HINSTANCE : 인스턴스 핸들 타입
HWND : 윈도우 핸들 타입
PVOID -> void* -> 4바이트의 양의 정수값

[인스턴스]
- 응용 프로그램 아이디 (서로 다른 응용프로그램 간 중복 x, os가 부여해줌)
- 같은 종류의 프로그램은 같은 인스턴스를 갖는다.

[핸들]
- 운영체제에서 할당한 자원의 아이디(윈도우, 펜, 브러쉬 등) (os가 부여해줌)
- 같은 종류의 인스턴스라도 핸들값은 다름.

[공통점]
1) 운영체제에서 할당하는 값
2) 중복되지 않는 값 -> 아이디의 속성

윈도우 프로그래밍할 때 가장 중요한 것
핸들 handle
HWND, HDC, HPEN, HBRUSH 등...


[헝가리언 표기법]
변수명 또는 함수명의 명명 규칙
관례적으로 사용
변수명만으로 용도 파악이 용이

[사용 방법]
- 의미 있는 단어를 연결하되 첫 문자는 대문자
(Person + Count = PersonCount)

- 데이터형을 의미하는 접두사를 붙임
(fCount, nNumber)


[변수명에 붙이는 접두사]

데이터형 접두사
BOOL, bool b bVariable
char ch, c chVariable
int, short n, i nVariable
long l lVariable
float f fVariable
double d dVariable
배열 a aVariable[10]
DWORD dw dwVariable
문자열 sz, s, str strVariable
포인터 p pVariable
핸들 h hVariable
전역변수 g_ g_nVariable(정수형인경우)
윈도우메시지 msg msgVariable