Опубликован: 10.03.2009 | Доступ: свободный | Студентов: 2297 / 280 | Оценка: 4.31 / 4.07 | Длительность: 09:23:00
Лекция 5:

Разработка полноценных Windows-приложений

Приложение "Шифр "Виженера"

В данном параграфе, на примере написания приложения "Шифр Виженера", рассматриваются следующие вопросы: работа с классом CRichEdit, ввод и форматирование текста, сохранение форматированного текста в файл, работа с модальными диалоговыми окнами, работа с таймером и элементом управления "индикатор хода процесса".

Постановка задачи. Теоретический материал

Алгоритм шифрования Виженера

Пусть у нас есть текст. Все буквы текста принадлежат алфавиту A=(a1,...,an), где ai - i -ый символ алфавита. Требуется зашифровать этот текст по алгоритму Виженера. Шифр Виженера - это шифр простой замены, с секретным ключом. Шифрование происходит по формуле xi->ci=xi+ei(mod k)(mod n), а дешифрование по формуле ci->xi=ci+ei(mod k)(mod n), где n - число символов в алфавите, k - число символов в секретном слове (ключе), x - i -ый символ открытого текста, c - i -ый символ шифрованного текста.

Задача. Написать приложение для реализации шифрования текста по алгоритму Вижинера.В приложении должна быть:

  1. реализована возможность ввода, редактирование, форматирование открытого (зашифрованного) текста;
  2. реализована возможность выполнения операции шифрования (дешифрования) по алгоритму Вижинера;
  3. реализована возможность сохранения форматированного текста в файл.

В качестве алфавита в программе будем использовать наиболее распространенные печатные символы ASCII кодировки. Для работы с текстом будем использовать специализированный класс CRichEditCtrl.

Специализированные классы MFC для работы с текстом

MFC предоставляет два основных средства редактирования текста. Это - обычное поле ввода (Edit Control) и поле ввода с форматированием (Rich Edit Control). Ими можно воспользоваться как элементами управления в диалоговых окнах, а можно создавать на их основе окна представлений, как в стандартных текстовых редакторах Windows: Notepad и WordPad. Такую гибкость обеспечивают классы CEditView и CRichEditView.

Класс CEditView

В основе этого класса - элемент управления Windows поле ввода. Мастер MFC Application Wizard позволяет наследовать ваш собственный класс "вида" от CEditView. При работе с объектами класса CEditView доступны все методы классов CView и CEdit.Множественное наследование здесь не применяется. Размер текста обрабатываемого данным классом по умолчанию ограничен - не более 1048575 символов, его можно изменить, отправив сообщение EM_LIMITTEXT. Класс CEditView имеет следующие ограничения:

  • CEditView не поддерживает WYSIWYG редактирование. В случае, когда стоит выбор между читаемостью текста на дисплее и соответствию размеров при печати, CEditView отобразит текст в соответствии с первым критерием.
  • CEditView может отображать текст только в одном формате. Нет специализированной поддержки шрифтов.
  • Существуют ограничения на количество вводимых символов.

Класс CRichEditView

Этот класс базируется на элементе управления "поле ввода с форматированием". Элемент управления "поле ввода с форматированием" - окно, в которое пользователь может вводить и редактировать текст. Данный элемент управления позволяет работать с форматированным текстом и встроенными OLE объектами, предоставляет методы для управления параметрами шрифтов и абзацев, поддерживает большие объемы текста. Класс CRichEditView предназначен для совместного использования с классом CRichEditDoc и CRichEdiCtrl, что позволяет создавать полноценные контейнерные приложения ActiveX.

Класс CRichEditCtrl

Этот класс представляет собой оболочку для элемента управления "поле ввода с форматированием". В нем переопределены обработчики сообщений клавиатуры и мыши для ввода и редактирования текстовой информации. Также он предоставляет множество методов для работы с текстом. Рассмотрим их подробнее.

1. Методы для создания объектов CRichEditCtrl

Метод virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) создает окно элемента управления "поле ввода с форматированием" и связывает его с классом CRichEditCtrl. Параметр dwStyle задает набор флагов, определяющих стиль окна, rect задает оконный прямоугольник, pParentWnd - указатель на родительское окно (если метод Create(…) вызывается в диалоговом окне, то параметр pParentWnd должен иметь значение NULL ), nID - идентификатор окна. Если поле ввода с форматированием используется в диалоговом окне, то в функции InitInstance класса приложения необходимо вызвать функцию AfxInitReichEdit() для того, чтобы загрузить необходимые библиотеки элементов управления.

2 Методы управления строками

Метод int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const копирует строку, номер которой указан в параметре nIndex в буфер lpszBuffer длиной в nMaxLength символов. Скопированная строка не содержит в конце символа окончания строки.

Метод int GetLineCount() const возвращает количество строк в текстовом поле.

Метод int LineLength(int nLine = -1) const возвращает длину строки в байтах, номер которой указан в параметре nLine, по умолчанию возвращает длину строки, содержащей каретку.

3. Методы выделения текста

Метод void Clear() удаляет выделенный текст.

Метод void GetSel(long& nStartChar, long& nEndChar) const записывает границы выделенного текста в переменные nStartChar (начало) и nEndChar (конец).

Метод CString GetSelText( ) const возвращает объект-строку с выделенным текстом.

Метод void SetSel(long nStartChar, long nEndChar) выделяет текст, начало выделения передается в параметре nStartSel, конец - в параметре nEndSel.

4. Методы форматирования текста

Метод DWORD GetDefaultCharFormat(CHARFORMAT& cf) const возвращает в параметр cf формат символов, принятый текстовым полем по умолчанию.

Метод DWORD GetSelectionCharFormat(CHARFORMAT& cf) const возвращает в параметр cf формат выделенного текста.

Метод BOOL SetDefaultCharFormat(CHARFORMAT& cf) устанавливает формат символов, который текстовое поле будет использовать по умолчанию. Параметр cf определяет устанавливаемый формат.

Метод BOOL SetSelectionCharFormat(CHARFORMAT& cf) устанавливает формат выделенных в текстовом поле символов, указанный в параметре cf.

Все вышеуказанные методы требуют в качестве параметра ссылку на объект структуры CHARFORMAT.Поля данной структуры подробнее рассмотрены далее.

5 Методы работы с потоками

Метод StreamIn(int nFormat, EDITSTREAM& es) предназначен для чтения данных из потока. Параметр nFormat определяет формат читаемых данных, может принимать значения: SF_TEXT и SF_RTF. В первом случае прочтенные данные воспринимаются как неформатированный текст, во втором - как форматированный. Параметр es определяет поток, из которого следует читать информацию, имеет тип EDITSTREAM.

Метод StreamOut(int nFormat, EDITSTREAM& es) предназначен для записи данных в поток. Имеет такой же набор аргументов, как и предыдущий метод.

Закончим на этом рассмотрение специализированных методов класса CRichEditCtrl для работы с текстом. Их применение будет продемонстрировано ниже в примере "Шифр Виженера".