public int ComboBox(List <string> items, CursorPoint cursor, string blankString) { int choice = 0, inputKey; while (true) { // 현재 선택 중인 문자열을 출력 Console.SetCursorPosition(cursor.CursorLeft, cursor.CursorTop); Console.Write(blankString); Console.SetCursorPosition(cursor.CursorLeft, cursor.CursorTop); Console.Write(items[choice]); inputKey = inputProcessor.PressDirectionKey(); switch (inputKey) { case ConstNumber.LEFT: case ConstNumber.UP: choice--; break; case ConstNumber.RIGHT: case ConstNumber.DOWN: choice++; break; case ConstNumber.ESC: return(ConstNumber.ESC); // Enter가 입력되면 선택 인덱스를 출력 default: return(choice); } // 선택 범위 제한 if (choice < 0) { choice = 0; } if (choice >= items.Count) { choice = items.Count - 1; } } }
// 문자열을 읽어오면서 동시에 문자열이 조건을 충족하는지 확인하여 반환한다. // letterLimit : 최대 글자 수, screenHeight : 출력화면 높이 // cursorLeft : 입력받기 시작하는 위치(x좌표), cursorTop : 입력받기 시작하는 위치(y좌표) // format : 포맷에 따라 문자 입력에 제한을 둠 public string ReadAndCheckString(int letterLimit, int screenHeight, CursorPoint cursor, int format) { string input = ""; ConsoleKeyInfo inputKey; // 이전 출력된 글자 지우기 for (int iter = 0; iter < letterLimit; iter++) { Console.Write(" "); } Console.SetCursorPosition(cursor.CursorLeft, cursor.CursorTop); while (true) { // 문자열을 입력받으며 각각의 문자에 대해 검사함 while (true) { inputKey = Console.ReadKey(true); if (inputKey.Key == ConsoleKey.Escape) { return(null); } else if (inputKey.Key == ConsoleKey.Enter) { break; } else if (inputKey.Key == ConsoleKey.Backspace) { int bytes; if (input.Length != 0) { bytes = Encoding.Default.GetBytes(input.Last() + "").Length; Console.SetCursorPosition(Console.CursorLeft - bytes, Console.CursorTop); if (bytes == 2) { Console.Write(" "); } else { Console.Write(" "); } Console.SetCursorPosition(Console.CursorLeft - bytes, Console.CursorTop); if (input.Length > 0) { input = input.Remove(input.Length - 1); } if (cursor.CursorLeft > Console.CursorLeft) { Console.SetCursorPosition(cursor.CursorLeft, Console.CursorTop); } } } else { // 글자 수가 제한 수를 넘지 않았다면 if (input.Length < letterLimit) { // 포맷 제한에 따라 문자를 입력받는다 if (format == ConstNumber.GENERAL_LIMIT) { if (inputKey.KeyChar >= 33 && inputKey.KeyChar <= 126 || IsPerfectHangleChar(inputKey.KeyChar)) { Console.Write(inputKey.KeyChar); input += inputKey.KeyChar; } } else if (format == ConstNumber.NUMBER_LIMIT) { if (inputKey.KeyChar >= '0' && inputKey.KeyChar <= '9') { Console.Write(inputKey.KeyChar); input += inputKey.KeyChar; } } } } } // 입력되지 않은 경우 다시 입력 if (input.Length == 0) { // 입력되면서 화면에 표시되었던 문자열을 지우고 커서를 다시 위치시킨다. Console.SetCursorPosition(5, screenHeight - 2); Console.WriteLine("잘못된 입력 : 입력되지 않음"); Console.SetCursorPosition(cursor.CursorLeft, cursor.CursorTop); Console.Write(" "); Console.SetCursorPosition(cursor.CursorLeft, cursor.CursorTop); continue; } // 입력된 문자열을 반환한다. return(input); } }
public string[] LectureListHeaderScreen() { int choice = 0, screenHeight; string[] conditions = new string[] { "전체", "전체", "전체", "전체", "전체" }; // 커서 좌표 배열 CursorPoint[] titlePosition = new CursorPoint[] { new CursorPoint(17, 1), new CursorPoint(46, 1), new CursorPoint(95, 1), new CursorPoint(117, 1), new CursorPoint(131, 1), new CursorPoint(169, 1) }; // 전공 목록 생성 List <string> majorItems = new List <string>(new string[] { "전체", "컴퓨터공학과", "정보보호학과", "디지털콘텐츠학과", "소프트웨어학과" }); // 학년 목록 생성 List <string> gradeItems = new List <string>(new string[] { "전체", "1", "2", "3", "4" }); screenHeight = ConsoleUI.PrintLectureListHeader(); while (true) { while (true) { // 엔터가 눌렸는지에 대한 상태변수 bool isPressedEnter = false; // 선택된 위치로 커서 이동 Console.SetCursorPosition(titlePosition[choice].CursorLeft, titlePosition[choice].CursorTop); switch (inputProcessor.PressDirectionKey()) { case ConstNumber.ESC: return(null); case ConstNumber.UP: case ConstNumber.LEFT: choice--; break; case ConstNumber.DOWN: case ConstNumber.RIGHT: choice++; break; case ConstNumber.ENTER: isPressedEnter = true; break; } if (isPressedEnter) { break; } // 선택 범위 제한 if (choice < 0) { choice = 0; } if (choice >= 6) { choice = 5; } } // 현재 커서 위치 CursorPoint presentCursor = new CursorPoint(Console.CursorLeft, Console.CursorTop); int itemIndex; switch (choice) { case ConstNumber.MENULIST_1: itemIndex = ComboBox(majorItems, presentCursor, " "); if (itemIndex == -1) { return(null); } conditions[0] = majorItems[itemIndex]; break; case ConstNumber.MENULIST_2: conditions[1] = inputProcessor.ReadAndCheckString(30, screenHeight, presentCursor, ConstNumber.GENERAL_LIMIT); if (conditions[1] == null) { return(null); } break; case ConstNumber.MENULIST_3: conditions[2] = inputProcessor.ReadAndCheckString(6, screenHeight, presentCursor, ConstNumber.NUMBER_LIMIT); if (conditions[2] == null) { return(null); } break; case ConstNumber.MENULIST_4: itemIndex = ComboBox(gradeItems, presentCursor, " "); if (itemIndex == -1) { return(null); } conditions[3] = gradeItems[itemIndex]; break; case ConstNumber.MENULIST_5: conditions[4] = inputProcessor.ReadAndCheckString(30, screenHeight, presentCursor, ConstNumber.GENERAL_LIMIT); if (conditions[4] == null) { return(null); } break; case ConstNumber.MENULIST_6: return(conditions); } } }