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;
}
이렇게 바꿔주면...
이젠 움직이지 않는 윈도우 완성!!!!!
이제 여기다가 추가적인 작업만 하면, 멋진 툴이 될 수 있겠죠 !
다들 즐프~
'프로그래밍 > MFC' 카테고리의 다른 글
[MFC] 트리 컨트롤(Tree control ) 만들기... (2) | 2011.10.15 |
---|---|
[MFC] 콤보박스의 아이템(항목)이 보이지 않을 때! (2) | 2011.09.27 |
[MFC] 메인프레임을 얻어와서 View에 접근하기. (0) | 2011.09.23 |
[MFC] mfc로 툴만들기( 탭 컨트롤 ) - 2 (2) | 2011.09.21 |
[MFC] mfc로 툴만들기( 탭 컨트롤 ) - 1 (0) | 2011.09.21 |