티스토리 뷰

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);
}
 
공유하기 링크
TAG
댓글
댓글쓰기 폼