7 장. 대화상자 모달대화상자 (modal dialog box) DDX (Dialog Data Exchange) 모델리스대화상자 (modeless dialog box) 공통대화상자의사용 Paint3.dsw 순천향대학교정보기술공학부이상정 1 모달대화상자 (modal dialog box) 순천향대학교정보기술공학부이상정 2
대화상자의종류 모달대화상자 (modal dialog box) 대화상자를닫기전에다른윈도우로전환할수없으며 OK, CANCEL 버튼을눌러야다른윈도우로전환 Open 대화상자, 메시지대화상자 모델리스대화상자 (modeless dialog box) 대화상자를열어놓은채로다른작업을할수있는대화상자 워드프로그램의찾기대화상자 순천향대학교정보기술공학부이상정 3 Modal.dsw 예 (1) 모달형대화상자만들기 현재의화면해상도를조사해결과를대화상자를통해사용자에게보여주기 순천향대학교정보기술공학부이상정 4
Modal.dsw 예 (2) 1. SDI 옵션을사용하여 Modal.dsw 프로젝트생성 2. 리소스뷰의 Dialog을선택후오른쪽버튼을눌러팝업메뉴에서 Insert Dialog 항목을선택 IDD_DIALOG1이라는대화상자가만들어짐 툴바에서원하는컨트롤 ( 에디트박스 2개 ) 을선택후대화상자에배치 에디트박스선택하고오른쪽버튼의메뉴 properties에서 ID를 IDC_EDIT1, IDC_EDIT2로설정 순천향대학교정보기술공학부이상정 5 Modal.dsw 예 (3) 순천향대학교정보기술공학부이상정 6
Modal.dsw 예 (4) 3. 대화상자를만든후 View/ClassWizard 를선택하여대화상자클래스 Cinfo 클래스생성 => Info.h, Info.cpp 파일생성 순천향대학교정보기술공학부이상정 7 Modal.dsw 예 (5) 4. 클래스위저드를사용하여 WM_INITDIALOG 메시지핸들러코드작성 Info.cpp 파일에서대화상자가처음만들어질때수행되는 OnInitDialog() 함수 BOOL CInfo::OnInitDialog() CDialog::OnInitDialog(); int x,y; x=getsystemmetrics(sm_cxscreen); y=getsystemmetrics(sm_cyscreen); SetDlgItemInt(IDC_EDIT1,x); SetDlgItemInt(IDC_EDIT2,y); return TRUE; 순천향대학교정보기술공학부이상정 8
Modal.dsw 예 (6) GetSystemMetrics() 함수는시스템의현재구성상태를알려줌 SM_CXSCREEN : 화면의가로해상도 SM_CYSCREEN : 화면의세로해상도 SetDlgItemInt() 함수는대화상자의컨트롤에값을할당 void SetDlgItemInt(int nid, UNIT nvalue, BOOL bsigned=true); 첫번째인수 : 컨트롤의ID 두번째인수 : 대입할값 GetDlgItemInt() 는컨트롤의값을 read UNIT GetDlgItemInt(int nid, BOOL* lptrans=null, UNIT nvalue, BOOL bsigned=true); 순천향대학교정보기술공학부이상정 9 Modal.dsw 예 (7) 5. 프로그램에서대화상자호출 메뉴에 Modal 메뉴항목 (ID : ID_FILE_MODAL) 첨가 순천향대학교정보기술공학부이상정 10
Modal.dsw 예 (8) COMMAND 메시지핸들러 (CModalView::OnFileModal()) 코드생성 순천향대학교정보기술공학부이상정 11 Modal.dsw 예 (7) void CModalView::OnFileModal() CInfo dlg; dlg.domodal(); // 대화상자를화면에출력 6. CModalView.cpp에 CInfo 클래스정보삽입 #include "Info.h" 순천향대학교정보기술공학부이상정 12
대화상자디자인 컨트롤툴바 툴바보이기 오른쪽버튼을눌러팝업메뉴에서 Controls 체크박스를클릭 배치 컨트롤선택후드래그 속성조정 팝업메뉴에서 Properties 항목에서속성설정 탭순서변경 Layout/Tab Order 메뉴선택 대화상자에있는컨트롤을순서대로선택하면탭순서가변경 대화상자의빈곳을클릭하면탭순서지정마침 테스트 직접실행하지않고테스트만할수있는방법 LayOut/Test 메뉴선택 순천향대학교정보기술공학부이상정 13 DDX (Dialog Data Exchange) 순천향대학교정보기술공학부이상정 14
대화상자와의통신 메인프로그램과대화상자간의정보교환방법 대화상자를호출하는함수 (DoModal) 는인수가없기때문에정보를대화상자로전달할수없음 DoModal 이대화상자를실행후넘겨주는반환값도하나이므로대화상자의정보를메인프로그램에넘겨주기가어려움 화면의 (x,y) 위치에문자열을출력하되좌표값과문자열을대화상자로부터입력받는예제소개 대화상자와프로그램간의정보전달예 기초적인방식 : Ddx1.dsw DDX 방식 : Ddx2.dsw 순천향대학교정보기술공학부이상정 15 Ddx1.dsw 실행예 순천향대학교정보기술공학부이상정 16
Ddx1.dsw 예 (1) 1. Ddx1.dsw 를 SDI 옵션으로생성 2. 새로운대화상자디자인 3 개의에디트컨트롤에대한 ID IDC_NX, IDC_NY, IDC_MYSTR 순천향대학교정보기술공학부이상정 17 Ddx1.dsw 예 (2) 클래스위자드를실행시켜대화상자를사용하는클래스를생성 클래스이름 : CInput base class : CDialog Dialog ID : IDD_DIALOG1 클래스위자드가 Input.h, Input.cpp 파일을프로젝트에첨가 순천향대학교정보기술공학부이상정 18
Ddx1.dsw 예 (3) 3. Cinput 클래스코드수정 에디트컨트롤로입력한값을저장할변수를 Input.h 에선언 class CInput : public CDialog // Construction public: CInput(CWnd* pparent = NULL); // standard constructor int m_nx,m_ny; // 대화상자로부터입력된좌표값을저장 CString m_mystr; // 문지열을저장 순천향대학교정보기술공학부이상정 19 Ddx1.dsw 예 (4) 대화상자가열릴때변수값을대화상자의에디트컨트롤에복사 WM_INITDIALOG 메시지핸들러에서수행 BOOL CInput::OnInitDialog() CDialog::OnInitDialog(); SetDlgItemInt(IDC_NX,m_nx); SetDlgItemInt(IDC_NY,m_ny); SetDlgItemText(IDC_MYSTR,m_MyStr); return TRUE; 순천향대학교정보기술공학부이상정 20
Ddx1.dsw 예 (5) 대화상자가닫힐때컨트롤에입력된값을변수에대입 IDOK 버튼의 BN_CLICKED 메시지핸들러에서수행 void CInput::OnOK() m_nx=getdlgitemint(idc_nx); m_ny=getdlgitemint(idc_ny); GetDlgItemText(IDC_MYSTR,m_MyStr); CDialog::OnOK(); 순천향대학교정보기술공학부이상정 21 Ddx1.dsw 예 (6) 5. 뷰에서위치좌표에문자열을출력 OnDraw() 함수에서문자열을출력 void CDdx1View::OnDraw(CDC* pdc) CDdx1Doc* pdoc = GetDocument(); ASSERT_VALID(pDoc); pdc->textout(dlg.m_nx,dlg.m_ny, dlg.m_mystr, dlg.m_mystr.getlength()); dlg 객체를뷰에서사용하도록하기위해뷰클래스해더에서 CInput 클래스객체를선언 #include "input.h" class CDdx1View : public CView. // Attributes public: CDdx1Doc* GetDocument(); CInput dlg; 순천향대학교정보기술공학부이상정 22
Ddx1.dsw 예 (7) 대화상자를호출하는코드작성 파일 /Input 메뉴항목 (ID: ID_FILE_INPUT) 에서 COMMAND 메시지핸들러 void CDdx1View::OnFileInput() dlg.domodal(); Invalidate(); 뷰의생성자함수에서변수초기화 CDdx1View::CDdx1View() dlg.m_nx=0; dlg.m_ny=0; dlg.m_mystr="start String"; 순천향대학교정보기술공학부이상정 23 Ddx2.dsw 예 (1) MFC 는데이터교환의자동화방법 (DDX 메커니즘 ) 을제공 1. SDI 옵션으로 Ddx2.dsw 프로젝트생성 2. 대화상자디자인 3개의에디트컨트롤첨가 : IDC_NX IDC_NY IDC_MYSTR 클래스위자드를실행시켜대화상자를사용하는클래스를생성 클래스이름 : Cinput, base class: Cdialog, Dialog ID: IDD_DIALOG1 3. 클래스위저드를사용하여변수를첨가 변수첨가시값의범위를점검 DDV (Dialog Data Validation) 서비스 순천향대학교정보기술공학부이상정 24
Ddx2.dsw 예 (2) 순천향대학교정보기술공학부이상정 25 Ddx2.dsw 예 (3) 클래스위자드는대화상자클래스선언부에입력한변수를자동추가 class CInput : public CDialog // Construction public: CInput(CWnd* pparent = NULL); // standard constructor // Dialog Data //AFX_DATA(CInput) enum IDD = IDD_DIALOG1 ; CStringm_MyStr; int m_nx; int m_ny; //AFX_DATA 클래스위자드가대화상자의생성자에서변수를초기화시킨다. CInput::CInput(CWnd* pparent /*=NULL*/) : CDialog(CInput::IDD, pparent) //AFX_DATA_INIT(CInput) m_mystr = _T(""); m_nx = 0; m_ny = 0; //AFX_DATA_INIT 순천향대학교정보기술공학부이상정 26
Ddx2.dsw 예 (4) 클래스위저드가데이터교환 (DDX) 과타당성점검 (DDV) 을자동으로수행하는 DoDataExchange 함수를작성 void CInput::DoDataExchange(CDataExchange* pdx) CDialog::DoDataExchange(pDX); //AFX_DATA_MAP(CInput) DDX_Text(pDX, IDC_MYSTR, m_mystr); DDX_Text(pDX, IDC_NX, m_nx); DDV_MinMaxInt(pDX, m_nx, 0, 1000); DDX_Text(pDX, IDC_NY, m_ny); DDV_MinMaxInt(pDX, m_ny, 0, 1000); //AFX_DATA_MAP 순천향대학교정보기술공학부이상정 27 Ddx2.dsw 예 (5) 4. 뷰에서의작업은 Ddx1.dsw와동일 OnDraw() 함수에서문자열을출력 void CDdx1View::OnDraw(CDC* pdc) CDdx1Doc* pdoc = GetDocument(); ASSERT_VALID(pDoc); dlg 객체를뷰에서사용하도록하기위해뷰클래스해더에서 CInput 클래스객체를선언 #include "input.h" class CDdx1View : public CView. // Attributes public: CDdx1Doc* GetDocument(); CInput dlg; pdc-> TextOut(dlg.m_nx, dlg.m_ny, dlg.m_mystr, dlg.m_mystr.getlength()); 순천향대학교정보기술공학부이상정 28
Ddx2.dsw 예 (6) 대화상자를호출하는코드작성 파일 /Input 메뉴항목 (ID: ID_FILE_INPUT) 에서 COMMAND 메시지핸들러 void CDdx1View::OnFileInput() dlg.domodal(); Invalidate(); 뷰의생성자함수에서변수초기화 CDdx1View::CDdx1View() dlg.m_nx=0; dlg.m_ny=0; dlg.m_mystr="start String"; 순천향대학교정보기술공학부이상정 29 모델리스대화상자 (modeless dialog box) 순천향대학교정보기술공학부이상정 30
모델리스대화상자 모델리스대화상자는열어놓은채로사용하기때문에여러가지문제가발생 메뉴항목등의메시지핸들러함수내에서대화상자를만들고, 파괴하는모든일을할수없다. 따라서만드는과정과파괴하는과정을분리 DoModal() 함수대신에 Create() 함수를사용 OK 버튼을누르지않고도변경한값이즉시반영되도록해야함 순천향대학교정보기술공학부이상정 31 Ddx2a 예 (1) Ddx2 디렉토리를모두복사하여 Ddx2a 디렉토리를만들고다음과같이수정 1. 대화상자를만드는 File/Input 메뉴항목의핸들러를수정 void CDdx2View::OnFileInput() if (dlg.getsafehwnd()==null) dlg.create(idd_dialog1); dlg.showwindow(sw_show); DoModal() 함수대신에 Create() 함수사용하여대화상자를생성 GetSafeHwnd() 는해당대화상자가이미만들어져있는지를조사 ShowWindow(SW_SHOW) 는대화상자를화면에나타내어줌. 대화상자의속성윈도우의 More Styles 에서 visible 속성을설정하면위함수와동일한효과 순천향대학교정보기술공학부이상정 32
Ddx2a 예 (2) 2. 대화상자를열어놓고값을계속갱신하도록하기위해 Update 버튼추가 순천향대학교정보기술공학부이상정 33 Ddx2a 예 (3) Update 버튼의 BN_CLICKED 메시지핸들러에서값을갱신 void CInput::OnUpdate() UpdateData(TRUE); m_pview->invalidate(); UpdateData(TRUE) : 대화상자의컨트롤값을대응하는변수에복사 UpdateData(FALSE): TRUE의반대 Class Cinput Cstring m_mystr; int m_nx; Int m_ny; UpdateData(FALSE) UpdateData(TRUE) 순천향대학교정보기술공학부이상정 34
Ddx2a 예 (4) 3. 대화상자에서뷰를호출할수있도록설정 대화상자를호출한뷰를설정 대화상자클래스의해더파일에대화상자를호출한뷰의포인터를저정할변수를선언 class CInput : public CDialog // Construction public: CInput(CWnd* pparent = NULL); // standard constructor CView *m_pview; 뷰의생성자에서이변수에자신의뷰포인터를대입 CDdx2View::CDdx2View() dlg.m_nx=0; dlg.m_ny=0; dlg.m_mystr="start String"; dlg.m_pview=this; 순천향대학교정보기술공학부이상정 35 Ddx2a 예 (5) 4. 대화상자의 OK 버튼을누를때화면갱신 IDOK 의 BN_CLICKED 메시지핸들러 void CInput::OnOK() m_pview->invalidate() CDialog::OnOK(); 순천향대학교정보기술공학부이상정 36
Ddx2a 실행예 순천향대학교정보기술공학부이상정 37 공통대화상자의사용 순천향대학교정보기술공학부이상정 38
공통대화상자 Common Dialog는모든윈도우즈용프로그램에서공통으로사용하는대화상자 MFC에서는공통대화상자는 CCommonDialog 클래스로부터파생 대화상자파일열기대화상자폰트선택대화상자색상선택대화상자페이지셋업대화상자인쇄대화상자찾기, 바꾸기대화상자 클래스명 CFileDialog CFontDialog CColorDialog CPageSetupDialog CPrintDialog CFindReplaceDialog 순천향대학교정보기술공학부이상정 39 파일열기대화상자 (1) 파일열기대화상자는대화상자로부터파일이름을입력받는데사용 CFileDialog 클래스를사용 CFileDialog 클래스의생성자를사용하여대화상자객체를생성 CFileDialog( BOOL bopenfiledialog, LPCTSTR lpszdefext = NULL, LPCTSTR lpszfilename = NULL, DWORD dwflags = OFN_HIDEREADONLY OFN_OVERWRITEPROMPT, LPCTSTR lpszfilter = NULL, CWnd* pparentwnd = NULL ); bopenfiledialog: 이값이 TRUE이면대화상자는파일열기대화상자가되고, FALSE이면파일저장하기대화상자가된다. lpszdefext: 사용자가에디트박스에서직접파일이름을입력하고파일확장자를생략했을경우사용되는디폴트확장자이다. 확장자가생략된경우이인수가지정하는확장자가파일이름뒤에지동으로추가된다. 이값이 NULL 일경우확장자는추가되지않는다. 순천향대학교정보기술공학부이상정 40
파일열기대화상자 (2) lpszfilename: 파일이름에디트박스에나타날파일이름을지정하되이값이 NULL이면에디트박스에아무파일도지정되지않은채로대화상자가열린다. dwflags: 대화상자의여러가지옵션을설정한다. 이옵션은 CFileDialog 클래스의 m_ofn 멤버변수와동일하다. lpszfilter: 필터를지정하는문자열 pparentwnd: 파일열기대화상자의부모또는오너윈도우의핸들 순천향대학교정보기술공학부이상정 41 파일열기대화상자 (3) 예 CFileDialog dlg(true, _T("AVI"), _T("*.AVI"), OFN_HIDEREADONLY OFN_OVERWRITEPROMPT, _T("Animate(*.AVI) *.AVI")); TRUE는 open일경우, FALSE는 save일경우 _T("AVI") 는 default 파일확장자 _T("*.AVI") 는파일이름란에들어갈파일명 OFN_HIDEREADONLY OFN_OVERWRITEPROMPT는파일을열때설정해주는스타일플러그 OFN_HIDEREADONLY : read only check box를숨김 OFN_OVERWRITEPROMPT : 선택된파일이있다면 save as dialog box를생성 _T("Animate(*.AVI) *.AVI") 는파일형식란에기록할 data 형식, 확장자가AVI인파일만file list box에도시 순천향대학교정보기술공학부이상정 42
Commdlg.dsw 예 (1) 메뉴항목을사용하여공통대화상자를호출하고색상과폰트에대한정보를입력받아사용하는예 1. SDI 옵션을주어 Commdlg.dsw를생성 2. 대화상자를호출하는메뉴항목 Dialog 메뉴에 6 개의공통대화상자를위한메뉴항목설정 ID_DLG_FILE, ID_DLG_FONT, ID_DLG_COLOR, ID_DLG_PAGE, ID_DLG_PRINT, ID_DLG_FIND 순천향대학교정보기술공학부이상정 43 Commdlg.dsw 예 (2) 3. 색상과폰트를저장할변수를뷰의헤더에선언 class CCommdlgView : public CView protected: // create from serialization only CCommdlgView(); DECLARE_DYNCREATE(CCommdlgView) // Attributes public: CCommdlgDoc* GetDocument(); COLORREF m_brcolor;// 색상을저장할변수 LOGFONT m_font;// 폰트를저장할변수 순천향대학교정보기술공학부이상정 44
Commdlg.dsw 예 (3) 4. 각메뉴항목에대해 COMMAND 메시지핸들러작성 void CCommdlgView::OnDlgColor() CColorDialog dlg; dlg.domodal(); m_brcolor=dlg.getcolor(); Invalidate(); void CCommdlgView::OnDlgFile() int Result; CFileDialog dlg(true); Result=dlg.DoModal(); CString IMSI=dlg.GetFileName()+" 를선택하셨네요 "; if (Result==IDOK) MessageBox(IMSI); 순천향대학교정보기술공학부이상정 45 Commdlg.dsw 예 (4) void CCommdlgView::OnDlgFind() CFindReplaceDialog dlg; dlg.create(false,"dog"); // 첫번째인수 (TRUE: 표준 Find dialog, FALSE :Find/Replace dialog), // 두번째인수는 search string, 세번째인수는 replace 될 string MessageBox(" 대화상자떳지요. 좀있다사라집니다 "); void CCommdlgView::OnDlgFont() CFontDialog dlg(&m_font); dlg.domodal(); dlg.getcurrentfont(&m_font); Invalidate(); 순천향대학교정보기술공학부이상정 46
Commdlg.dsw 예 (5) void CCommdlgView::OnDlgPage() CPageSetupDialog dlg; dlg.domodal(); void CCommdlgView::OnDlgPrint() CPrintDialog dlg(false); dlg.domodal(); 순천향대학교정보기술공학부이상정 47 Commdlg.dsw 예 (6) 5. 공통대화상자에서선택한옵션을테스트하기위해 OnDraw 에코드작성 void CCommdlgView::OnDraw(CDC* pdc) CCommdlgDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); CString str(" 문자열이다 ABCD"); CBrush MyBrush, *poldbrush; CFont MyFont,*pOldFont; MyBrush.CreateSolidBrush(m_B rcolor); poldbrush= pdc->selectobject(&mybrush); pdc->ellipse(10,10,200,100); MyFont.CreateFontIndirect(&m_ Font); poldfont=pdc- >SelectObject(&MyFont); pdc- >TextOut(200,150,str,str.GetLen gth()); pdc->selectobject(poldfont); pdc- >SelectObject(pOldBrush); 순천향대학교정보기술공학부이상정 48
Commdlg.dsw 예 (7) 6. OnCreate(WM_CREATE 메시지 ) 에서폰트 ( 디폴트폰트 ), 색상 ( 검정 ) 을초기화 int CCommdlgView::OnCreate(LPCREATESTRUCT lpcreatestruct) if (CView::OnCreate(lpCreateStruct) == -1) return -1; CClientDC dc(this); CFont *TempFont=dc.GetCurrentFont(); TempFont->GetLogFont(&m_Font); m_brcolor=rgb(0,0,0); return 0; 순천향대학교정보기술공학부이상정 49 Commdlg.dsw 실행예 순천향대학교정보기술공학부이상정 50
Paint3.dsw 순천향대학교정보기술공학부이상정 51 Paint3.dsw 예 (1) Paint2.dsw 예제를변형 선의색상과굵기를대화상자를통해입력 선의색상을공통대화상자로입력 1. Paint3 디렉토리를만든다음 Paint2.dsw를복사 2. 선의속성을입력받는대화상자디자인 IDC_PenWidth, IDC_R, IDC_G, IDC_B 순천향대학교정보기술공학부이상정 52
Paint3.dsw 예 (2) 클래스위저드를사용하여대화상자의클래스를프로젝트에첨가 클래스이름 : CLineAttr DDX를위해각컨트롤에대응하는멤버변수추가 굵기유효범위 : 1-10 색상은유효범위가자동으로상한값이 255로설정 순천향대학교정보기술공학부이상정 53 Paint3.dsw 예 (3) 3. 클래스위저드에의해멤버변수가자동으로추가되고, 초기값도자동설정 class CLineAttr : public CDialog // Construction public: CLineAttr(CWnd* pparent = NULL); // standard constructor // Dialog Data //AFX_DATA(CLineAttr) enum IDD = IDD_DIALOG1 ; BYTE m_b; BYTE m_g; int m_penwidth; BYTE m_r; //AFX_DATA CLineAttr::CLineAttr(CWnd* pparent /*=NULL*/) : CDialog(CLineAttr::IDD, pparent) //AFX_DATA_INIT(CLineAttr) m_b = 0; m_g = 0; m_penwidth = 0; m_r = 0; //AFX_DATA_INIT 순천향대학교정보기술공학부이상정 54
Paint3.dsw 예 (4) 4. 뷰에서대화상자를호출하도록 Paint 메뉴의끝에 Line Attr 메뉴항목추가 순천향대학교정보기술공학부이상정 55 Paint3.dsw 예 (5) 5. 대화상자객체 (dlg) 를뷰의멤버변수로선언 #include "LineAttr.h" enum tagtool DRAW,LINE,ELLIPSE,RECTANGLE; class CPaint2View : public CView // Attributes public: CPaint2Doc* GetDocument(); CPoint m_nowp;// 마우스가처음눌려진좌표기억 CPoint m_oldp;// 선, 원, 사각형을그릴시중간과정의좌표를기억 tagtool m_tool;// 그리기종류를기억 BOOL m_bpaint;// 그림을그리는중인지를기억 CLineAttr dlg; 순천향대학교정보기술공학부이상정 56
Paint3.dsw 예 (6) 6. Line Attr 메뉴항목의 COMMAND 메시지핸들러에서대화상자를호출 void CPaint2View::OnPaintLineattr() dlg.domodal(); 7. 대화상자를통해선택된색상과펜굵기를그리기코드에적용 마우스버튼을놓을때 void CPaint2View::OnLButtonUp(UINT nflags, CPoint point) m_bpaint=false; CBrush *OldBrush; CPen *OldPen, MyPen; CClientDC dc(this); OldBrush=(CBrush *) dc.selectstockobject(null_brush); 순천향대학교정보기술공학부이상정 57 MyPen.CreatePen(0,dlg.m_PenWidth,R GB(dlg.m_R,dlg.m_G,dlg.m_B)); OldPen=dc.SelectObject(&MyPen); switch (m_tool) case LINE: dc.moveto(m_nowp); dc.lineto(point); break; case ELLIPSE: dc.ellipse(m_nowp.x,m_nowp.y,point.x,point.y); break; case RECTANGLE: dc.rectangle(m_nowp.x,m_nowp.y,poi nt.x,point.y); break; dc.selectobject(oldbrush); dc.selectobject(oldpen); Paint3.dsw 예 (7) 마우스버튼을움직일때 void CPaint2View::OnMouseMove(UINT nflags, CPoint point) CBrush *OldBrush; CPen *OldPen, MyPen; CClientDC dc(this); OldBrush=(CBrush *)dc.selectstockobject(null_brush); MyPen.CreatePen(0,dlg.m_PenWidth,RG B(dlg.m_R,dlg.m_G,dlg.m_B)); OldPen=dc.SelectObject(&MyPen); if (!m_bpaint) return; switch (m_tool) case DRAW: dc.moveto(m_nowp); dc.lineto(point); m_nowp=point; break; 순천향대학교정보기술공학부이상정 58 case LINE: dc.setrop2(r2_not);// 한번그린후다시그리면원래의그림을복구 dc.moveto(m_nowp); dc.lineto(m_oldp); dc.moveto(m_nowp); dc.lineto(point); m_oldp=point; break; case RECTANGLE: dc.setrop2(r2_not); dc.rectangle(m_nowp.x,m_nowp.y,m_ol dp.x,m_oldp.y); dc.rectangle(m_nowp.x,m_nowp.y,point.x,point.y); m_oldp=point; break; dc.selectobject(oldbrush); dc.selectobject(oldpen);
Paint3.dsw 예 (8) 8. 색상을색상선택공통대화상자를사용 - 대화상자에색상선택공통대화상자를호출하는버튼을추가 순천향대학교정보기술공학부이상정 59 Paint3.dsw 예 (9) CLineAttr 클래스에서 IDC_BUTTON 의 BN_CLICKED 메시지핸들러를작성 void CLineAttr::OnButton1() CColorDialog COL; COLORREF SelColor; if (COL.DoModal()==IDOK) SelColor=COL.GetColor(); m_r=getrvalue(selcolor); m_g=getgvalue(selcolor); m_b=getbvalue(selcolor); UpdateData(FALSE); 순천향대학교정보기술공학부이상정 60
Paint3.dsw 예 (10) 9. 커서모양바꾸기 Resource View 의팝업메뉴에서 insert -> cursor 를선택하여새로운커서를설계 순천향대학교정보기술공학부이상정 61 Paint3.dsw 예 (11) 10. 커서모양을마우스왼쪽버튼을 down IDC_CURSOR1 으로바꾸고, up 시 IDC_ARROW 로바꾸기 OnLButtonDown() 에다음코드삽입 HCURSOR MyCursor = AfxGetApp()->LoadCursor(IDC_CURSOR1); SetClassLong(m_hWnd, GCL_HCURSOR, (long)mycursor); OnLButtonUp() 에다음코드삽입 HCURSOR MyCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW); SetClassLong(m_hWnd, GCL_HCURSOR, (long)mycursor); 순천향대학교정보기술공학부이상정 62
Paint3.dsw 실행예 순천향대학교정보기술공학부이상정 63 과제 7 장에서학습한대화상자를응용한프로그램작성 순천향대학교정보기술공학부이상정 64