연습문제 (4)

단국대학교 멀티미디어공학전공 HCI프로그래밍 II (2012년 가을학기) 연습

□ 단원 : C# WinForm

□ 목표 : 상속 & Collections & FileIO & Controls & GDI+ & Dialog & XML

□ 주요 연습 내용 : RSS Feed, string, Listview, PictureBox, Paint, Print

□ 준비자료 : QuakeData.cs, 실시간 지진데이터 사이트, Resources(아이콘＆ 이미지)

[연습문제] Ex4 (Due by 12/07 금 24시까지)

-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex4.zip으로 묶어서 낼 것. 보고서 (30%)

[연습문제]

1. Form1.cs (메인 폼)에 툴바와 각종 컨트롤을 추가한다. (10%)

메인폼(Form1)

-Text 속성은 Latest Earthquake Rss Feed

-Size 속성은 800,600

-toolStrip1 : 툴바

-listView1 : 리스트뷰

-imageList1 : 이미지 리스트

-openFileDialog1 : 파일열기 대화상자

-saveFileDialog1 : 파일저장 대화상자

툴바(toolStrip1)

-버튼1 (toolStripButton1): 종료, Image 속성은 close.ico, ImageScaling 속성은 None

-버튼2 (toolStripButton2): 피드, Image 속성은 feed.ico, ImageScaling 속성은 None

-버튼3 (toolStripButton3): 읽기, Image 속성은 opened.ico,

ImageScaling 속성은 None

-버튼4 (toolStripButton4) : 저장, Image 속성은 save.ico, ImageScaling 속성은 None

-콤보박스 (toolStripCombobox1) : Font 속성에 15포인트,

Items 속성에 LargeIcon, Details, SmallIcon, List, Tile

-버튼5 (toolStripButton5) : 지도보기, Image 속성은 earth.ico,

ImageScaling 속성은 None, Alignment 속성은 Right

리스트뷰(listView1)

-Columns 속성은 Magnitude – Location, Time, Latitude, Longitude, Depth, Magnitude

-View 속성은 Details

-LargeImageList 속성은 imageList1

-SmallImageList 속성은 imageList1

-FullRowSelect 속성은 True

-GridLines 속성은 True

-Anchor 속성은 Top, Bottom, Left, Right

이미지리스트(imageList1)

-ColorDepth 속성은 Depth32Bit

-ImageSize 속성은 128,128

2. Form2.cs (지도 폼)에 툴바와 각종 컨트롤을 추가한다. (10%)

지도폼(Form2)

-Text 속성은 Latest Earthquake Rss Map

-Size 속성은 800,600

-toolStrip1 : 툴바

-pictureBox1 : 픽쳐박스

-printDialog1 : 프린터 대화상자

-printDocument1 : 프린트문서

툴바(toolStrip1)

-toolStripButton1 : 출력, Image 속성은 print_printer.ico, ImageScaling 속성은 None

픽쳐박스(pictureBox1)

-Image & ErrorImage 속성은 2_no_clouds_2K.jpg

-SizeMode 속성은 StretchImage

-Anchor 속성은 Top, Bottom, Left, Right

3. Form1.cs에 각종 이벤트 핸들러를 추가한다. RssQuakeDataManager.cs를 사용함. (20%)

- public List<RssFeedItem> rssFeedList = null;

- public List<QuakeData> quakeDataList = null;

- Form2 mapView = null;

그리고 메소드는 다음을 포함한다.

- private void Form1_Load(object sender, EventArgs e) { ... } // 폼 로드 이벤트 핸들러 안에는 toolStripComboxBox1.SelectedIndex=1 지정

- private void toolStripButton1_Click(object sender, EventArgs e) { ... } // Close 버튼 이벤트 핸들러  – 프로그램 종료

- private void toolStripButton2_Click(object sender, EventArgs e) { ... } // Rss 버튼 이벤트 핸들러 - RssFeed()

private void RssFeed() // RssFeed – RssQuakeDataManager.ReadRssFeed 읽어들여 RssQuakeDataManager.ParseRssFeed 파싱해서 데이터를 로딩하고 listView1와 pictureBox1를 update

private void toolStripButton5_Click(object sender, EventArgs e) { ...} // Mapview 버튼 이벤트 핸들러 - quakeDataList 데이터를 지도상에서 볼 수 있도록 비모달형 대화상자 (Modeless Dialog)인 Form2를 생성하여 연동

- private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e) { ...} // View 콤보박스  인덱스 선택 이벤트 핸들러 – item을 선택했을 시 listView1.View 속성을 변경

- private void listView1_SelectedIndexChanged(object sender, EventArgs e) { ...} // listView1 인덱스 선택 이벤트 핸들러 – item을 선택했을 시, 웹(InternetExplorer)를 실행

RssQuakeDataManager.cs 파일에는 정적 메소드 ReadRssFeed, ParseRssFeed를 구현한다. Form1의 RssFeed()에서 사용됨.

- public static List<RssFeedItem> ReadRssFeed(string url) { ...} // ReadRssFeed (xml => RssFeedItem 리스트로)

- public static List<QuakeData> ParseRssFeed(List<RssFeedItem> rssList, ref ImageList imageList) { ...} // ParseRssFeed (RssFeedItem’s Description => QuakeData 리스트로)

4. 비모달형 대화상자 (Modeless Dialog)인 Form2.cs에 각종 이벤트 핸들러를 추가한다. (10%)

- private void Form2_Load(object sender, EventArgs e) { ... } // 폼 로드 이벤트 핸들러 – 로드 시 픽쳐박스가 그려지도록 pixtureBox1.Invalidate()

- private void Form2_Resize(object sender, EventArgs e) { ... } // 폼 크기변경 이벤트 핸들러 – 크기변경 후 픽쳐박스가 그려지도록 pixtureBox1.Invalidate()

- private void pictureBox1_Paint(object sender, PaintEventArgs e) { ... } // 픽쳐박스 페인트 이벤트 핸들러 –  픽쳐박스가 그려지도록 비트맵을 생성하여 그림

- private void toolStripButton1_Click(object sender, EventArgs e) { ... } // Print 버튼 이벤트 핸들러 – 선택한 프린터로 보내어 printDocument1.Print() 프린트문서를 출력

- private void printDocument1_PrintPage(object sender, EventArgs e) { ... } // printDocument1의 PrintPage 버튼 이벤트 핸들러 – 프린트문서로 화면을 비트맵으로 생성하여 그려줌

5. Form1.cs의 listView1에 칼럼 클릭시 데이터 정렬되는 이벤트 핸들러를 추가한다. (10점)

- private void listView1_ColumnClick(object sender, EventArgs e) { ... }// 리스트컬럼클릭 - 클릭된 컬럼을 기준으로 정렬 (ListViewItemComparer를 사용, 그리고 RssQuakeDataManager의 SortList와 listView의 SortListView를 사용

- private void SortListView(int index) { ... } // 리스트뷰의 정렬 (ListViewItemComparer.cs 사용)

ListViewItemComparer.cs 파일에는 IComparer 인터페이스를 상속받은 클래스를 구현한다. (힌트: http://msdn.microsoft.com/en-us/library/ms996467.aspx)

- class ListViewItemComparer : IComparer

{ public enum SortType : int { Text, Number, DateTime }

public ListViewItemComparer(int column, SortType type) // 내부구현 필요

public int Compare(object x, object y) // 내부구현 필요 }

RssQuakeDataManager.cs에 메소드를 추가한다.

- public static void SortList(List<QuakeData> quakeList, int index) { // 내부구현필요 }// QuakeData를 Sort

QuakeDataComparer.cs 파일에는 IComparer<QuakeData> 인터페이스를 상속받은 각종 비교 클래스들을 구현한다.  RssQuakeDataManager의 SortList에서 사용.

- class QuakeDateTimeComparer : IComparer<QuakeData>

{ public int Compare(QuakeData x, QuakeData y) // 내부구현 필요 }

- class QuakeLatComparer : IComparer<QuakeData>

{ public int Compare(QuakeData x, QuakeData y) // 내부구현 필요 }

- class QuakeLonComparer : IComparer<QuakeData>

{ public int Compare(QuakeData x, QuakeData y) // 내부구현 필요 }

- class QuakeDepthComparer : IComparer<QuakeData>

{ public int Compare(QuakeData x, QuakeData y) // 내부구현 필요 }

- class QuakeMagnitudeComparer : IComparer<QuakeData>

{ public int Compare(QuakeData x, QuakeData y) // 내부구현 필요 }

6. Form1.cs의 툴바에 파일입출력 열기/저장 버튼클릭 이벤트 핸들러를 추가한다. (10점)

- private void toolStripButton3_Click(object sender, EventArgs e) { ... } // Open 버튼 이벤트 핸들러 - 파일을 읽어서 파싱해서 quakeDataList에 데이터를 로딩하고 listView1와 pictureBox1를 update

- private void toolStripButton4_Click(object sender, EventArgs e) { ...} // Save 버튼 이벤트 핸들러 - quakeDataList 데이터를 파일에 저장

RssQuakeDataManager.cs에 메소드를 추가한다.

- public static List<QuakeData> LoadFile(string path) { // 내부구현필요 } // semicolon separated value 파일을 읽어서, QuakeData를 quakeDataList에 추가 & StreamReader 사용

- public static void WriteFile(List<QuakeData> quakeList, string path) { // 내부구현 필요 } // quakeDataList의 모든 QuakeData를 semicolon separated value 파일로 저장 & StreamWriter 사용

7. 본인이 원하는 기능을 더 추가하고, 결과를 모두 출력해서 넣는다. (보고서 점수에 포함)

결과예시: