140 likes | 243 Views
메뉴 복습 예제. 3 가지 색깔의 사각형 그리기. int color = 0; // 전역변수. void CLecture151View::OnDraw(CDC* pDC) { CLecture151Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CPen pen, *pOldPen; if ( color == 0 ) pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); else if ( color == 1 )
E N D
메뉴 복습 예제 • 3가지 색깔의 사각형 그리기 int color = 0; // 전역변수 void CLecture151View::OnDraw(CDC* pDC) { CLecture151Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CPen pen, *pOldPen; if ( color == 0 ) pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); else if ( color == 1 ) pen.CreatePen(PS_SOLID,1,RGB(0,255,0)); else if ( color == 2 ) pen.CreatePen(PS_SOLID,1,RGB(0,0,255)); pOldPen = pDC->SelectObject(&pen); pDC->Rectangle(10,10,200,200); pDC->SelectObject(pOldPen); }
메뉴 복습 예제 • 메뉴 선택 처리 routine void CLecture151View::OnColorRed() { color = 0; Invalidate(); } void CLecture151View::OnColorGreen() { color = 1; Invalidate(); } void CLecture151View::OnColorBlue() { color = 2; Invalidate(); }
Toolbar의 사용 • ToolBar • 메뉴의 기능 중 자주 쓰이는 것들을 버튼 형태로 만들어 놓은 것 • 버튼을 눌렀을 때에는 해당 메뉴를 선택한 것과 동일한 효과를 가져옴 • ToolBar의 Bitmap 편집 : Resource View에서 Toolbar 선택 혹시 안 보이면 오른쪽 마우스 클릭 후 Graphics 선택
Toolbar의 Properties • Toolbar의 Property : Resource View에서 toolbar의 해당 버튼을 double click • ID : 버튼의 ID. 메뉴의 ID와 같이 하는 것이 보통 • 예: 메뉴 색깔 Red의 ID : ID_COLOR_RED • Toolbar의 빨간색 선택 버튼 : ID_COLOR_RED (같음) • Height, Width : 버튼의 세로, 가로 길이 • Prompt : 마우스가 버튼 위에 올라 갔을 때 상태표시줄에 표시할 텍스트와 툴팁 메시지를 지정 • 예제: 빨간색 사각형\nRed status bar 툴팁
Toolbar를 누르면 어떤 일이 벌어지는가? • 메뉴의 ID_COLOR_RED를 선택했을 때 처리 routine : OnColorRed() • Toolbar의 빨간색 버튼 (ID_COLOR_RED)를 선택했을 때에도 OnColorRed()가 실행됨 • 따로 처리 루틴을 작성할 필요가 없음
ON_COMMAND_RANGE 매크로 • ON_COMMAND_RANGE • 여러 개의 비슷한 역할을 하는 메뉴를 한 가지 함수에서 처리함 • 이때까지의 처리 방법 • 하나의 함수로 처리함 OnColorRed( ) 실행 Red 메뉴 선택 OnColorGreen( ) 실행 Green 메뉴 선택 OnColorBlue( ) 실행 Blue 메뉴 선택 Red 메뉴 선택 Green 메뉴 선택 OnColor( ) 실행 Blue 메뉴 선택
ON_COMMAND_RANGE 매크로 • C***View class에 다음을 추가 • 의미 : ID_COLOR_RED에서 ID_COLOR_BLUE 사이의 모든 메뉴를 선택했을 때, OnColor( )함수를 실행함 • ID_COLOR_RED가 가장 작은 ID, ID_COLOR_BLUE가 가장 큰 ID여야 함. • OnColor( ) 함수 추가 BEGIN_MESSAGE_MAP(CLecture152View, CView) ON_COMMAND_RANGE(ID_COLOR_RED, ID_COLOR_BLUE, OnColor) END_MESSAGE_MAP()
참고 : Resource.h • Resource.h #define ID_COLOR_RED 32771 #define ID_COLOR_GREEN 32772 #define ID_COLOR_BLUE 32773
OnColor( ) Routine • OnColor( ) routine 작성 • 인수 (nID) : 선택된 메뉴의 ID가 넘어 옴 void CLecture152View::OnColor(UINT nID) { color = nID - ID_COLOR_RED; Invalidate(); }
Context Menu의 사용 • 오른쪽 마우스를 click 했을 때 Context Menu가 나오게 하는 방법 • 오른쪽 마우스를 click 했을 때 발생하는 메시지 • WM_RBUTTONDOWN • WM_CONTEXTMENU OnContextMenu( )
OnContextMenu • Classwizard에서 OnContexMenu( ) 선택 • OnContextMenu의 내용 void CLecture151View::OnContextMenu(CWnd* pWnd, CPoint point) { CMenu muTemp, *pContextMenu; muTemp.LoadMenu(IDR_MAINFRAME); pContextMenu = muTemp.GetSubMenu(4); pContextMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,AfxGetMainWnd()); } 0 1 2 3 4
예제 (lecture152) • Stop Watch • Start 메뉴 및 Stop 메뉴는 필요에 따라서 Enable 됨 int second = 0; BOOL is_counting = FALSE; void CLecture152View::OnDraw(CDC* pDC) { CLecture152Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CString str; str.Format("%04d",second); pDC->TextOut(100,100,str); }
예제 void CLecture152View::OnClockStart() { } void CLecture152View::OnClockStop() { } void CLecture152View::OnTimer(UINT nIDEvent) { }
예제 void CLecture152View::OnClockReset() { } void CLecture152View::OnUpdateClockStart(CCmdUI* pCmdUI) { }