기본 MFC 다이얼로그 프로그램을 생성하면, OK 버튼과 CANCLE 버튼이 있다.  그 2개는 사실 필요할 수도 있고, 필요 없을 수도 있는데, 보통은 버튼을 새로 만들지 바로 이름을 바꿔서 쓰지는 않는다...
 
 하지만 그 버튼을 재정의 하지 않고, 지워버려도 enter를 누르면 프로그램이 종료된다.(edit box 같은 곳은 괜찮지만, 다이얼로그가 선택된 상태로 엔터를 누르면 꺼진다.)

그럴 때 지워버린 버튼을 다시 찾을 수도 없기 때문에, 난감할 수 있는데 그럴 때는 클래스의 재정의로 함수를 재정의 한 후 사용하면 된다... 


클래스 뷰로 가서 dlg 클래스를 클리하고, 재정의 탭을 누른다. (번개표시가 이벤트, 그 옆이 재정의 이다. )


그 후에 쭉 내려와서 OnOk 함수를 재정의한다. 위의 Cancle도 있으니 필요하면 재정의 하면 된다.

 

그리고 재정의의 OnOK() 함수를 주석처리하면 이제 enter를 눌러도 종료되지 않는다...

다른 블로그를 보니, PreTran~~~` 하는 이벤트를 후킹하는 함수를 이용해서, enter 이벤트자체를 처리 안해버리던데.. 일단 해보진 않았지만, 그렇게 되면 모든, enter 이벤트자체가 안되니 edit box 등에서 불편하지 않을까 생각된다...
Posted by 바람처럼..
|

사실.. 툴을 만들 때는 타이머 클래스가 필요가 없긴하다... 툴은 사실 정보를 보거나, 아니면 내부적인 것을 변경, 저장 하는 용도로 쓰기 때문에 프레임에 구애받을 이유는 없다...

하지만.. 나는 툴을 만들면서, 각 구현에 따른 프레임 저하라던지 하는 것들도 볼겸.. 사실.. 엔진 기능 구현 용으로도 확인하고 싶어서.. 그냥 만든다..
 그리고 사실 대충 만들어서.. 그냥 대충...... 이정도 프레임.. 이라는 것만 알 수 있다.. 그럼 대충 만들어 보자...

먼저....

새 항목에서..


cpp 와 h 파일을 만든다.. 그냥 이름은 대충 CTimer로 했다.. (보통은 파일명은 그냥 Timer로 하고 클래스 명을 CTimer로 하는데 그냥 패스.)


헤더 파일 내용도 보다시피 간단하다... windows.h 파일은 GetTickCount 함수를 위해 추가했다.


그리고 이 것이 cpp다.. ( 생성자, 소멸자는 아무 내용도 없으니 생략하고, 딱 이 2개만 만들어주면된다.

 


그리고 Root로 돌아와서 CTimer를 추가하고,


h 파일에서 class를 써주고, 변수를 만들어 준다.
그리고 이전 파일을 보니.. Init 함수는 directX 외에 다른 것들도 쓸 것 같아서 함수를 분리했다.. 내용은 동일하고 함수만 하나 추가.


그리고 초기화 부분에 InitD3D 함수를 부르고 Timer를 생성, 초기화 한다.
또 해제도 잊지말고 꼭 하기..


그리고 process 함수내에 저 3줄을 추가한다. 물론 멤버 변수는 h 파일에 추가해 둔 상태다.


여기까지 했다면, 다 끝나긴했는데.. 사실.. 프레임은 있어도.. 화면에 표시하려면 폰트를 추가해야한다... 나중에 따로 클래스로 만들겠지만, 일단은 확인용으로 바로 써보자... 아래의 변수를 추가한다.


그리고 폰트를 초기화할 함수를 만든다..


함수내의 내용은 다이렉트x 예제에서 바로 들고왔다.


그리고 지금은 빠졌는데, Init 함수 내부에 CreateFont() 함수를 넣는다. 그 뒤에 폰트 변수도 해제 부분을 넣어준다.
.


그리고 render2D() 함수를 따로 만든 후....


render함수 내에 render2D 함수를 넣어주고, 함수 내부의 내용은 아래와 같이만들어 주면 끝이다.


실행하면, 왼쪽 상단에 현재 프레임이 표시된다..


현재는 아무것도 띄우지 않았기 때문에 프레임이 잘 나온다...

이제 앞으로 무엇을 띄우냐에 따라서 점점 줄어들 것이다...

현재의 뼈대를 가지고, 높이 맵을 생성하고, 여러가지 오브젝트 및 지형을 배치하는 맵 툴과 애니메이션 캐릭터를 띄워서 캐릭터 애니메이션을 보고 하는 캐릭터 툴을 구현할 예정이다.

 

 

Posted by 바람처럼..
|

오랜만에 툴만들기 작업을 계속 해 볼까한다. (사실 다이렉트x 기본을 다시 하느라 툴 만들기가 좀 늦어진듯...)

툴을 만들려면, 일단 실제 툴에서 쓸 화면을 그려야 한다. 전에 포스팅에서도 말했지만, mfc에서는 화면에 보여주는 역할을 View 부분이 담당한다..

일단 예전의 툴 만들기의 기본뼈대 만들기는 다 하고 나서부터 진행을 하겠다.


일단 이 상태에서 추가를 해서... 새항목을 선택한다.


cpp 와 h 파일을 추가한다. 그냥 이제부터 쓸 Root 클래스가 될 것이므로, Root 라고 만들었다.


그리고 위와 같이 적어준다. Class도 만들고 헤더파일로는 윈도우, d3d 관련 헤더를 추가하고, 기타 d3d 변수와 디바이스 변수를 만든다. 함수도 위의 4개만 일단 만들어 둔다.. ( 나중에 계속 추가가 될 것이다. )

cpp로 가서 또 작업을 한다..


 그리고 아래와 같이 다이렉트x 초기화 하기 포스팅에 있는 것들 그대로 긁어와서 썻다. 단 변수명만 글로벌인 g_ 에서 멤버인 m_ 으로 바뀌었다..


이렇게 해제와 랜더도 추가해주자..


MainFrame의 헤더에 Root를 추가하자....
그리고 변수도 하나 선언해두자.. 그냥 변하게 m_gcRoot 라고 만들었다.


그 다음 분할창을 만들어 둔 곳에서, new를 하고,
Init을 한다. 그리고 hWnd 변수를 넣어준다. 이 곳에 들어가는 곳이 바로 분할창 중에서 View의 윈도우 핸들 값이다.


그리고 소멸자에서 해제도 꼭 해주자.


그리고 솔루션 탐색기 옆에 클래스 뷰에서 App을 클릭하고,

 

재정의 버튼을 클릭한다.

 

그리고 OnIdle 함수를 클릭한다. 이 함수의 역할이 우리가 윈도우 프로그램을 할 때 while을 돌면서, 메세지가 없을 때 else로 들어오는 것과 같은 역할을 한다.


그리고 꼭 아래의 OnIdle의 ICount를 0 으로 바꿔준다. 그래야 계속 실시간으로 그린다. 안그러면 메세지가 올 때만 실행이 된다.
OnIdle 함수에 위와 같이 넣어준다. Main을 참조해서 그 안에 있는 Root변수의 render()함수를 부른다. 그리고 컴파일하면..


녹색으로 채워진 directX 화면을 볼 수 있다.


그리고 Root의 render에 가서 빨강도 1.0f으로 채우면.


노란색으로 적용이 되는 것을 알 수 있다...

자.. 이제 준비가 되었으니, 차근차근 원하는 화면을 만들어보자..

Posted by 바람처럼..
|


MFC로 툴을 만들다보면.. 좀 .. 어색한 느낌이 든다...


위는 리소스 창에서의 컨트롤 모습...


자세히 보면.. 리소스창에서 만드는 컨트롤들의 모습과 실제 컴파일 됫을 때의 모습이 다르다...

(물론 아닐수도 있다. 하지만, 내가 쓰는 2008, 2010 에서는 그렇다. )

그래서 검색해보니.. xp 스타일의 버튼을 만들려면 따로 설정을 해주어야 한다고 한다..

검색해보면.. 머 리소스에 무엇을 추가하고, 어떤 xml을 붙이고... 흠.. 머 저렇게 해도 되긴 되었다..

하지만.. 컴파일 때 마다 해줘야 하지만.. 한번에 되는 아주 쉬운 방법을 찾았다...

단점은 말그대로.. 컴파일 때 마다 리셋이 되어버려서 좀 짜증은 나지만...

모든 개발을 완료한 후에.. 마지막 컴파일에 딱.. 적용시키면.. 쓸만하다...

방법은.. 흔히 인터넷에 돌아다니는 xml 파일을 검색하면.. 안에 내용이 있다..

그 내용이 머냐면.. 바로 매니페스트에 적용되는 내용인데...

<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>

이런 부분이 있다.. 실제로 이부분이 컨트롤의 모양을 바꾸어주는 것이다..

저기 이름이나 설정만 바꾸면 다른모양도 가능하지 않을까 생각된다.

이 상태에서.. obj 파일이 있는 Release 폴더로 간다.. 그리고


매니페스트 파일을 연다..


그리고 제일 아래에.. 위의 소스를 붙인다...

그리고 컴파일을 하면..


짜쟌~ 위의 그냥 기본과는 버튼 모양도 바뀌엇다..

머.. 별차이 없을 수도 있다...

하지만.. 디자인에 신경쓰는 사람이라면 꼭 버튼 디자인을 xp 스타일로 바꾸는

게 훨씬 보기는 좋다..



Posted by 바람처럼..
|
[MFC] CBrowseFolderDialog, 폴더 다이얼로그 사용하기....

이전 포스팅을 보면 파일 다이얼로그에 대한 것이 있다.

이전 포스팅 바로가기

그런데 꼭 파일 하나만 열지 않는 상황이 올 수도 있다.. 바로.. 폴더를 여는 상

황이다..

예를들면 폴더 내에 있는 모든 파일을 읽어서 트리 컨트롤이나 콤보 박스, 리스

트 박스 등에 저장을 하려고 한다면 말이다..


위의 2 파일은 인터넷에 떠돌아 다니는 폴더 다이얼로그 클래스이다.

일단 사용법은 2 파일을 다운 받아서..

폴더에 추가를 한다.. 그리고 헤더파일을 포함시키고...

CBrowseFolderDialog dlg; //선언 
 
 if(dlg.DoModal() == IDOK){  
 
 }

이렇게 사용하면 된다.. FileDialog랑 크게 차이점이 없다...

하지만.. 이제 값은 얻었지만.. 그걸 사용하는 방법을 보자...

먼저 저 if 내부에서..

CString str ;
dlg.GetSelectStr(str) ;

이렇게 해서 현재 경로를 얻어온다..

SetCurrentDirectory(str) ;

그리고 현재 가리키고 있던 경로를 현재 선택된 경로로 바꾼다..

CFileFind ffind ; 
if(!ffind.FindFile()) 
{
   
}

그리고 FileFind 클래스를 선언하고 위와 같이 사용한다.

그 후에는.. 

int res = 1 ;

while(res)
{
   res = ffind.FindNextFile() ;
}

이렇게 while문을 돌면.. 파일을 하나씩 읽어 드려서 처리를 해주면된다...

단, 주의해야 할 것은 저렇게 find 해서 찾은 내용을 보면,  . 과  .. 이 포함되어

있다.

'.' , '..' << 이 2가지는 제거 하고, 원하는 처리를 하면 되겠다..

[MFC] CBrowseFolderDialog, 폴더 다이얼로그 사용하기....





Posted by 바람처럼..
|
[MFC] CFileDialog, 파일 다이얼로그 사용법...

mfc로 툴을 만들다보면, 분명히 파일을 읽어오고 저장하고 해야한다..

그때 사용하는 것이 바로  CFileDialog 이다...

CFileDialog는 mfc에서 이미 만들어 놓은 클래스기 때문에 그냥 바로 사용하면
된다.

흔히 우리가 보던 파일열기 창이 바로 이 것이다.. 사용법도 엄청 간단하다...

CFileDialog dlg( true, "*.*", NULL, OFN_HIDEREADONLY , "All Files(*.*)|*.*|", NULL );

이렇게 선언하면 모든 파일이 다 보인다... 하지만 하나의 포멧만 보고 싶다면...

CFileDialog dlg( true, "*.bmp", NULL, OFN_HIDEREADONLY , "bmp Files(*.bmp|*.bmp|", NULL );

이렇게 선언을 한다.

대충 봐도 알 듯이.. 첫 파라미터의 true는 열기 일 때 쓴다.. 이 것을 false로 바

꾸면 바로 save 창이 열린다. 그리고 뒤의 확장자들만 필요한 방식으로 바꾸면

된다..

그런데 이렇게 선언만 하면 창이 생기지를 않는다..

창을 만들려면 DoModal() 함수를 불러야 하는데..

if( dlg.DoModal() == IDOK )
{
}

보통 이렇게 많이 사용을 한다..

이렇게 사용을 하면 창이 생겨서 확인을 누르면 저 if문 안으로 들어오고 취소를
누르면 밖으로 나간다.. 혹은 else 문을 추가하면 취소 되었을 때 추가적인 작

업을 해줄 수 도 있다.

그리고 혹시 작업을 하다보면 폴더를 열어야 할 일이 있을 수 있다...

아래의 경로로 들어가면 확인할 수 있다.

폴더 열기에 관한 포스팅 바로가기

[MFC] CFileDialog, 파일 다이얼로그 사용법...



Posted by 바람처럼..
|

mfc에 다이얼로그에 그림을 넣을 때 가장 쉬운방법은,


Picture control을 사용하는 것이다...

일단 Picture control의 간단한 사용방법을 알아보자..


일단 다이얼로그에 픽쳐 컨트롤을 만든다..


그리고 ID의 static 부분을 임의의 이름으로 바꾼다...


그리고 변수를 추가한다.

 

변수명도 임의로 넣는다..

 

그리고 이것은 dc를 얻어와서 그냥 뭐든 그리는 방법인데...

사실, 다이얼로그의 dc를 얻어오면 다이얼로그에 그릴 수는 있다..

이 것은 그냥 dc를 얻는 방법을 알아보려고 해본 방법이다...

OnPaint() 함수에서 위처럼 입력하고 컴파일하면,


이렇게 선이 그어진다.

그림을 넣으려면,


리소스에..



비트맵을 추가한다. ( 다른방식으로 그림파일을 불러와도 된다. )



이렇게 파일을 하나 추가하고,


picture control에 속성에서 Type을 Bitmap으로 바꾼다..


그러면 위와 같이 변한다.. bitmap 상태일때는 크기 조절이 안된다..


테스트용 버튼을 하나 추가하고,

 

함수를 생성한다... 그리고,


HBITMAP hbit;
 hbit = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));

 m_ctlPic1.SetBitmap(hbit) ;

위와 같이 입력한다.. 그리고 컴파일하면,

이렇게 나오는데 Button1을 누르면...

짠.. 위와 같이 그림이 나오게 된다..

머 버튼을 안눌려고 되도록 하려면, 그냥 기본 초기화 함수에 넣어도 되고...

여러가지 응용을 하여 사용하면 된다.

Posted by 바람처럼..
|
[MFC] 트리 컨트롤(Tree control ) 만들기...

여러가지 항목을 묶어서 보려고 하니, 트리 컨트롤이 가장 적합해 보였다..

그래서 트리 컨트롤을 사용하기 위해 테스트를 해 보았다...


먼저 테스트용 다이얼로그 프로젝트를 만들었다.

그 후 트리 컨트롤을 선택하고,


다이얼 로그에다가 추가하였다..

여기까지는 정말 쉽다.


그리고 컴파일을 하면 이렇게 된다..  아직은 내용이 없기 때문에..

내용을 추가해보자..


트리컨트롤을 선택하고,


변수를 추가하자..

 


변수명만 적고 마침을 누른다...


그러면 헤더파일에 다음과 같은 변수가 추가된다..


그리고 cpp의 OnInitDialog() 함수로 간다. 그 곳의 초기화 작업부분에...


HTREEITEM  hRoot;

 hRoot = m_ctlTreeControl.InsertItem(L"root", 0/* nImage */, 1/* nSelectedImage */, TVI_ROOT, TVI_LAST ) ;

 HTREEITEM  hChild;

 hChild = m_ctlTreeControl.InsertItem(L"image", 1/* nImage */, 1/* nSelectedImage */, hRoot, TVI_LAST ) ;

소스를 추가한다.

그리고 컴파일을 다시 하면,

이렇게 root가 나와있고,


root를 더블클릭하면 image가 나온다..

하지만.. 먼가 아무런 연결선이 없으니.. 어색하다..

트리 컨트롤의 속성창을 보자...

 


Has Buttons가 False로 되어있는데 True로 바꾸자..


 Has Lines도 True로 바꾸고,


Lines At Root도 True로 바꾼다..

그리고 컴파일을 하면,

 

이렇게 + 와 선도 생기고,


클릭하면 아래의 image가 나온다...

트리 컨트롤을 이용하면서 가장 유의해야 할 점은 트리 컨트롤은 아이템하나당
독립적이라기 보다는 상위 부모에 속하기 때문에, 추가나 삭제를 할 때 꼭 주의

해서 해야한다.

트리컨트롤에 값을 클릭하였을 때 그 처리를 해주고 싶으면,

컨트롤 이벤트에서 TVN_SELCHANGED 이벤트의 함수를 정의하고,

그 내부에서..

CString strItem = m_ctlTreeCtrl1.GetItemText(pNMTreeView->itemNew.hItem);

이렇게 사용하여 얻어 올 수 있다.
Posted by 바람처럼..
|

콤보박스의 아이템이 보이지 않을 때!


툴 작업을 하다보면 콤보 박스를 사용할 때도 많다..

그래서 콤보 박스를 추가하고,

컴파일을 했다....


그래서 위의 화면처럼 나왔는데...

옆의 화살표를 클릭해보니..


음... 지금 이 화면이 클릭한 화면인데... 아래로 창이 보이질 않는다..

아무런 아이템이 추가 되지 않아서 그렇다고 생각할 수 있지만, 이 것은 항목이
추가 되어도 마찬가지다.. 다시 다이얼로그 창으로 돌아가서..


위와 같은 상태이면 그냥 화면이 움직일 뿐이다.. 좌우의 네모가 색이 칠해져

있다..


그 상태에서 오른쪽 화살표를 클릭하면, 색이 칠해진 네모가 아랫쪽 가운데로

변하게 된다.

 


그 상태에서 네모에 커서를 가져다 덴 후에 아래로 쭉 끌어내리면,


이렇게 범위가 생긴다. 그러고 다시 컴파일을 한 후 화살표를 클릭하면.


이렇게 아무 항목이 없어도 아래까지 내려오는 콤보 박스를 확인할 수 있다..

콤보박스의 아이템이 보이지 않을 때!


Posted by 바람처럼..
|

지금까지 툴 만들기를 따라왔다면, 이제 값을 넣어볼 차례인데...

mfc는 구조가 특이하게 클래스 별로 각자 역할을 분리하고 있다...

우리가 보는 왼쪽 화면은 View 클래스에서 담당하고 있는데..

화면에 무언가를 그리고 싶다면 이 View 클래스를 이용해야한다..

일단 간단한 그림을 띄워보려 했으나.. 실패하였다...

View 접근하기 위해서는

값을 변경할 다이얼로그에 cpp에 메인프레임의 헤더와 뷰 헤더를 추가하고,

CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();

CmapToolView* pView = (CmapToolView*)pFrame->GetActiveView();

이렇게 얻어와서 pView를 이용해서 접근하면 된다고.. 검색해 보면 나온다..

그래서 그렇게 했는데 값이 제대로 들어가지를 않는다 -_ -;;;

내가 잘못넣었는지는 몰라도.. 메인 프레임 값은 잘 가져오는 것 같은데..

GetActiveView()에서 제대로 View 포인터를 리턴하지 않는 듯 했다...

난감한 상황에서 예전에 한번.. 분할 창으로 쓸때... 스플리터로 접근한 방법이

생각났다.. 

MFC는 구조가 언뜻보면 꼬여있는 듯 보이듯이.. 서로 참조할 방법을 여러가지

가지고 있다...

그래서 해결한 방법은.. .메인프레임에서..

CUItoolView* pView = (CUItoolView*)m_wndSplitter.GetPane(0,0) ;

이 한줄로 값을 얻어왔다....

휴.... 스플리터로 분리하면서 0번과 1번으로 분리되었으므로,

0번 윈도우를 참조하면.. 그 것이 바로 View 클래스 인 것이다...

헤매지말고 바로 얻어서 사용하도록 하자...


Posted by 바람처럼..
|

1에 이어서 계속...

이전 포스팅 보기

이전 포스팅의 마지막에서 OnInitialUpdate 함수를 추가하고, 내용을 입력하면

서 끝이 났다.. 그 이후에는...


리소스 뷰에 가서 IDD_CONTROLVIEW 다이얼 로그를 클릭하고, 저기 번개모

양인 컨트롤 이벤트 항목을 클릭하면 위와 같은 화면이 나온다...


그 중에서 TCN_SELCHANGE 함수를 만든다...


그러면 이런 함수가 추가되는데.. 여기서 값을 넣어주면, 탭의 상태가 변한다..


위의 select는 현재 클릭된 컨트롤의 값인데.. 그 값에 따라서 각 다이얼로그를

SHOW, HIDE 시켜주는 부분이다..


여기까지 완료하고 컴파일 하면.. 탭 컨트롤이 추가된 모습을 볼 수 있다..


텍스쳐 부분을 클릭하면 옆의 탭을 보여준다..

이 사진만 가지고는 티가 잘 안나니.. 컨트롤들을 추가해 보겠다..


1번 다이얼 로그에는 버튼과 스태틱 컨트롤을....

 


2번 다이얼로그에는 리스트 박스와 에디트 박스를 추가하였다..

그리고 다시 컴파일을 해보면..


1번 다이얼로그 ( Setting ) 이 선택되었을 때는 버튼과 스태틱 컨트롤이..

 


2번 다이얼로그 ( 텍스쳐 ) 에서는 리스트 박스와 에디트 박스가 나오는 것을

확인할 수 있다..

이제 진짜로 툴만들기의 기본이 끝났다고 할 수 있다..

이제부터는 왼쪽화면에서 무언가 화면을 그리고, 오른쪽 컨트롤 부분에서 값을
입력하면 실시간 대입되도록 연결만 시키면.. 멋진 툴이 될 수 있을 것이다...
Posted by 바람처럼..
|

이 포스팅은 지난 포스팅인 기본 뼈대 만들기의 프로젝트에서 이어서 진행된

다.

기본 뼈대 만들기 바로가기

먼저 왜 탭 컨트롤이 필요한지 생각해보자..

탭 컨트롤이란.. 같은 공간에 각 탭별 각각의 주제별로 아이템들을 모아서 사용

하기 좋게 만들 수 있는 것이다...

툴만들기에는 필수적 이라고 볼수있다.. 이제 차근차근 하나씩 만들어보자..

먼저..


도구 상자에서 탭 컴트롤을 추가한다...

추가 위치는 IDD_CONTROLVIEW 다이얼로그에 하면 된다..


추가를 하고 탭컨트롤이 선택된 상태에서 오른쪽 버튼을 클릭. 변수 추가를 선

택한다.


변수명은.. 각자 원하는 것으로 하면된다..


그리고 사용할 탭의 갯수 만큼 다이얼로그 삽입을 한다.. 일단 테스트 용으로 2

개만 만들었다..


다이얼로그의 버튼을 다 제거하고, 대충 예전의 모습과 비슷하게 크기를 조정

한다...


그리고 속성에서 Border를 None으로...

style을  Child로 바꾼다.. ( 다이얼로그 2개 모두. )


그리고 클래스를 저장하기 위해서 다이얼로그를 더블 클릭하면, 이런 창이 생

긴다.. 기본 클래스 CDialogEx에서..


그냥 CDialog로 바꾸고..


클래스 명을 입력한후 마침을 누른다.. ( 클래스 명은 알아서 바꿔도 상관없음)


여기까지 완료했으면.. ControlView.h 에 들어간다.. 그러면 위의 그림과 같이..
마지막 줄에 탭 컨트롤 변수가 추가되어있을 것이다.. 만약 안되어 있다면.. 다

시 위에서 부터 차근차근 보고 확인해보길 바란다..


ControlView.h 에 다이얼로그 클래스의 h 파일을 추가한 후...


변수를 추가한다...
 


생성자에서 다이얼로그 변수를 초기화 해주고, 소멸자에서는 해제를 해준다..

저 해제를 위한 매크로는 기본적으로 포함된 것이 아니기 때문에.. 위에 추가를
해주어야한다.. NULL인지 판단해서 NULL이 아닐때만 해제를 하는 매크로로써
유용하게 사용된다..

 


여기 까지 추가 했으면 클래스 뷰로 가서 CControlview를 클릭한다..


그리고 오른쪽의 재정의 창을 클릭하면, OnInitialUpdate 라는 함수가 있다..

이 함수를 추가하자..


그러면 이런 함수가 하나 생기는데.. 그 곳에다가...


이렇게 추가를 하자...

내용이 길어져서 다음 포스팅에서 계속.........
Posted by 바람처럼..
|

 

 

mfc로 맵툴을 한번 만들어 볼겸 해서 검색을 해 보고 만들면서 방법을 간단히 정리했습니다.
버전은 VS 2010 기준입니다.  ( 2008도 됩니다. 예전에 2008을 쓰다가 현재는 2010을 쓰고 있습니다.  )
먼저 mfc 기본 프로젝트를 생성합니다.

일단 다음을 누르고 넘어간 다음 유니코드 라이브러리를 체크 하시고 단일 문서를 체크 후 다음다음을 합니다.
 아래 사진은 Visual Studio 스타일로 되어있는데 MFC 표준으로 바꿔줍니다.


그리고 사용자 인터페이스 기능에서 분할 창을 체크 하시구요


그리고 마침을 누릅니다. 그 후에 프로젝트에 가서 클래스 추가를 누릅니다. 그럼 이런창이 하나 뜰텐데요


mfc 클래스 추가를 누르시고 아래와 같이 클래스를 추가합니다. ( 이 것은 아까 분할창을 사용하기 위한 클래스 입니다. )

 


그렇게 하시면 Controlview 라는 클래스가 생성될 것입니다. 그럼 MainFrm.cpp로 가셔서 이렇게 추가를 해주시구요

#include "maptoolDoc.h"
#include "maptoolView.h"
#include "ControlView.h"


이제 CMainFrame::OnCreateClient() 함수를 찾아가서 아래와 같이 바꿔 줍니다.

 //return m_wndSplitter.Create(this,
 // 2, 2,               // TODO: 행 및 열의 개수를 조정합니다.
 // CSize(10, 10),      // TODO: 최소 창 크기를 조정합니다.
 // pContext);

예전에 있떤 부분을 주석 처리 하시고,

 if( !m_wndSplitter.CreateStatic( this, 1, 2 ) )
 {
  return FALSE ;
 }

 if( !m_wndSplitter.CreateView( 0, 0 ,
  RUNTIME_CLASS(CmaptoolView), CSize(768,768), pContext ) )
 {
  return FALSE ;
 }

 if( !m_wndSplitter.CreateView( 0, 1 ,
  RUNTIME_CLASS(CControlView), CSize(1280-768,768), pContext ) )
 {
  return FALSE ;
 }

 return TRUE ;

이렇게 바꾸어 줍니다.

그 다음에 바로 아래에 있는 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 함수는...

 cs.x = 100 ;
 cs.y = 100 ;
 cs.cx = 1024 ;
 cs.cy = 768 ;

 cs.style &= ~FWS_ADDTOTITLE ;
 LPCTSTR TitleName = _T("mapTool") ;
 SetTitle(TitleName) ;


 을 추가해 줍니다.

그렇게 한 후 리소스 뷰에서 dialog를 보면 CONTROLVIEW가 추가되어 있을 것입니다.

이 것을 적당한 사이즈로 만드시고 컴파일을 하시면..


짜잔~ 이렇게 창이 생깁니다. 하지만 지금 이 상태는 가운데 분할 바가.. 계속 움직입니다. 그것을 방지하기 위한 클래스가 필요합니다. 

MainFrame.h 의 class 위에 아래 부분을 추가해 줍니다.

class CSplitterX : public CSplitterWnd
{
public:
 CSplitterX() ;
 ~CSplitterX() ;

protected:
 afx_msg UINT OnNcHitTest(CPoint point) ;
 DECLARE_MESSAGE_MAP() ;
};


그리고 CMainFrame 클래스 내부의 protected: 의 CSplitterWnd m_wndSplitter; 대신
CSplitterX m_wndSplitter ; 를 넣어 줍니다.

그리고 다시 cpp로 돌아가서 제일 윗 부분에

BEGIN_MESSAGE_MAP(CSplitterX, CSplitterWnd)
 ON_WM_NCHITTEST()
END_MESSAGE_MAP()

CSplitterX::CSplitterX() {}
CSplitterX::~CSplitterX() {}

UINT CSplitterX::OnNcHitTest(CPoint point)
{
 return HTNOWHERE;
}


을 넣어 줍니다. 그리고 컴파일을 하면..... 어라....

error C2440: 'static_cast' : 'UINT (__thiscall CSplitterX::* )(CPoint)'에서 'LRESULT (__thiscall CWnd::* )(CPoint)'(으)로 변환할 수 없습니다.

이런 에러가 발생합니다. 참고했던 페이지의 방법이 2003 버전이라 방식이 좀 바뀌었습니다. 그래서 위의 msg를 조금 손을 봐야 합니다. 헤더에 추가했던
protected:
afx_msg UINT OnNcHitTest(CPoint point) ;

부분을

protected:
afx_msg LRESULT OnNcHitTest(CPoint point) ;

로 바꿔주고, cpp도 마찬가지로~

UINT CSplitterX::OnNcHitTest(CPoint point)
{
return HTNOWHERE;
}
이 부분을

LRESULT CSplitterX::OnNcHitTest(CPoint point)
{
 return HTNOWHERE;
}

이렇게 바꿔주면...

 
이젠 움직이지 않는 윈도우 완성!!!!!

이제 여기다가 추가적인 작업만 하면, 멋진 툴이 될 수 있겠죠 !

다들 즐프~

Posted by 바람처럼..
|