그래픽 프로그래밍

Similar documents
윈도우 프로그래밍의 개념

윈도우 프로그래밍의 개념

Microsoft PowerPoint - CPP_chap3

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

슬라이드 1

Visual C++의 개요

10 장세균전프로그래밍 10.1 게임룰 (1) 사람과컴퓨터가싸우는 2인용보드게임이다. (2) 사람이먼저움직이고, 컴퓨터가움직인다. (3) 세균을가로및세로방향으로 2칸까지빈칸으로이동시킬수있다. (4) 1칸을이동할경우에는복제가된다. (5) 이동한후주변세균은내편으로바뀐다.

윈도우 프로그래밍의 개념

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

Lab 3. 실습문제 (Single linked list)_해답.hwp

Microsoft PowerPoint _대화상자.ppt

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

GDI의 개념

윈도우 프로그래밍의 개념

<4D F736F F F696E74202D203036C0E520BBE7BFEBC0DA20C0CEC5CDC6E4C0CCBDBA205BC8A3C8AF20B8F0B5E55D>

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

슬라이드 1

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint 프레젠테이션

KNK_C_05_Pointers_Arrays_structures_summary_v02

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

DLL(Dynamic Linked Library)

Microsoft PowerPoint - 07-Data Manipulation.pptx

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

슬라이드 1

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

윈도우시스템프로그래밍

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

08장 윈도우에서의 그리기

슬라이드 1

슬라이드 1

PowerPoint 프레젠테이션

설계란 무엇인가?

Microsoft PowerPoint _파일입출력.ppt

UI TASK & KEY EVENT

쉽게 풀어쓴 C 프로그래밍

Programming hwp

금오공대 컴퓨터공학전공 강의자료

PowerPoint Template

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

JAVA PROGRAMMING 실습 02. 표준 입출력

제8장 자바 GUI 프로그래밍 II

Programming hwp

Chapter 1. MFC 시작하기

1

adfasdfasfdasfasfadf

Microsoft PowerPoint - chap06-1Array.ppt

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

윈도우시스템프로그래밍

Microsoft PowerPoint - C++ 5 .pptx

<4D F736F F F696E74202D203039C0E520B4EBC8ADBBF3C0DA205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

슬라이드 1

MFC 프로그래밍

chap 5: Trees

Microsoft Word - src.doc

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

03_queue

UI TASK & KEY EVENT

歯Lecture2.PDF

윈도우즈프로그래밍(1)

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - 06-Body Data Class.pptx

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

C 언어 프로그래밊 과제 풀이

02장.배열과 클래스

슬라이드 1

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

5장 MFC기반 다지기

Microsoft PowerPoint - hci2-lecture5-messagemap.ppt

PowerPoint Presentation

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

PowerPoint 프레젠테이션

윤성우의 열혈 TCP/IP 소켓 프로그래밍

MFC 프로그래밍

슬라이드 1

PowerPoint 프레젠테이션

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

윈도우시스템프로그래밍

슬라이드 1

Microsoft PowerPoint - 09-Object Oriented Programming-3.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx

The Pocket Guide to TCP/IP Sockets: C Version

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

디지털영상처리3

Microsoft PowerPoint - logo_2-미해답.ppt [호환 모드]

Microsoft PowerPoint - e pptx

API 매뉴얼

오버라이딩 (Overriding)

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

Microsoft PowerPoint - hci2-lecture9.ppt

Microsoft PowerPoint - 11주차.pptx

Microsoft PowerPoint - hci2-lecture5.ppt

untitled

PowerPoint 프레젠테이션

Transcription:

제 13 장그래픽프로그래밍 13.1 베지어곡선 실습 13-1 알고리즘을통한베지어곡선그리기 실습 13-2 컨트롤포인트이동및베지어곡선 해상도설정하기

그래픽프로그래밍 베지어곡선 베지어곡선알고리즘은곡선을생성하는대표적이고기본이되는알고리즘이다. MFC 에서의베지어곡선함수 BOOL PolyBezier(const POINT* lppoints, int ncount); lppoints : 곡선을구성하는컨트롤포인트들의좌표값 ncount : 컨트롤포인트의개수 이함수의특징은컨트롤포인트의개수가 ( 곡선수 * 3 +1) 개가되어야만곡선을그릴수있다. (Cubic Bezier Curve)

그래픽프로그래밍 베지어곡선상의한좌표를계산하는알고리즘 3 3 입력값 : b0, b1,, bn E 그리고 t R r r 1 r 1 출력값 : bi ( t) (1 t) bi ( t) tbi 1 ( t) ( r 0,, n, i 0, n r) 0 위의식에서 bi ( t) b i 이고 bn ( t 0 ) 가곡선상의파라미터 t 의값을가진한점의좌표값이다.

그래픽프로그래밍 베지어커브상의 t 에해당하는점의좌표를계산하는함수 CPoint ComputeCurvePoint(int ndegree, CPoint AryCtrlPoint[], float fdelta) { CPoint faryctrlpoint[30]; float fdelta_t; fdelta_t = 1.0f - fdelta; for( int i = 0; i <= ndegree; i++ ) faryctrlpoint[i] = AryCtrlPoint[i]; } for( r = 1; r <= ndegree; r++) for( i= 0; i <=ndegree - r; i++ ) { faryctrlpoint[i].x = (int)(fdelta_t*(float)faryctrlpoint[i].x+ fdelta*(float)faryctrlpoint[i+1].x); faryctrlpoint[i].y = (int)(fdelta_t*(float)faryctrlpoint[i].y+ fdelta*(float)faryctrlpoint[i+1].y); } return faryctrlpoint[0];

그래픽프로그래밍 커브를구성하는모든점의좌표를생성하는알고리즘 이알고리즘은커브를구성하는점의개수를지정하고, t 의값을변화시켜앞에서만든함수를반복적으로호출함으로써커브상의점의좌표를계산한다.

그래픽프로그래밍 모든점의좌표를계산하는함수 void CreateCurvePoint(int ndegree, int npointnum, CPoint pointcontrol[], CPoint pointcurve[]) { float fdelta, t; fdelta = 1.0f/(float)(nPointNum); t = 0.0f; for( int i = 0; i <= npointnum; i++ ) { pointcurve[i] = ComputeCurvePoint(nDegree, pointcontrol, t); t = t+fdelta; } } 함수의인자 첫번째 : 베지어곡선의차수 ( 컨트롤포인트 1) 두번째 : 커브를구성하는점의개수 세번째 : 컨트롤포인트의좌표배열 네번째 : 커브를구성하는점의좌표가저장된배열

실습 13-1 알고리즘을통한베지어곡선그리기 위에서설명한베지어곡선알고리즘을사용하여, 곡선을그려볼것이다. 왼쪽마우스버튼을이용해컨트롤폴리곤을그리고, 오른쪽마우스버튼을통해컨트롤폴리곤을완성하는동시에커브를그리게할것이다. 메뉴와툴바에컨트롤폴리곤과곡선보기를만들어, 선을보였다가감추는기능을만들것이다.

실습 13-1 실행화면 컨트롤폴리곤감추기 베지어곡선감추기

실습 13-1 프로그램작성순서 1) SDI 기반의프로젝트를생성한다. 2) 메뉴와툴바를추가한다. 선보이기 / 감추기메뉴와툴바를추가한다. 3) 프로그램에서사용될멤버변수를추가한다. 프로그램의상태, 선의색상, 기타플래그변수들을추가한다. 변수의초기화및프로그램의초기상태를설정 4) 컨트롤폴리곤과베지어곡선을그리는함수를작성한다.

실습 13-1 5) 마우스이벤트에대한메시지핸들러함수를작성한다. 왼쪽마우스메시지핸들러함수작성. 마우스이동에대한메시지핸들러함수작성. 오른쪽마우스메시지핸들러함수작성. 6) 사용자인터페이스메시지를처리한다. 그리기모드로전환하는메뉴를처리한다. 컨트롤폴리곤을보이기 / 감추기하는메뉴를처리한다. 베지어곡선을보이기 / 감추기하는메뉴를처리한다. 7) 프로그램을실행시킨다.

실습 13-2 컨트롤포인트의이동및해상도설정 이번실습에서는 Practice13_1 프로그램을수정하여, 곡선의컨트롤포인트를마우스의드래깅으로이동하여곡선을업데이트하도록할것이고, 곡선을구성하는선들의개수를사용자인터페이스를통해지정하여곡선의해상도를조정해볼것이다.

실습 13-2 실행화면 해상도 8 로변경 해상도 32 로변경 컨트롤포인트이동

실습 13-2 프로그램작성순서 1) Project13_1 을연다. 2) 사용자인터페이스를추가한다. 컨트롤포인트이동메뉴와툴바를추가한다. 곡선의해상도조정메뉴를추가한다. 3) 곡선의해상도설정을위한함수를생성한다. 곡성의해상도를저장할멤버변수를추가한다. 해상도 8, 16, 32 로설정하는함수를만든다.

실습 13-2 4) 컨트롤포인트이동을위한마우스이벤트함수를수정한다. 컨트롤포인트선택및이동에필요한멤버변수를추가한다. 프로그램을이동모드를전환하는메뉴의메시지핸들러함수를생성한다. OnLButtonDown() 함수를수정한다. OnMouseMove() 함수를수정한다. OnLButtonUp() 함수를추가한다. 5) 프로그램을실행시킨다.

연습문제 13-1 실습프로젝트에다음의기능을추가한다. 컨트롤폴리곤의색상을변경하는기능 베지어곡선의색상을변경하는기능 요구사항 메뉴와툴바를생성한다. 색상공용상자를이용한다. 대화상자의 [ 확인 ] 버튼을누르면색상이바로전환된다.

연습문제 13-1 실행결과 색상변경하기전화면 색상변경하기후화면

CPractice13_1View::CPractice13_1View() m_nctrlpointnum = 0; m_colorpolygon = RGB(200, 200, 200); // 컨트롤폴리곤의색상 - 밝은회색 m_colorcurve = RGB(255, 0, 0);// 베이지곡선의색상설정 - 빨강색 m_colorpoint = RGB(0, 0, 255);// 컨트롤포인트의색상 - 파란색 m_bstart = FALSE; m_nmode = ID_MODE_NONE;// 프로그램모드를초기상태로설정 m_bvisiblepolygon = TRUE;// 컨트롤폴리곤이보이도록설정 m_bvisiblecurve = TRUE;// 베지어곡선이보이도록설정 for( int i = 0; i < 50; i++ )// 컨트롤포인트의좌표배열초기화 m_ptcontrol[i] = 0; m_nresolution = 16; m_bselectedpoint = FALSE;

void CPractice13_1View::OnDraw(CDC* pdc) CPractice13_1Doc* pdoc = GetDocument(); ASSERT_VALID(pDoc); if (!pdoc) return; // TODO: 여기에원시데이터에대한그리기코드를추가합니다. DrawControlPolygon(pDC, m_bvisiblepolygon); DrawBezierCurve(pDC, m_bvisiblecurve);

void CPractice13_1View::OnRButtonUp(UINT /* nflags */, CPoint point) void CPractice13_1View::OnRButtonUp(UINT /* nflags */, CPoint point) ClientToScreen(&point); OnContextMenu(this, point);

void CPractice13_1View::DrawControlPolygon(CDC* pdc, bool bdrawline) CRect rectpoint; CPen CtrlPointPen, PolygonPen, *OldPen; CtrlPointPen.CreatePen(PS_SOLID, 3, m_colorpoint); PolygonPen.CreatePen(PS_SOLID, 1, m_colorpolygon); OldPen = pdc->selectobject(&ctrlpointpen); if( bdrawline ) for( int i = 0; i < m_nctrlpointnum; i++ ) rectpoint = CRect(m_ptControl[i].x-4, m_ptcontrol[i].y-4, m_ptcontrol[i].x+4, m_ptcontrol[i].y+4); pdc->selectobject(&ctrlpointpen); pdc->ellipse(&rectpoint); pdc->selectobject(&polygonpen); pdc->polyline(m_ptcontrol, m_nctrlpointnum); pdc->selectobject(oldpen); DeleteObject(CtrlPointPen); DeleteObject(PolygonPen);

CPoint CPractice13_1View::ComputeCurvePoint(int ndegree, CPoint AryCtrlPoint[], float fdelta) CPoint faryctrlpoint[30]; float fdelta_t; fdelta_t = 1.0f - fdelta; for( int i = 0; i <= ndegree; i++ ) faryctrlpoint[i] = AryCtrlPoint[i]; for( int r = 1; r <= ndegree; r++) for(int i = 0; i <= ndegree-r; i++ ) faryctrlpoint[i].x = (int)(fdelta_t * (float)faryctrlpoint[i].x + fdelta * (float)faryctrlpoint[i+1].x); faryctrlpoint[i].y = (int)(fdelta_t * (float)faryctrlpoint[i].y + fdelta * (float)faryctrlpoint[i+1].y); return faryctrlpoint[0];

void CPractice13_1View::CreateCurvePoint(int ndegree, int npointnum, CPoint ptcontrol[], CPoint ptcurve[]) float fdelta, t; fdelta = 1.0f/(float)(nPointNum); t = 0.0f; for( int i = 0; i <= npointnum; i++ ) ptcurve[i] = ComputeCurvePoint(nDegree, ptcontrol, t); t = t + fdelta;

void CPractice13_1View::DrawBezierCurve(CDC* pdc, bool bline) CPen CurvePen, *OldPen; CurvePen.CreatePen(PS_SOLID, 1, m_colorcurve); OldPen = pdc->selectobject(&curvepen); if( m_nctrlpointnum > 1 ) // 매개변수의 20 을 m_nresolution 으로변경 CreateCurvePoint(m_nCtrlPointNum-1, m_nresolution, m_ptcontrol, m_ptcurve); if( bline ) pdc->polyline(m_ptcurve, m_nresolution + 1); pdc->selectobject(oldpen); DeleteObject(CurvePen);

void CPractice13_1View::OnLButtonDown(UINT nflags, CPoint point) if(m_nmode == ID_MODE_DRAW) // 다시그리기또는처음그리는경우이면 --- 초기화. if(m_bstart == FALSE) m_nctrlpointnum = 0; for( int i = 0; i < 50; i++ ) m_ptcontrol[i] = 0; Invalidate(); // 뷰를갱신한다. CRect rectpoint(point.x - 4, point.y - 4, point.x + 4, point.y + 4); // 선택한지점에컨트롤포인트를그린다. CClientDC dc(this); CPen NewPen, *OldPen; NewPen.CreatePen(PS_SOLID, 3, m_colorpoint); OldPen = dc.selectobject(&newpen); dc.ellipse(&rectpoint); dc.selectobject(oldpen); DeleteObject(NewPen);

void CPractice13_1View::OnLButtonDown(UINT nflags, CPoint point) // 러버밴드구현을위한임시저장 m_ptorigin = m_ptprev = point; // 현재좌표값을배열에저장 m_ptcontrol[m_nctrlpointnum++] = point; // 마우스캡쳐 SetCapture(); RECT rectclient; GetClientRect(&rectClient); ClientToScreen(&rectClient); // 마우스이동범위를클라이언트영역으로제한 ::ClipCursor(&rectClient); // 선을그리기시작했음을저장 m_bstart = TRUE; // 현재점의선택및이동모드이면 if ( m_nmode == ID_MODE_MOVE ) // 반복문을통해배열안에점의좌표를검색한다. for(int i = 0; i < m_nctrlpointnum; i++ )

void CPractice13_1View::OnLButtonDown(UINT nflags, CPoint point) // 각좌표로부터선택영역을지정한다.( 사각형구조체 ) CRect rectpoint(m_ptcontrol[i].x - 4, m_ptcontrol[i].y - 4, m_ptcontrol[i].x + 4, m_ptcontrol[i].y + 4); // 위에서정의한사각형영역에들어와있다면... if ( rectpoint.ptinrect( point ) ) // 점이선택되었음을저장 m_bselectedpoint = TRUE; // 선택된점의인덱스를저장 m_nselectedpointindex = i; // 마우스를캡쳐하고마우스이동범위를클라이언트영역으로제한한다. SetCapture(); RECT rectclient; GetClientRect(&rectClient); ClientToScreen(&rectClient); ::ClipCursor(&rectClient); Invalidate();// 뷰를갱신한다.

void CPractice13_1View::OnMouseMove(UINT nflags, CPoint point) CClientDC dc(this); // 현재그리기모드이면 if( m_nmode == ID_MODE_DRAW ) // 러버밴드동작이시작되었으면 if( m_bstart ) dc.setrop2(r2_not); dc.moveto(m_ptorigin); dc.lineto(m_ptprev); dc.moveto(m_ptorigin); dc.lineto(point); m_ptprev = point;

void CPractice13_1View::OnMouseMove(UINT nflags, CPoint point) // 현재점의선택및이동모드이면 if ( m_nmode == ID_MODE_MOVE ) CRect rectclient; GetClientRect(&rectClient); // 왼쪽마우스버튼으로점이선택되었다면 if ( m_bselectedpoint ) // 선택된점의좌표를현재좌표값으로치환 m_ptcontrol[m_nselectedpointindex] = point; // 뷰의갱신 InvalidateRect(&rectClient, TRUE);

void CPractice13_1View::OnRButtonDown(UINT nflags, CPoint point) if( m_nmode == ID_MODE_DRAW ) // 현재저장된점들의수가 PolyBezier() 함수가요구하는 // 점의개수와동일하면 if( m_nctrlpointnum > 1 ) // 선그리기가시작되었다면... if( m_bstart ) // 오른쪽을눌러서마지막점을저장 m_ptcontrol[m_nctrlpointnum++] = point; // 마지막점의컨트롤포인트를그림다. CRect rectpoint(point.x - 4, point.y - 4, point.x + 4, point.y + 4); CClientDC dc(this); CPen NewPen, *OldPen; NewPen.CreatePen(PS_SOLID, 3, m_colorpoint); OldPen = dc.selectobject(&newpen); dc.ellipse(&rectpoint); dc.selectobject(oldpen); DeleteObject(NewPen);

void CPractice13_1View::OnRButtonDown(UINT nflags, CPoint point) DrawControlPolygon(&dc, m_bvisiblepolygon); // 베지어곡선을완성한다. DrawBezierCurve(&dc, m_bvisiblecurve); //dc.polybezier(m_pointarray, m_npointnum); // 그리기작업의끝을저장한다. m_bstart = FALSE; // 마우스캡쳐와제한을해제한다. ::ReleaseCapture(); ::ClipCursor(NULL); else AfxMessageBox(_T(" 적어도 2 개이상의컨트롤포인트가있어야합니다 "));

void CPractice13_1View::OnDrawBezier() // TODO: 여기에명령처리기코드를추가합니다. m_nctrlpointnum = 0; m_bstart = FALSE; for( int i = 0; i < 50; i++ ) m_ptcontrol[i] = 0; m_nmode = ID_MODE_DRAW; Invalidate();

void CPractice13_1View::OnViewPolygon() // TODO: 여기에명령처리기코드를추가합니다. m_bvisiblepolygon =!m_bvisiblepolygon; Invalidate();

void CPractice13_1View::OnViewCurve() // TODO: 여기에명령처리기코드를추가합니다. m_bvisiblecurve =!m_bvisiblecurve; Invalidate();

void CPractice13_1View::OnUpdateViewPolygon(CCmdUI *pcmdui) // TODO: 여기에명령업데이트 UI 처리기코드를추가합니다. pcmdui->setcheck(m_bvisiblepolygon);

void CPractice13_1View::OnUpdateViewCurve(CCmdUI *pcmdui) // TODO: 여기에명령업데이트 UI 처리기코드를추가합니다. pcmdui->setcheck(m_bvisiblecurve);

void CPractice13_1View::OnCurveRes8() // TODO: 여기에명령처리기코드를추가합니다. m_nresolution = 8; Invalidate();

void CPractice13_1View::OnCurveRes16() // TODO: 여기에명령처리기코드를추가합니다. m_nresolution = 16; Invalidate();

void CPractice13_1View::OnCurveRes32() // TODO: 여기에명령처리기코드를추가합니다. m_nresolution = 32; Invalidate(); void CPractice13_1View::OnSelectPoint() // TODO: 여기에명령처리기코드를추가합니다. m_nmode = ID_MODE_MOVE; m_bvisiblepolygon = TRUE; Invalidate();

void CPractice13_1View::OnLButtonUp(UINT nflags, CPoint point) // TODO: 여기에메시지처리기코드를추가및 / 또는기본값을호출합니다. CClientDC dc(this); // 현재점의선택및이동모드이면 if( m_nmode == ID_MODE_MOVE ) // 현재점이선택되어져있다면... if( m_bselectedpoint ) // 선택된점의좌표를현재좌표값으로치환 m_ptcontrol[m_nselectedpointindex] = point; dc.setrop2(r2_copypen); DrawControlPolygon(&dc, m_bvisiblepolygon);// 컨트롤폴리곤을그림 DrawBezierCurve(&dc, m_bvisiblecurve); // 베지어곡선을그림 m_bselectedpoint = FALSE; ::ReleaseCapture();// 마우스캡쳐를해제 ::ClipCursor(NULL);// 마우스클립을해제 Invalidate();// 뷰를갱신

void CPractice13_1View::OnColorPolygon() // TODO: 여기에명령처리기코드를추가합니다. CColorDialog dlgcolorcontrol; if( dlgcolorcontrol.domodal() == IDOK ) m_colorpolygon = dlgcolorcontrol.getcolor(); Invalidate(); void CPractice13_1View::OnColorCurve() // TODO: 여기에명령처리기코드를추가합니다. CColorDialog dlgcolorcurve; if( dlgcolorcurve.domodal() == IDOK ) m_colorcurve = dlgcolorcurve.getcolor(); Invalidate();