Programming/MFC

Example 5 : MenuBar

부풍 2009. 8. 27. 15:29

Ex5View.h

#define DM_LINE         0
#define DM_RECTANGLE    1
#define DM_ELLIPSE      2
 
class CEx5View : public CView
{
	// ~~~~
 
	// Rectangle
	CRect m_rectToDraw;
	// Save Current Draw Mode
	int m_nCurrentDrawMode;

CEx5View::OnInitialUpdate

void CEx5View::OnInitialUpdate()
{
	CView::OnInitialUpdate();
 
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	m_rectToDraw = CRect(10, 10, 510, 310);
	m_nCurrentDrawMode = DM_LINE;
}

CEx5View::OnDraw

void CEx5View::OnDraw(CDC* pDC)
{
	CEx5Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
 
	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
	switch(m_nCurrentDrawMode) {
	case DM_LINE :
		pDC->MoveTo(m_rectToDraw.TopLeft());
		pDC->LineTo(m_rectToDraw.BottomRight());
		break;
	case DM_RECTANGLE :
		pDC->Rectangle(m_rectToDraw);
		break;
	case DM_ELLIPSE :
		pDC->Ellipse(m_rectToDraw);
		break;
	}
}

Menu 처리

void CEx5View::OnDrawLine()
{
	// TODO: 여기에 명령 처리기 코드를 추가합니다.
	m_nCurrentDrawMode = DM_LINE;
	Invalidate();
}
 
void CEx5View::OnDrawRectangle()
{
	// TODO: 여기에 명령 처리기 코드를 추가합니다.
	m_nCurrentDrawMode = DM_RECTANGLE;
	Invalidate();
}
 
void CEx5View::OnDrawEllipse()
{
	// TODO: 여기에 명령 처리기 코드를 추가합니다.
	m_nCurrentDrawMode = DM_ELLIPSE;
	Invalidate();
}
 
void CEx5View::OnUpdateDrawEllipse(CCmdUI *pCmdUI)
{
	// TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.
	pCmdUI->SetCheck(m_nCurrentDrawMode == DM_ELLIPSE);
}
 
void CEx5View::OnUpdateDrawLine(CCmdUI *pCmdUI)
{
	// TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.
	pCmdUI->SetCheck(m_nCurrentDrawMode == DM_LINE);
}
 
void CEx5View::OnUpdateDrawRectangle(CCmdUI *pCmdUI)
{
	// TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.
	pCmdUI->SetCheck(m_nCurrentDrawMode == DM_RECTANGLE);
}

Context Menu (WM_CONTEXTMENU)

void CMainFrame::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가합니다.
	/*
	CMenu menu;
	CMenu* pPopup;
	int index = 0;  // 1로 바꿔봄
 
	menu.LoadMenu(IDR_POPUP);
	pPopup = menu.GetSubMenu(index);
	*/
 
	CMenu *pMenu, *pPopup;
	pMenu = GetMenu();
	pPopup = pMenu->GetSubMenu(2);
 
	pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this, NULL);
}