190718-1
생성(실행)순서
1. App객체의 생성자
2. Doc생성자
3. Frame생성자
4. View생성자
닫기 버튼 클릭!
5. View 소멸
6. Frame 소멸
7. Doc 소멸
8. (App 객체 소멸)
OnCreate에서 자식윈도우를 선택
앱의 생성자
CSDIApp::InitInstance
Doc생성자
Frame생성자
Frame::onCreate()
View생성자
CSDIDoc::OnNewDocument
CSDIView::OnInitialUpdate()
m_pMainWnd->ShowWindow(SW_SHOW);
CSDIApp::Run()
닫기 버튼
CSDIView::~CSDIView()
CMainFrame::~CMainFrame()
CSDIDoc::~CSDIDoc()
(내부적으로 APP 소멸)
프로그램 종료
분할윈도우를 만들어보자.
[MainFrame 에서 재정의]
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if (!m_wndSplitter.Create(this, 1, 2, CSize(30, 30), pContext))
return FALSE;
return TRUE;// CFrameWnd::OnCreateClient(lpcs, pContext);
}
프레임이 클라이언트 영역을 초기화할 때 호출
View는 한개 짜리니까 우리가 원하는 View를 써보자.
프레임에 추가
'CSplitterWnd m_wndSplitter;'
// CDVView 메시지 처리기
void CDVView::OnLButtonDown(UINT nFlags, CPoint point)
{
CDVDoc* pDoc = GetDocument();
pDoc->m_ptList.Add(point);
Invalidate();
CView::OnLButtonDown(nFlags, point);
}
void CDVView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
CDVDoc* pDoc = GetDocument();
int size = pDoc->m_ptList.GetSize();
for (int i = 0; i < size; i++)
{
const CPoint& pt = pDoc->m_ptList[i];
dc.Rectangle(pt.x - 20, pt.y - 20, pt.x + 20, pt.y + 20);
}
}
- 한쪽 뷰만 업데이트 되는 문제가 발생한다. (클릭하면 사각형을 그리는 기능)
Doc가 변경되면 Doc와 연결된 View를 모두 업데이트 해야한다. -> Doc가 변경됬다는 사실을 알려주어야 한다. -> 모든 연결된 뷰 업데이트 (옵저버 패턴)
void CDVView::OnLButtonDown(UINT nFlags, CPoint point)
{
CDVDoc* pDoc = GetDocument();
pDoc->m_ptList.Add(point);
pDoc->UpdateAllViews(NULL);
// view의 OnuPdate가 호출된다.
// NULL : 모든 뷰업데이트
CView::OnLButtonDown(nFlags, point);
}
void CDVView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
Invalidate();
}
정적분할 윈도우
View의 멤버에 'CEdit m_wndEdit' 추가
int CDVView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 여기에 특수화된 작성 코드를 추가합니다.
RECT rt = { 10,10,110,35 };
m_wndEdit.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_READONLY,
rt, this, 16); // this : parent setting
return 0;
}
void CDVView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
CDVDoc* pDoc = GetDocument();
CString s;
s.Format(_T("count:%d"), pDoc->m_ptList.GetSize());
m_wndEdit.SetWindowText(s);
Invalidate();
}
에디트 박스 업데이트는 OnUpdate에서 한다.
좌표를 출력하는 뷰를 만들기위해 클래스를 추가한다. (뷰클래스추가)
CreateStatic
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if (!m_wndSplitter.CreateStatic(this, 1, 2)) //*
return FALSE;
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CDVView), CSize(300, 300), pContext);
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CPointView), CSize(300, 300), pContext);
return TRUE;// CFrameWnd::OnCreateClient(lpcs, pContext);
}
'MFC' 카테고리의 다른 글
[MFC] Worker Thread (워커 쓰레드) (0) | 2019.11.12 |
---|---|
[MFC] MDI, SDI, Document Template (multi, single) (0) | 2019.11.11 |
Hide Show Controls Using the Button, List View, Draw Rectangle (0) | 2019.11.09 |
[MFC] Creating a square information move dialog (0) | 2019.11.08 |
[MFC] 스크롤바 설정(제한), Using Views in Frames (0) | 2019.11.07 |