Казахстан |
Разработка полноценных 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 -ый символ шифрованного текста.
Задача. Написать приложение для реализации шифрования текста по алгоритму Вижинера.В приложении должна быть:
- реализована возможность ввода, редактирование, форматирование открытого (зашифрованного) текста;
- реализована возможность выполнения операции шифрования (дешифрования) по алгоритму Вижинера;
- реализована возможность сохранения форматированного текста в файл.
В качестве алфавита в программе будем использовать наиболее распространенные печатные символы 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 для работы с текстом. Их применение будет продемонстрировано ниже в примере "Шифр Виженера".