170 likes | 466 Views
대화상자 (Dialog Box). 오른쪽 Button 을 누르면 다음과 같은 대화상자가 나타나는 프로그램 CDialog class 의 사용 Dialog Box 의 Design CDialog 파생 class 의 정의. Dialog Box. Dialog Box 의 Design. Class View, Resource View, File View 중에서 Resource View 를 선택. 오른쪽 마우스 버튼을 click 하여 , Insert Dialog 선택. Dialog Box 의 Design.
E N D
대화상자 (Dialog Box) • 오른쪽 Button을 누르면 다음과 같은 대화상자가 나타나는 프로그램 • CDialog class 의 사용 • Dialog Box의 Design • CDialog 파생 class의 정의 Dialog Box
Dialog Box의 Design • Class View, Resource View, File View 중에서 Resource View를 선택 오른쪽 마우스 버튼을 click 하여, Insert Dialog 선택
Dialog Box의 Design • Control 메뉴를 사용하여 Dialog Box에 control을 배치 • OK, Cancel Button은 이미 존재함. 위치만 바꾸면 됨 control 메뉴 EditBox control 만약에 control 메뉴가 보이지 않으면, Visual C++ 메뉴위에서 오른쪽 마우스 버튼을 눌러, controls를 선택하면 됨
Dialog Box의 Design • Dialog 위에서 오른쪽 마우스 click 하여 Properties를 선택 • ID를 IDD_MOVE로 바꿈 (마음대로 선택해도 됨) • DialogBox의 외형적인 Design이 모두 끝났음 • 방금 design한 외형의 ID : IDD_MOVE
CDialog 파생 class의 생성 • CDialog 파생 class의 생성 • 메뉴에서 : Insert New Class를 선택 Dialog Box 파생 class 이름 (마음대로 지어도 됨) (CxxxDlg) Base class (CDialog) Dialog Box 와 관련된 Design
Dialog Box Design + CDialog 관련 class • Dialog Box의 실제 기능은 CMoveDlg (CDialog의 파생 class)에서 하게 됨 CMoveDlg class IDD_MOVE 라는 ID를 가지는 Dialog Box를 design 했음. 기능은 아무것도 없음 Dialog Box와 관련된 일들은 class의 멤버함수가 담당함. 예: Dialog Box를 나타나게 함, OK button을 눌렀을 때 처리
CDialog 파생 class의 생성 • What happened? • CMoveDlg class가 만들어졌음 (Class View) • 생성된 파일 • MoveDlg.cpp (CMoveDlg class 멤버 함수) • MoveDlg.h (CMoveDlg class 정의) • CMoveDlg를 사용할 때, MoveDlg.h를 include 시킬 것
오른쪽 마우스 click할 때 Dialog Box가 나타나게 할려면? • CxxxView class • CDialog의 멤버 함수 DoModal() : Dialog Box를 화면에 표시함 • 왼쪽 마우스 click 할 때에도 Dialog Box를 표시할려면 어떻게 해야 되는가? #include "MoveDlg.h" void CLectue113View::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CMoveDlg dlg; dlg.DoModal(); CView::OnRButtonDown(nFlags, point); } Dialog Box 화면 표시
왼쪽, 오른쪽 마우스 click할 때 Dialog Box가 나타나게 할려면? #include "MoveDlg.h" void CLectue113View::OnRButtonDown(UINT nFlags, CPoint point) { CMoveDlg dlg; dlg.DoModal(); } void CLectue113View::OnLButtonDown(UINT nFlags, CPoint point) { CMoveDlg dlg; dlg.DoModal(); }
예제 : Dialog Box 생성 • 실습문제 : 왼쪽 마우스를 click하면 왼쪽 DialogBox를, 오른쪽 마우스를 click하면 오른쪽 Dialog Box를 나타나게 하는 프로그램을 작성하라. • 예제에서는 CMoveDlg class를 만들었음 • 이번에는 CLeftDlg 및 CRightDlg를 만들 것
Dialog Box 동작 • OK, Cancel Button을 누르면 어떤 일이 벌어지는가? • OK Button 누름 CDialog의 OnOK 멤버함수가 call 됨 DoModal() 함수에 IDOK를 return 함 • Cancel Button 누름 CDialog의 OnCancel 멤버함수가 call 됨 DoModal() 함수에 IDCANCEL을 return 함
Dialog Box 예제 : OK, Cancel Button • 왼쪽 마우스 click 하면 Dialog Box 나타남 • OK Button click 화면에 OK 표시 • Cancel Button click 화면에 Cancel 표시 void CLecture112View::OnLButtonDown(UINT nFlags, CPoint point) { CLeftDlg dlg; CClientDC dc(this); if ( dlg.DoModal() == IDOK ) dc.TextOut(point.x, point.y, "OK Button Pressed"); else dc.TextOut(point.x, point.y, "Cancel Button Pressed"); }
Dialog Box의 Value형 멤버변수 사용 • CDialog Class • 멤버함수 : DoModal(), OnInitDialog() (WM_INITDIALOG의 message handler) • Dialog 관련 초기화는 OnInitDialog()에서 할 수 있음 • 멤버변수 : control과 관련하여 정의할 수 있음 • Control과 멤버변수를 자동으로 연결해 주는 기능이 있음 • Control에 사용자가 입력한 값이 변수로 전달됨 • 변수에 입력한 값이 Control에 전달됨 CDialog class 멤버변수 m_a
Dialog Box의 Control과 멤버변수 연계 • Resource View control-key를 누른채, double click을 함 변수 이름 m_xxx형태 변수 type 지정
Dialog Box의 Control과 멤버변수 연계 • CRightDlg class에 m_a 멤버변수가 추가됨을 알 수 있다. class CRightDlg : public CDialog { // Construction public: CRightDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CRightDlg) enum { IDD = IDD_RIGHT }; int m_a; //}}AFX_DATA
멤버변수 control로 데이터 전송 • 멤버변수의 값이 control에 표시됨 void CLecture112View::OnRButtonDown(UINT nFlags, CPoint point) { CRightDlg dlg; dlg.m_a = 100; dlg.DoModal(); } dialog box가 나타날 때, 100이란 값이 표시됨
control 멤버변수로 데이터 전송 • 입력된 숫자 크기의 사각형을 그림 (s 및 rect_size는 전역변수로 정의해야 됨) void CLecture112View::OnDraw(CDC* pDC) { CLecture112Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->Rectangle(s.x,s.y,s.x+rect_size,s.y+rect_size); } void CLecture112View::OnRButtonDown(UINT nFlags, CPoint point) { CRightDlg dlg; dlg.m_a = 100; if ( dlg.DoModal() == IDOK ) { s = point; rect_size = dlg.m_a; // control에 입력한 값 Invalidate(); } }