작은 고양이의 캣 타워

2주차:: 윈도우 프로그램의 기초 설계

by J4BEZ

주의사항

[아직 미작성 된 글이며, 작성이 완료된 이후 과제 제출 완료 이후까지 비공개 될 게시글 입니다]

+SDK: Standard Development Kit

- 윈도우용 응용 프로그램 개발도구를 의미.

- 컴파일러, 표준 라이브러리(API) 등을 포함.

- 그래픽 처리, 데이터베이스 접근, 동적 링크 처리 등 여러가지를 할 수 있는 도구 모음.

 

+API: Application Programming Interface

- 운영체제의 제공함수 호출방법

 

+윈도우 프로그램의 특징

- GUI(Graphic User Interface)기반 -> [Java의 Swing이나 Java FX와 같이]

- Multi-tasking: 동시에 여러 작업을 수행함.

- Multi-threading: 메모리, CPU, 디스크 등 자원의 공동이용.

- 메시지 기반(각종 이벤트[ex. '마우스 왼쪽 버튼 클릭']를 메시지['WM_LBUTTONDOWN']으로 변환하여 전달.

- 장치 독립적인 인터페이스

 

+용어 정리

- 자원(Resource): 메뉴, 다이얼로그 등의 WinApi에서 기본적으로 이미 제공된 기본 설정들

- 메시지 큐(Message Queue): 프로그램에 전달되는 메시지가 저장되는 곳

- 핸들(HANDLE): 여러개의 윈도우나 커서등의 '객체'들을 구별하기 위한 ID or 번호 or 주소

ㄴ> HANDLE을 통해서 해당 객체로 연결가능

- 디바이스 컨텍스트(DC: Device Context): 그래픽과 관련한 정보를 모아 놓은 구조체(structure)

- 그래픽 장치 인터페이스(GDI: Graphic Device Interface): 선 그리기, 색깔 처리 등 그래픽을 다루기 위한 함수들의 모음.

 

 

+윈도우 프로그램의 구조

1. '메인 부분' : 윈도우의 초기 생성 및 출력하며 발생한 이벤트를 메시지로 변환하여 처리부분에 전달하는 부분.

-i)메인 부분을 담당하는 WinMain()의 형식

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   LPSTR lpszCmdParam, int iCmdShow){
	
    //WinMain()의 처리내용
    //1. Window Class 설정 & 초기화
    //2. Window Class 등록단계
    //3. Window 창 생성
    //4. Window 활성화
    //5. 메시지 루프처리
}

-> WINAPI : 피호출자가 스택 메모리를 청소하는 특별한 호출 규칙을 지정하는 마이크로소프트 특유의 키워드인

'__stdcall'에 대해 평가하는 매크로로써, 함수의 호출자가 피호출자 간의 스택의 손상을 피하기 위하여 호출 규약에

동의해야 하기에 호출 하는 매크로 입니다.('WINAPI' 대신 'APIENTRY'라고 기입해도 프로그램이 실행됩니다.)[참고링크]

-> hInstance : 운영체제의 커널이 부여한 프로그램 인스턴스 핸들을 의미한다.

-> hPrevInstance : 이전 실행시킨 같은 프로그램의 인스턴스 핸들을 의미 (이전에 실행한 것이 없으면 null 값이 배치된다.)

 

-> lpszCmdParam : 명령행으로 전달된 프로그램 인수 [참고 링크]

ㄴ> 윈도우즈용 프로그램은 오직 하나의 문자열 인수만을 받아들일 수 있습니다. 

     대부분 NULL값이지만, 사용자가 인수를 전달하면 운영체제는 lpszCmdParam으로 인수를 넘겨주죠.

     실행파일 뒤에 붙이는 인자들이 lpszCmdParam으로 들어오게되며, 이 lpszCmdParam으로 들어온 값을 어떻게

     활용할지는 개발자의 필요에 따라 달라져요. 단순한 문자열을 전달하는 것이니 마음대로 가공해서 사용할 수 있죠.

//콘솔창에서 다음과 같이 사용할 수 있어요
'실행될프로그램이름' "여기에 작성되는 명령어 문장이 lpszCmdParam에 저장되죠"
cat.exe meowmeow
//위와 같은 경우엔 cat.exe라는 윈도우 실행파일에 "meowmeow"이 lpszCmdParam에 저장되게 됩니다.

-> nCmdShow : 프로그램의 윈도우가 처음 실행될 때 어떻게 보여졌으면 하는가를 지정하는 공간이예요.

평범하게 일반 모양으로 실행될지 혹은 최대화된 상태나 최소화된 상태로 실행될 것인가를 지정합니다.

보통 nCmdShow 의 값은 'SW_SHOWNORMAL'로 지정되며 그냥 무시해도 되지만,

사용자의 의도가 최대화('SW_SHOWMAXIMIZED')로 혹은 최소화('SW_SHOWMINIMIZED')로 실행되길 원한다면 그에따라 바꾸어주면 되겠죠

 

-ii) WinMain()의 처리 내용

>>1. 윈도우 클래스의 설정& 초기화

? 윈도우 클래스란?

: 생성하는 윈도우의 형태를 정의하기 위해 사용하는 구조체를 말해요.

구조체의 종류는 크게 두종류로 tagWNDCLASSA와 tagWNDCLASSW로 나뉘는데 내용 상 차이는 없고

WNDCLASS의 이름으로 설정할 때 UNICODE가 정의된 상태이면 tagWNDCLASSW로 typedef(타입재정의)하고,

정의된 상태가 아니라면 tagWNDCLASSA로 typedef되요. 구조는 동일하니 tagWNDCLASSA를 자세히 살펴보기로 해용

typedef struct tagWNDCLASSA {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
} WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;

typedef struct tagWNDCLASSw{...}...;

#ifdef UNICODE
typedef WNDCLASSW WNDCLASS;
typedef PWNDCLASSW PWNDCLASS;
typedef NPWNDCLASSW NPWNDCLASS;
typedef LPWNDCLASSW LPWNDCLASS;
#else
typedef WNDCLASSA WNDCLASS;
typedef PWNDCLASSA PWNDCLASS;
typedef NPWNDCLASSA NPWNDCLASS;
typedef LPWNDCLASSA LPWNDCLASS;

 

2. '메시지 처리 부분' : 메인 부분에서 전달되는 메시지를 받고 처리하며 반응하는 부분. (Java Swing의 EventListener)

LRESULT CALLBACK WndProc(.....){
	//메시지에 따른 반응
}

 

[...복습 게시글 작성중입니다 ...]

 

 

 

+ 2주차 과제 용어 해설 [09. 23 . 23: 57 이후 아래의 내역은 수정 없습니다]

17122266 박주훈

C++ 처음해서 잘 몰라요 ㅠㅠ 오류가 있는 내용은 빠른 피드백 부탁드립니다 >A<

[추가적인 설명은 제출 완료 이후 기입 됩니다.]

 

-> 가상 함수(Virtual Function)

- virtual 키워드로 선언된 함수에요.

- 같은 클래스를 상속 받게된 서로 다른 두 클래스에서 같은 이름의 다른 기능의 함수를 이용하기 위해 

컴파일 시간에 이 친구는 잠시 남겨두고 런타임시 동적으로 이 함수 친구가 어떤 의미를 갖는지 매칭 하기 위해

사용하는 것이 가상 함수에요. (Polymorphism과 Dynamic Binding)

> 예시

class Animal{
public:
	virtual void speak(string str){
     	cout << str;
    }
}

class Cat : public Animal{
	virtual void speak(String meow){
    	cout << meow;
    }
}

class Dog : public Animal{
	virtual void speak(string bark){
    	cout << bark;
    }
}
//이름은 모두 speak(str)으로 같은 함수지만 서로 다른 함수예요.
//만약 virtual keyword를 이용 안했다면, 3 함수 모두 str을 출력했을거예요.

 

 

-> 순수 가상함수(Pure Virtual Function)

- 함수의 정의 없이 선언만 되어 있는 가상 함수를 말해요.

- 상속을 받은 클래스에서 겉 모습만 정의된 가상 함수를 호출하여 다시 제대로 작성해줘야해요.

- 순수 가상함수는 함수 선언 뒤에 '=0'을 붙여줘야해요.

- implements로 상속 받는 자바의 Interface와 비슷합니다.

> 예시

virtual void CatMeow() = 0;//이처럼 함수의 뼈대만 잡아주
//'=0'으로 초기화 해주는 가상 함수를 순수 가상 함수라 해요.
//상속받는 클래스에서 반드시 함수의 내용을 작성해주어야합니다.

 

-> 추상 클래스(Abstract Class):

- 순수 가상함수가 단 한개라도 포함된 클래스를 말해요.

- 함수의 몸체가 없기 때문에 객체를 생성할 수 없어요:C.

 

-> Delta Time

시간 차이를 구현하는 logic으로 1프레임 (60분의 1초)씩 증진되는 시간의 흐름을 구현해요.

//ex
double t = 0.0;
double deltaTime = 1.0/60.0;

while(/*시간의 흐름에 따른 조건문*/){
	t += dt;
    //어떠한 코드들
}

 

-> 컨테이너(Container)

- 같은 타입의 여러 객체를 저장하는 일종의 집합이라 할 수 있습니다.

- 클래스 템플릿으로, 컨테이너 변수를 선언할 때 컨테이너에 포함할 요소의 타입을 지정할 수 있어요.

- 요소의 추가 및 제거를 포함한 다양한 작업을 도와주는 여러 멤버 함수를 포함하고 있어요

- 크게 3가지로 분류 되요 : 시퀀스 컨테이너 / 연관 컨테이너 / 컨테이너 어댑터

 

->맵 자료구조 <Map>

- 컨테이너의 종류 중 연관 컨테이너에 해당하는 컨테이너로 <키, 값>의 쌍으로 데이터를 관리하는 연관 컨테이너에요.

- 정렬된 위치에 요소를 삽입하므로 검색 속도가 매우 빨라요.

- 키의 중복을 허가 하지 않고, 하나의 키에는 하나의 값만이 연결될 수 있어요. (multimap 은 값의 중복을 허용해요)

 

 

-> 반복자(iterator)

- 컨테이너에 저장된 요소를 반복적으로 순회하여,각각의 요소에 대한 접근을 제공하는 객체에요.

- 컨테이너의 구조나 요소의 타입과는 상관없이 컨테이너에 저장된 데이터를 순회하는 과정을 일반화한 표현이죠.

- 반복자가 가져야할 요구사항과 정의되어야 할 연산자는 다음과 같아요.

  1. 가리키는 요소의 값에 접근할 수 있어야 합니다. 따라서 참조 연산자(*)가 정의되어야 합니다.

  2. 반복자 사이의 대입 연산, 비교 연산이 가능해야 합니다. 따라서 대입, 관계 연산자가 정의되어야 합니다.

  3. 가리키는 요소의 주변 요소로 이동할 수 있어야 합니다. 따라서 증가 연산자(++)가 정의되어야 합니다.

 

 

이해에 있어 도움을 많이 받은 글:

디테기CE의 블로그 세상 , 초보개발자 , Microsoft C++ docs. , tcpschool.com

블로그의 정보

작은 고양이의 캣 타워

J4BEZ

활동하기