수업중에 WinAPI 프로젝트를 생성하기 위해
기존 Console application을 Desktop application으로 생성하였고,
추가로 Windows.h 를 추가하였다.
Windows.h를 추가하는 건 이전 포트폴리오에서도 진행했었지만,
WinAPI를 사용한 것은 아니라고 하셨다.
그렇다면 뭐가 WinAPI인거지?
https://www.youtube.com/watch?v=S4lQwJawOzI
여기에 잘 나왔다고 생각한다.
근데?? dll은 어떻게? 빌드시에 dll이 실행?
- 운영체제가 응용프로그램개발을 위해 제공하는 "함수의 집합"
- 운영체제는 가장 기본적인 동작을 할 수 있는 함수의 집합을 응용 프로그램에게 제공할 의무가 있다.
왜 제공을 해야하는가?
ㄴ함수를 사용하여, (응용프로그램이 운영체제에게 부탁하여)
운영체제가 관리하는 하드웨어의 기능들을 사용하기 위함.
API 정석
http://soen.kr/
마이크로소프트사의 MFC 그 외에 변수 명명법, 핸들, 비트 OR 연산자에 대한 내용이 나온다..
이게 WinDesktop application인 듯..??
실행하면,
- Windows.h 헤더가 정의되어있다.
- windows.h 헤더 파일은 기본적인 데이터 타입, 함수 원형 등을 정의하며 그 외 필요한 헤더 파일을 포함하고 있다.
그래서 윈도우즈 프로그램의 첫 줄은 거의 항상 #include <windows.h> 로 시작된다.
하지만 현재 버전에서는 자동으로 windowAPI.h 헤더만 추가되고,
해당 헤더 안에 windows.h헤더가 존재하게 된다.
(tchar.h 도 포함)
int APIENTRY WinMain ( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpszCmdParam, _In_ int nCmdShow) {
>> hInstance 외에는 중요하게 사용되지 않는다.
여기서의 인스턴스란, 프로그램 인스턴스를 의미한다.
실행되고 있는 각각의 프로그램을 말하는 것이다.
메모장이라는 프로그램을 2개 실행한다고 해서, 같은 인스턴스가 아니다.
같은 인스턴스가 아님을 구분하는 것을 hInstance를 통해 하는 것이고,
같은 메모장이라도, 서로 다른 인스턴스 핸들값을 가지고,
운영체제는 다른 걸 바탕으로 서로 구별한다.
hInstance란 프로그램 자체를 일컫는 정수값이며
API 함수에서 수시로 사용된다.
그래서 보통 WinMain의 인수로 전달된 hInstance값을 전역 변수 _hInstance에 대입
_lpszClass라고 전역 문자열도 정의되어 있는데 이 문자열은 윈도우 클래스를 정의하는데 사용된다
1. 클래스를 설정하고, (레지스터) 등록한다.
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
RegisterClass(&wndClass);
Window클래스를
생성하여,
설정하고,
RegisterClass에 주소를 넘겨준다.
2. 클래스를 실제 메모리상에 올리고, 화면에 출력한다
(수업에서는 hWnd가 전역으로 선언) _hWnd = CreateWindow
(
_lpszClass,
_lpszClass,
WS_OVERLAPPEDWINDOW,
400,
100,
800,
800,
NULL,
(HMENU)NULL,
hInstance,
NULL
);
ShowWindow(_hWnd, nCmdShow);
hWnd라는 메모리에 올라간 핸들을
nCmdShow라는, winMain에서 받은 매개변수(최대화,최소화 등)의 형태로 표시한다.
MSG message;
while (GetMessage(&message, 0, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
Message Loop는 3개의 함수만 사용하면 끝이다.
기본 메세지만을 처리하고 있는 셈인데,
나머지 처리되지 않은 메세지에 대해서는
모두 DefWindowProc 함수로 전달되며 이 함수에서 디폴트 처리를 수행해 준다.
= default procedure
또한 DefWindowProc 함수가 메시지를 처리했을 경우 이 함수가 리턴한 값을 WndProc 함수가 다시 리턴해 주어야 한다.
WM_DESTROY 메시지는 사용자가 시스템 메뉴를 더블클릭하거나 Alt+F4를 눌러 프로그램을 끝내려고 할 때 발생하는 메시지이다. WndProc에서 이 메시지가 발생하면 PostQuitMessage 함수를 호출하여 WM_QUIT 메시지를 보낸다. WM_QUIT 메시지가 입력되면 메시지 루프의 GetMessage 함수 리턴값이 False가 되어 프로그램이 종료된다.

준수모드 멀티바이트 유니코드 바꾼 이유
tchar.h는 뭐하는거
뭘 하는 거고 어떻게 유기적 연결
객체지향 어떻게 클래스끼리 연결하는지 - 상속 없이
WinMain.cpp
ㄴ#include "Stdafx.h"
Stdafx.h : 미리 컴파일된 헤더
ㄴwindows, tchar등 헤더 다 포함.
ㄴCommonMacroFunction도 포함
ㄴ그 외에 간단한 메모리 지우기 매크로함수, HINSTANCE,HWND,POINT 전역변수 등 선언
ㄴ왜 매크로? inline 아님?
CommonMacroFunction
ㄴinline함수들 - 왜 inline?
C3DMatrix
ㄴ행렬
C3DVector
ㄴclass C3DMatrix; // 클래스 전방선언으로, CPP에서 헤더를 선언해준다.
ㄴ전방선언을 해야하는 이유 - 클래스에 적힌헤더의 중복을 방지하기 위함
ㄴ특정 클래스에서 다른 클래스를 포인터로 사용할 때, 미리 해당 클래스가 필요하다는 것을 알려줌.
ㄴ클래스 멤버 함수가 정의된 cpp 파일에서 다른 클래스 헤더 파일이 필요한 경우 include 수행.
ㄴ 추가
#pragma once
class C3DMatrix; // 클래스 전방선언으로, CPP에서 헤더를 선언해준다.
class C3DVector
{
};
참고 사이트
https://blog.naver.com/mincoding/221707050373아직 이해안됨
https://rninche01.tistory.com/entry/Window-API-%ED%98%B8%EC%B6%9C-%ED%9D%90%EB%A6%84클래스 전방선언
https://c1oud9.tistory.com/105
https://velog.io/@taeil314/C-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%A0%84%EB%B0%A9-%EC%84%A0%EC%96%B8