WinAPI 45 Tool (2)

CJB_ny·2022년 9월 23일
0

WinAPI

목록 보기
46/79
post-thumbnail

오늘 배운거 👍👍👍

  • tile 제작에 필요한 UI

  • DailogBox 개념, 이론, 활용

  • Resource.h 의 비밀?

  • 프로그램 메모리

    Resource.h 파일을 더블 클릭해서 보고있다는 것은...


    이렇게 보고있다는 것은 => VS도 프로그램이기 때문에 Resource.h를 메모리 어딘가에 올려서 그 메모리에 올라간 데이터를 문자열로 보고있는 것이다.

    그래서 리소스 뷰를 동시에 볼 수 없다...

    만약에 동시에 보는게 가능해서 다른데서 수정을 해버리면, 지금 보고있는 원본파일과 메모리 사이의 괴리가 생기기 때문에 막아놓은 것이다.
    (원본이 변경되기 전에 메모리에 올려놔서 아예 동시에 키는거 막아놓음)

  • 윈도우는 계층구조

  • 윈도우 입력받기

  • 프로시져 개념

  • 프로시저 함수 반환타입의 윈도우 처리기 함수의 호출 규약

  • 함수 포인터 ❗❗❗

    함수의 이름은 함수의 주소를 나타낸다!!!


특정씬에서 사용할 데이터들을 만들어 내주는 역할을 한다고보면은 된다.

맵디자인, 외적으로사용할 데이터 생성

Tile 제작 조작

툴씬에서 타일을 조작하고 제작하려면은

코드로

이런식으로 하드코딩으로 하면 안된다.

타일 모양이랑 그런것들 개별적으로 지정할 수 잇어야하고

이 모든것을 저장하는 것도 가능해야한다. 나중에 껏다 켯을 때 그 화면 유지하게하게

타일 배치 갯수를 변경

프로그램 실행 도중에 계속 변경될 수 있게 수정해주도록 하자.

UI같은 것을 통해 입력을 받게 할 수 있다.

이게 방법이 두가지가있는데 하나는 자체설계한 Object를 상속받는 애를 만들어서 사용하는 방법이 있는데,

가능은 한데 좀 어렵고,

두번째는 윈도우에서 기능을 제공하는 것들이 있는데 이것들을 활용하는 것이다.

윈도우에서 제공하는 기능 사용

이 윈도우 창은

main.cpp에서의

ABOUT창이다.

이게 확인 누르기 전까지 DialoBox라는 함수가 종료가되지 않아서 포커싱이 저 팝업창에 잡혀있던 것이다.

창이꺼져야지만 DialogBox가 종료가 되는 것이다.

이 함수안의 while문 안에서 DispatchMessage가 끝나지 않아서 갇혀있는 상태인 것이다.

이런식으로 창을 키는 방법을 '모달'방식이라고 한다.

모달 방식

저거 도움말 -> 팝업 뜨면은 포커싱을 다 가져가는데 이것을 '모달방식'으로 윈도우를 켰다라고 하는 것이다. 다른 윈도우는 포커싱을 못 받는...

그래서 모달방식으로 윈도우를 키는게 'DialogBox'를 통해서 할 수 있다.

이녀석은 ID라는 것을 전달을 받는다.

게임에서 리소스가 있듯이 vs에서도 각 프로젝트 별로 리소스가있다.

이렇게 리소스 뷰에들어가면 메뉴바 같은게 어떻게 표시를 할지 다 정의가 되어있다.

여기 이렇게하고 저장을 한다.

main의

이 함수안에 메뉴바를 등록하는 부분이 있다.

130줄에 인자로 IDC_CLIENT 라는 메크로가 들어가 있는데

이게 '메뉴 ID'이다. 아까보았던 리소스마다의 ID를 부여를 해가지고 해당 Id로 해당 리소스를 인지를 해서

프로젝트에서 로딩을 시키는 것이다.

프로그램 시작 -> ID를 찾아서 -> 메뉴바같은데 붙여주고 있는 것이다.

수정한거 적용됨.

이게 Dialog방식 모달 방식이다.

이부분이 현재 다이얼로그 박스를 통해서 윈도우 켰었을 때 메세지 처리기 이다.

마지막 인자에 About들어간거 보이제?

이 About이라는게 DialogBox가 호출되면서 실행되어서 다이얼로그 박스가 종료가 되지 않는 것이다.

main 의 while문

이 main의 while문 안에서 메세지들을 처리를 하는데

모달방식이 아니라 CreateWindow방식으로 작업을 할 것이라면은

이 그림처럼 창을 여러개 띄워 놓고 입력을 받을 때마다 메세지 큐에서 메세지를 처리 하는 방식이고, => '모달 리스'

다이얼로그박스는 그 녀석 자체적으로 메세지를 처리를 한다.

Reousrce

우리가 창을 새로 만들고싶다면은 Dialog에서

리소스 추가 -> 하면은

이런식으로 추가가 되는데

IDD_DIALOG1이라는 이름으로 생성이 되는데 이게 Resource.h에서 아이디 값을 #define으로 같이(동적?)으로 만든들고있는 것이다.

이 ID값을 변경할 수도 있다. 대신에 Resource.h킬려면은 리소스 관련 탭을 다 닫아야한다.

AboutBo또한 Id값을 resource.h에 다 추가를 해놓은 것이고

Client.h에서

이렇게 참조를 하기 대문에 다 가져올 수 있는 것이였다.

=> Resource.h를 본다는 것은 메모리에 올라간 데이터를 문자열로 보고있는 것이다.

F4 -> 이름 이따위로 변경 ㄱㄱ.

확인버튼 F4

속성이 뜨는데 다 ID를 가지고있다.

IDOK라는 ID확인함? => 엄밀히 따지면 확인버튼도 다 윈도우 이다.

윈도우는 '계층 구조'이다.

부모 윈도우 내부에 버튼 역할을 하는 윈도우를 넣은 것이다.

오브젝트의 충돌체를 달아서 충돌체가 따라가는 방식으로

이 윈도우도 똑같다.

부모 위치가 있으면 offset을 지정받아서 그 위치에 버튼 윈도우를 생성시키는 것이다.

움직일 때도 부모 위치의 offset기준으로 위치가 잡히는 원리이다.

윈도우 통해서 입력 받기

도구상자의 Edit Controller가 뭔가를 입력받을 때 사용하는 녀석이다.

뭐 이런 식으로 해주도록 하자.

이제 연결하면 된다.

타일 갯수 -> F4 -> ID값 나온다.

코드 작성 ❗

우리가 ID등록해둔 부분을 인자로 넣어 준다.

프로시져함수는 About함수를 그대로 사용한다.

잘 뜬다.

그러면 이제 값을 입력받았을 때 About과같은 프로시져처럼 동작할게 아니라,

다르게 동작하는 프로시져를 만들어 주어야한다.

ToolScene에서 필요한 값들을 입력받을 것이기때문에

About과 같은 프로시져는 전역함수 이여야 한다.

ToolScen에 전역으로 해놓는게 보기가 좋을 것이다.

Procedure 함수 정의 ❗❗❗

tile.cpp에 정의를 해놓을 것인데 Tile클래스의 멤버 함수 아니다;;

반환 타입이 CALLBACK인데 __stdcall과 같은 것이다.

윈도우에서의 처리기 함수가 되려면은 '함수 호출 규약' 을 사용해야한다.

이거지금 표쥰규약의 함수호출 규약이다.

main.cpp에 전달하기 ❗❗❗

main.cpp파일에서는 tile.h에 정의되어있는 프로시저를 모른다.

지금 이런식으로 프로시져를 입력을 받는데 == 함수포인터를 입력을 받는데

함수 포인터를 입력을 받는다고했는데 함수 이름이 들어가있다?? => 함수의 이름은 함수의 주소를 나타내기 때문에,

'함수 포인터'를 입력받는 다는 말이다.

그래서 알려주어야 하는데

함수 선언 (전방 선언?)

헤더에서 막 선어만 해주어도 링킹 단계에서 정의되어있는 부분 찾아서 연결해주었었다.

그래서 해당함수를 선언만 해주면된다.

나는 Tile.h에다가 정의하지 않고 main제일 위에 함수 전방선언하고

제일 밑에 정의했다.. 계속 링킹 에러 떠가지고 이렇게함...

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글