Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

승쨩개발공부

[MFC] 맵툴 본문

MFC

[MFC] 맵툴

Unknowns 2022. 5. 10. 05:18

자 이제 맵툴을 만들어보자

MFC 클래스를 생성한다 CMapTool로 기본클래스는 CDialog로 받는다

우선 맵툴을 만들려면 폼뷰 다이얼로그에서 버튼 넣고 함수로
OnMapTool추가 해준다

 

 

 

맵툴 클래스를 받아오기위해 헤더추가후 멤버변수 선언해준다

 

 

 

 

UnitTool과 똑같이 폰트를 받아오기위해 Oninitialize에 넣어주고

OnMapTool엔 똑같이 처리해준다

 

 

 

 

맵툴에선 뭐할거냐? 텍스쳐(타일)들을 드래그 앤 드랍을 할것이다.

MapTool다이얼로그로 가서

List Box(왼쪽)

Pickture Control(오른쪽)

Button(아래)

도구상자로 만들어준다

 

리스트박스는 타일의 이름을 둘것이고

픽쳐컨트롤은 리스트박스 해당 인덱스를 누르면 이미지가 출력되게 할것이고

버튼은 만든맵을 저장할것이다.

 

리스트 박스를 클릭하고

드래그&드랍을 하기 위해서

Accept Files를 True로 해준다.

 

 

 

픽쳐 컨트롤을 클릭하고

이미지를 출력하기위해

Type을 Bitmap으로 바꿔준다

 

 

실제로 DROP을 하기위해 MapTool에 DROPFILE 메세지를 하나 추가하자

 

필요한 헤더들을 추가해준다

resorse.h는 왜 추가해줫냐

필자는 IDC_PICTURE값을 못받아와서 3시간이상 삽질을했다 굉장히 빡친다

저거 하나 추가해주니 된다...

픽쳐컨트롤,리스트박스 변수 추가해주고

리스트박스와 저장버튼 이벤트 발생시킨다

map컨테이너로 키는 문자열 value는 이미지 클래스를 넣어줘 맴버변수 선언한다

DrawID 바뀌어야하니 변수 하나 선언해준다

수평 가로 스크롤함수 HorizontalScroll함수 하나 만들어준다.

 

 

 

 

우선 HorizontalScroll함수부터 만들겟다. 가장긴 문자열을 찾아 그녀석을 기준으로 가로 스크롤바를 
생성을 해야한다. 왜? 리스트박스에 드레그&드랍을 했을때

파일이름+경로로 나오게되는데 길어지면 스크롤이없어 짤리게되기때문이다.

리스트박스안에 DC가 존재한다

리스트 박스에 DC를 얻어오자

현재 리스트박스에 있는 목록에 갯수를 얻어와서 그것만큼
반복문을 돌며 가장 긴 문자열을 찾아내자

얻어온 문자열을 가지고 GetTextExtenet()  에 넣어주면
현재 문자열의 길이를 픽셀단위로 변환하여 반환해준다

SIze에 넣어줫기에 x와 Y의 값을 가지게된다

cx와 widhx와 비교를 해준다
만약 cx가 크게되면 둘이 같게 만들어준다

widthx가 listbox에있는 리스트 박스 가로 스크롤 바의 최대밤위를

넣어주면 가장 긴 문자열 길이대로 스크롤바 범위를 확장시킨다

 

 

 

 

DrapInfo홤수 조져준다

그리고 Horizontal Scroll을 반복문 바깥쪽에 함수 호출해준다


그러면 스크롤이 맞게 생성된다

하지만 현재 경로는 절대경로이다
상대경로로 바꿔보자

속도 : 절대경로 > 상대경로
안정성 : 상대경로 > 절대경로

그래서 일반적으로 상대경로로 잡는다

 

그리고 이제 선택하면 선택한 이미지가 옆에 출력되게
만들어보자 (픽쳐컨트롤)

사실 bmp이미지로 출력할거면 되게쉽다
하지만 png이기떄문에 거기에맞게 코드수정을 해주어야한다

맵툴클래스에 map<Cstring, CImage> m_mapPngImage;
를 추가해준다

CImage클래스는 jpeg, gif, bmp, png를 지원한다

맵툴로 와서 확장자 명을 잘라낸 strFIleName = szFileName;
해주고 맵컨테이너에 해당된 이미지가 있는지 찾고
End를 반환하면 키값에 해당한 이미지가 없다는뜻이다
그러면 이미지 정보를 만들어주자
Load에 상대경로를 넣어주면 해당 경로의 이미지를 로드해준다

이렇게 로드된 녀석을 맵컨테이너에 넣어주고
리스트박스에다가 추가해준다

 

상대경로로 바꾸기위한 클래스를 따로만들어보자

 

 

 

Etc폴더에 01. FileInfo 폴더를 만들어서 CFileInfo클래스를만들자

객체 생성할필요없이 그냥 static으로 만든다.

 

상대경로를 저장하기위한 문자열 배열을 만들고

현재 디렉토리가 있는 절대 경로를 저장할 문자열을 만든다


GetCurrentDirectory에 두 문자열 배열을 넣어준다

PathReleativePathTo
: 절대 경로 에서 strFullPath까지 가는 상대 경로를 구해서 
szRelativePath에 저장해줌
단 같은 드라이브에서만 경로 변경이 가능

반환타입을 CStrig에다 원시문자열을 넣어주면 자동 반환이 된다.

 

 

 

 

 

 

이제 OnListBox함수를 조져보자

맵툴 ListBox넣기전에 CString Releative에
경로를넣어주고 AddString을 바꿔주면 
상대경로로 바뀌게 된다 

하지만 우리는 TIle이름만 있으면된다

pathFindFileName()에 값을 넣어주면
경로에서 파일에 이름만 남기고 제거가 된다.

.png확장자 명이 마음에 안든다
확장자 명을 제거해보자

얻어온 파일에 이름을 얻어온 배열에다가 반환해서 복사해준다
그 다음 PathRemoveExtension에 그 값을 넣어준다
그럼 파일 이름만 남기고 확장자를 제거해준다.

 

그리고 이제 선택하면 선택한 이미지가 옆에 출력되게
만들어보자 (픽쳐컨트롤)

사실 bmp이미지로 출력할거면 되게쉽다
하지만 png이기떄문에 거기에맞게 코드수정을 해주어야한다.

 

 

 

 

 

 

동적할당을 했으니 해제도 해주자
소멸자에 for_each로 Destroy해주고 Safe_Delete해주고
Clear땡겨주자

 

 

 

 

 

그리고 다시 맵툴에 다이얼로그 ID를 보면
IDC_STATIC으로 되어있다 이녀석으로 하면 이미지 출력이 안된다
IDC_PICTURE로 바꿔주자

그런상황해서 컨트롤타입에 m_Picture로 변수를 하나 만들어주자

OnListBox에

리스트박스에서 이미지를 찾자

그리고 아까만든 m_picture에 Set_Bitmap에 값을 넣어주자

다시 다이얼로그로와서 속성중 Type을 Bitmap으로 바꿔준다

그럼 픽쳐컨트롤이 정상적용이 된다

이제 리스트박스에서 선택한 타일을 피킹을 통해 바꿔보자

맵툴에 int m_iDrawID 변수를 만든다

타일의  넘버링에 해당하는 값을 얻어와야한다
타일의 이름 = 문자열

타일13 이 이름은 문자열이다 즉 tChar형태이다
즉 마우스를 찍어서 바꾸는 DrawId는 int형 값이다

tChar값을 int형으로 바꿔줘야한다.

for문을 돌면서 findname에 GetLegth 준다

isdigit
: 매개변수로 넘겨받은 문자열의 단일 문자 단위로 숫자형태의 글자인지 
아니면 글자형태의 글자인지 구분해준다.
숫자 형태의 글자로 판명되면 0이 아닌 다른 값을 반환
그이후 인덱스 위치로부터 카운트 위치만큼 문자를 삭제해준다

그리고 이값을 m_iDrawID에 저장해준다

그리고 LButtonDown 과 Move에 맵툴을 얻어오고 
TileChage에 DrawID를 맵툴로 바꿔준다

그럼 피킹한게 맵툴 리스트박스 이미지대로 피킹이된다

툴만들떄 핵심 : 편해야한다 OK?


 

그리고 저장을위해 Terrain클래스에

함수를 만들어준다.

 

 

그리고 OnSaveData에

설명은 귀찮으니 생략하겟다 알아서 해석해라

 

 

다시 툴뷰로와서 피킹도 바꿔줘야하기떄문에 바꿔주자

 

 

 

결과 화면 

 

정렬이 꼴보기싫음 다이얼로그가서 Sort손봐라 

이상 맵툴끝

'MFC' 카테고리의 다른 글

[MFC] PathFinder 2  (0) 2022.05.13
[MFC] PathFinder 1  (0) 2022.05.13
[MFC] 유닛툴3  (0) 2022.05.10
[MFC] 유닛툴2  (0) 2022.05.10
[MFC] 유닛툴1  (0) 2022.05.10