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 바람처럼..
|