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. 가리키는 요소의 주변 요소로 이동할 수 있어야 합니다. 따라서 증가 연산자(++)가 정의되어야 합니다.
이해에 있어 도움을 많이 받은 글:
블로그의 정보
작은 고양이의 캣 타워
J4BEZ