Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Рекомендации по написанию программы.

Задание 1. Разработка программы редактирования файлов специализированного формата.

 

Исходные данные:

  1. Программа является оконным Windows32 приложением.
  2. Программа написана на языке Си++ в среде Visual C++ 6.0, VS.NET или VS2005.
  3. При написании программы используются только функции и структуры Win API32. Никаких других технологий или «надстроек» не должно быть использовано.

 

Требования к внешнему виду программы:

 

  1. Типовой рекомендуемый внешний вид приложения:

 

На рисунке нанесены условные обозначения, описанные далее.

Размер окна по вертикали и горизонтали может меняться пользователем, но он не может быть меньше размера 400 на 200 пикселей.

Позицию и размеры окна на момент выхода из программы необходимо сохранять в реестре. При старте программы их необходимо читать из реестра (если есть) и отображать окно в соответствующей позиции и с соответствующими размерами.

 

  1. Смысл программы сводится к поиску-открытию-редактированию-записи файлов специализированного формата.

Формат файла:

Заголовок

Элемент 1

Элемент 2

Элемент 3

Файл является текстовым, т.е. содержит только символы ASCII набора.

Расширение у файла может быть “txt”, “htm”, “html”, “php”.

Заголовок – строка “<!--start_bwc-->”, расположенная где-то в первой строке файла.

Любой элемент имеет следующий формат:

<!--start_edit type="####" name="$$$$$" body=”%%%”-->

где:

#### - тип элемента, может быть одним из:

- shorttext

- longtext

- image

$$$$$ - имя элемента, может быть любым текстом в одну строку

%%% - тело элемента, зависит от типа элемента.

Существует 3 типа элементов:

    1. Текст в одну строку.

Поле type=”shorttext”

Поле body содержит любую (одну) строку текста

    1. Текст в несколько строк.

Поле type=”longtext”

Поле body содержит любую текст в несколько строк

    1. Картинка в формате BMP

Поле type=”image”

Поле body содержит относительный путь к файлу с картинкой, например "img\1a.bmp"

Элементы следуют друг за другом. Между элементами может находиться любой текст, который не обрабатывается программой.

Редактируемыми элементами являются тексты (body) для элементов shorttext и longtext. Остальные элементы (как и текст вне элементов) не должны меняться при редактировании и сохранении файла.

 

  1. Программа содержит меню (желтый кружок с цифрой 1), в котором в удобной для разработчика форме представлены след. команды (в скобках указаны Hotkey комбинации клавиатуры - ускорители):

- сменить активный каталог (Ctrl+D)

- записать редактируемый файл (Ctrl+S)

- выйти из программы (Alt+F4)

- копировать выделенный текст в буфер (Ctrl+C)

- вырезать выделенный текст и поместить в буфер (Ctrl+X)

- вставить в указанное место (заменить выделенный текст) текстом из буфера (Ctrl+V)

- отменить последнюю операцию по вставке/замене (Ctrl+Z)

- вывод информации о программе и авторах

 

  1. Программа содержит Toolbar (желтый кружок с цифрой 2) со след элементами:

- сменить активный каталог

- записать редактируемый файл

- выйти из программы

- копировать выделенный текст в буфер

- вырезать выделенный текст и поместить в буфер

- вставить в указанное место (заменить выделенный текст) текстом из буфера

- отменить последнюю операцию по вставке/замене

 

  1. В правом поле программы отображены Элементы один за другим сверху вниз. Размер всех элементов одного формата фиксированный.

А) Для Элемента shorttext (желтый кружок с цифрой 3) это одна строка с именем элемента (лиловый кружок с буквой A) [не редактируемое] и поле с телом Элемента в одну строку (лиловый кружок с буквой B) [редактируемое].

Б) Для Элемента longtext (желтый кружок с цифрой 4) это одна строка с именем элемента (лиловый кружок с буквой A) [не редактируемое] и поле с телом Элемента в 4-6 строк (лиловый кружок с буквой B) [редактируемое].

В) Для Элемента image (желтый кружок с цифрой 5) это одна строка с именем элемента (лиловый кружок с буквой A) [не редактируемое] и поле с картинкой по ссылке, указанной в теле Элемента (лиловый кружок с буквой B) [не редактируемое].

Размер вывода тела для Элементов shorttext и longtext определяется текущим размером окна. В случае изменения горизонтальных размеров окна размер полей редактирования (лиловый кружок с буквой B) также изменяется программой автоматически.

 

  1. В левом поле программы отображено дерево с именами файлов и папок.

Вершиной дерева является текущий каталог, который может быть изменен (выбран) через меню или toolbar (сменить активный каталог).

Папки, расположенные в каталоге демонстрируются все.

   Файлы показываются только те, что задержат заголовок спец. формата.

Папки показываются отсортированными по алфавиту, и все папки расположены до файлов.

При клике мышкой на файле информация о его Элементах отображается в правой части.

При двойном клике на имя папки – она становится активным каталогом.

При двойном клике на папку “..” – родительская папка (если есть) становится активным каталогом.

Двойном клик на активный каталог воспринимается как команда меню “сменить активный каталог”.

При выходе из программы имя текущего активного каталога и активного (просматриваемого) файла сохраняются в реестре.

При старте программы информация об активном каталоге и активном файле берется из реестра (если есть).

 

  1. Если отображение всех элементов файла не помещается по вертикали, то у окна автоматически появляется scrollbar (желтый кружок с цифрой 7). Его настройки устанавливаются программой автоматически таким образом, чтобы при его использовании можно было увидеть все элементы в правой части окна (осуществлять прокрутку содержимого).

 

 

Рекомендации по написанию программы.

  1. Начальные действия.

Запустите Visual C++.

Menu -> File -> New -> Projects -> Win32 Application

Задайте Имя проекта и его расположение.

Выберите A Typical “Hello, World!” Application.

Для VS.NET или VS2005

Menu -> File -> New -> Projects -> Win32 Project

Задайте Имя проекта.

Проверьте, что в закладке Application Settings НЕ стоит галочка в пункте Empty Project

На закладке FileView в папке Source Files вы найдете два файла:

xxx.cpp

StdAfx.cpp

Файл xxx.cpp – это файл в котором представлен начальный код, сгенерированный для вас автоматически.

Файл StdAfx.cpp как и файл StdAfx.h создается и изменяется средой автоматически и у вас нет необходимости его

В папке Resources вы найдете файл

xxx.rc

Файл xxx.rc – это файл с ресурсами проекта (их редактирование осуществляется на закладке ResourceView)

менять

На закладке FileView в папке Header Files вы найдете три файла:

xxx.h

resource.h

StdAfx.h

Файл xxx.h – это файл в котором представлены прототипы функций и объявления глобальных данных; начальное содержимое этого файла также генерируется для вас автоматически.

Файл resource.h – это файл с константами, установленными для ваших ресурсов, которые необходимы для доступа к ресурсам из кода вашей программы (обычно этот файл изменяется средой автоматически и у вас нет необходимости его менять)

В процессе разработки программы рекомендуется использовать навыки построения проектов, полученные в пред. семестре. Т.е. при создании нового класса или набора связанных функций рекомендуется создавать пару файлов yyy.cpp и yyy.h и включать их в проект. Таким образом вы значительно улучшите «читаемость» кода программы и тем самым облегчите себе весь процесс разработки программы.

При таком подходе при включении файла yyy.cpp в проект разместите в верхней самой первой строке файла след. инструкцию:

#include "stdafx.h"

и при построении проекта запустите Rebuild All.

 

   В функции InitInstance добавьте вызов функции InitCommonControls, которая инициализирует библиотеку ComCtrl, т.к. у вас будут использованы как минимум два ее элемента. Так как по умолчанию библиотека Common Controls не подключается, необходимо сделать два дополнительных действия.

   - в верху файла вставить след. строку:

#include “commctrl.h”

   - в свойствах проекта в подпункте Linker (можно прямо в закладке Command Line) добавить файл

comctl32.lib

   Эти действия заставят линкер подключить функции библиотеки Common Control в ваш проект, а в H файле представлены прототипы функций и структур Common Control для того, чтобы компилятор мог их видеть. Если вы не выполните первое действие, то компилятор скажет, что не знает функцию InitCommonControls, а если второе, то Линкер будет ругаться, что не может слинковать функцию InitCommonControls (ее полное имя отличесется, но включает строку «InitCommonControls»).

 

  1. Так как программа должна обрабатывать файлы спец. формата и содержимого переменной длины, рекомендуется использовать классы со списками элементов.

Для хранения всех данных файла рекомендуется создать класс File и класс Item (элемент).

Для построения списков можно использовать либо поддержку списков внутри этих классов, либо добавить классы FileList и ItemList

Список файлов вам пригодится для отображения элементов в дереве файлов и каталогов и он же поможет получить доступ к информации выбранного файла для отображения в правой части окна.

Список элементов поможет вам отображать все элементы в правой части окна. Логично, чтобы File содержал указатель на вершину списка его элементов.

Не забывайте также, что File должен поддерживать механизм чтения его содержимого (и формирования списка элементов) и записи.

 

  1. Работа с файлами.

Для построения списка файлов рекомендуется использовать пару функций: _findfirst и _findnext и, соответственно структуру _finddata_t.

Не забывайте, что поиск надо осуществлять в активном каталоге.

Отбор файлов осуществляется по расширению, путем анализа поля Name в структуре _finddata_t и затем поиском заголовка в первой строке файла (рекомендуемые функции: fopen, fgets и strstr).

 

  1. Работа с Элементами файлов.

Для составления списка элементов рекомендуется загрузить (возможно, временно) весь файл целиком и осуществлять поиск элементов там функцией strstr.

Возможен след. вариант интерпретации информации файлов:

- для каждого элемента запоминается смещение от начала файла до начала и конца элемента.

- при сохранении эти маркеры используются для записи вся информация «между» элементами и самих элементов

 

  1. Отображение дерева файлов и папок.

Для отображения используйте TreeView Control.

Создание: CreateWindowEx с типом WC_TREEVIEW

Возможно, вам понадобится родительское окно для отображения дерева (зависит от подхода), тогда вам нужно зарегистрировать свой класс (RegisterClass, UnregisterClass), создать окно (CreateWindowEx) и указать его как родительское для окна-дерева.

Вам понадобиться список картинок для отображения элементов дерева с иконками. Он формируется след функциями: ImageList_Create, LoadImage, ImageList_Add, DeleteObject.

Вам понадобиться обрабатывать след. сообщения (в родительском или главном окне):

WM_NOTIFY с кодом TVN_SELCHANGED (здесь нужны лишь обработки действий TVC_BYKEYBOARD и TVC_BYMOUSE, которые находятся в структуре NM_TREEVIEW, указатель на которую передается как lParam для сообщения) и NM_DBLCLK (код находится в структуре NMHDR, указатель на которую в свою очередь передается как lParam для сообщения) и, возможно, WM_SIZE.

Заметьте, что указатель на NM_TREEVIEW является также и указателем на NMHDR для окна-дерева.

Добавление элемента в дерево осуществляется посылкой сообщения (SendMessage) типа TVM_INSERTITEM окну-дереву. При этом вам понадобятся структуры TV_INSERTSTRUCT и TV_ITEM.

Изменение отображаемой для уже добавленного элемента информации (если понадобится), осуществляется функцией TreeView_SetItem.

Удаление элемента из дерева: TreeView_DeleteItem

Удаление всех элементов из дерева: TreeView_DeleteAllItems

Для сортировки уже добавленных элементов используйте функцию TreeView_SortChildren.

Для выделения активного элемента в дереве используйте функцию TreeView_SelectItem.

При смене активного элемента в дереве вам могут также понадобиться функции:

TreeView_GetNextItem и TreeView_Expand.

 

  1. Отображение Элементов.

Каждый элемент представляет собой два дочерних окна: с именем и содержимым элемента. Рекомендуется хранить:

- описатель окна

- его положение и размеры

Именем может быть обычный статический элемент, который создается с помощью CreateWindowEx с типом "STATIC" и с атрибутом SS_SIMPLE, его содержимое устанавливается посылкой сообщения WM_SETTEXT.

Тело Элемента shorttext отображается в окне Edit (создается CreateWindowEx с типом “EDIT” без атрибута ES_MULTILINE). Установка текста – посылка сообщения WM_SETTEXT.

Тело Элемента longtext отображается в окне Edit (создается CreateWindowEx с типом “EDIT” с атрибутом ES_MULTILINE). Установка текста – посылка сообщения WM_SETTEXT.

Изменение размеров для окон Edit (при изменении размеров окна) осуществляется функцией SetWindowPos.

Для отображения картинки рекомендуется создавать окно-Кнопку (создается CreateWindowEx с типом “BUTTON” с атрибутом BS_BITMAP и BS_FLAT)

Для загрузки картинки в BMP формате используйте LoadImage, для освобождения ресурса (после использования) DeleteObject.

Прорисовать загруженную картинку на кнопке можно посылкой кнопке сообщения BM_SETIMAGE.

Перемещение всех окон осуществляется функцией SetWindowPos.

Разрушение всех окон производится с помощью DestroyWindow.

 

  1. Меню.

Структура меню задается в редакторе ресурсов.

Активная клавиша для навигации внутри меню задается путем размещения символа & перед соответствующей буквой. В меню это будет выглядеть как подчеркивание данной буквы.

Каждому элементу меню сопоставляется некоторый идентификатор (константа, автоматически будет помещаться resource.h). Этот идентификатор формируется автоматически, но вы можете задать любое вам удобное имя константы.

Во время работы программы, если пользователь выбирает некоторый элемент меню, функции обработки сообщений окна-хозяина будет автоматически послано сообщение WM_COMMAND с кодом-константой элемента меню. Таким образом, для задания обработки необходимых команд меню вам требуется добавить соответствующие секции в процедуре обработки сообщений. В качестве примера рекомендуется посмотреть обработку сообщений меню, которое автоматически генерируется при формировании приложения “Hello, World!”.

 

  1. Toolbar.

Toolbar – стандартизованное средство Windows, поэтому его создание достаточно просто.

Легче всего воспользоваться функцией CreateToolbarEx для его создания (с атрибутом CCS_ADJUSTABLE). Вам также понадобится заполнить структуру TBBUTTON, указав там константы соответствующих элементов меню (т.к. в вашем случае все элементы Toolbar будут иметь соответствующий элемент меню) и в ресурсах нарисовать кнопки как элемент Toolbar в ресурсах.

В таком случае никаких дополнительных обработчиков сообщений от Toolbar не требуется.

Однако, если вы хотите создать flat Toolbar (по аналогии с тем, что на рисунке), то создавать его следует с атрибутом TBSTYLE_FLAT, а также добавить обработку в сообщение WM_NOTIFY, подтип NM_CUSTOMDRAW. Там необходимо поле dwDrawStage в структуре LPNMTBCUSTOMDRAW (указатель на которую передается в параметре lParam) проверить на тип CDDS_PREERASE и перерисовать задний план окна Toolbar (в случае на картине используется функция GradientFill) и вернуть значение CDRF_SKIPDEFAULT (что предотвратит перерисовку по умолчанию). Если вы не добавите подобный обработчик, то задний план окна Toolbar не будет перерисовываться вообще.

Кроме того, вы можете добавить текст-подсказку для каждой кнопки. Для этого необходимо создавать Toolbar с атрибутом TBSTYLE_TOOLTIPS. При этом вам также понадобиться добавить обработчику сообщения WM_NOTIFY, подтип TTN_NEEDTEXT. Там необходимо установить поле lpszText в структуре LPTOOLTIPTEXT (указатель на которую передается в параметре lParam) в желаемый текст. Индекс кнопки передается в поле hdr.idFrom той же структуры.

 

  1. Scrollbar (полоса прокрутки).

Scrollbar так же является стандартным средством Windows, поэтому весь механизм поддержки прокрутки стандартизирован.

При создании основного окна программы укажите атрибут WS_VSCROLL.

Далее каждый раз при переходе к след. файлу используйте функцию SetScrollInfo для установки параметров полосы прокрутки. Вам понадобится заполнить структуру SCROLLINFO.

Также необходимо добавить обработчики сообщений WM_VSCROLL, подтипы SB_TOP, SB_BOTTOM, SB_LINEDOWN, SB_LINEUP, SB_PAGEDOWN, SB_PAGEUP, SB_THUMBPOSITION, SB_THUMBTRACK. В зависимости от подтипа вы определяете тип перемещения полосы прокрутки и:

- перемещаете все элементы основного окна в нужном направлении на нужную величину (см. п.6)

- установить нужную позицию самой полосы прокрутки функцией SetScrollPos

- вызвать функцию обновления графической информации для главного окна: UpdateWindow

Кроме того необходимо добавить симуляцию перемещения полосы прокрутки с клавиатуры. Для этого добавьте обработчик сообщений типа WM_KEYDOWN. Тип нажатой клавиши в виде виртуального кода передается в wParam. В случае кодов VK_PRIOR и VK_NEXT (PgUp и PgDwn) следует производить описанные выше манипуляции с прокруткой.

 

  1. Работа с реестром.

Для создания ключа в реестре используйте функцию RegCreateKeyEx. Здесь и далее ВСЕГДА используйте ТОЛЬКО ветку HKEY_CURRENT_USER (см. документацию).

Для определения существования ключа и получения его описателя используйте функцию RegOpenKeyEx.

Для сохранения параметров в реестре используйте функцию RegSetValueEx.

Для чтения параметров – RegQueryValueEx.

 

  1. Редактирование текста.

Редактирование текста в окнах типа Edit осуществляется автоматически. Однако, для того, чтобы операции по копированию частей текста можно было осуществить через меню и Toolbar, требуется добавить соответствующие обработчики (константы определяются в меню). Окна Edit полностью поддерживают все операции путем обработки сообщений WM_CUT, WM_COPY, WM_PASTE, которые вы должны посылать им. В последнем случае вам понадобится проверить буфер обмена на наличие в нем текста. Используйте для этого функцию IsClipboardFormatAvailable с параметром CF_TEXT.

Кроме того, при отображении информации в окне Edit переводом строки считается сочетание CR (13) и NL (10). При чтении файла в текстовом режиме (режим открытия файла содержит флаг “t” в функции fopen) символы CR,NL заменяются при чтении одним NL. Таким образом при чтении и записи необходимо производить преобразование строк. Это удобно сделать путем создания соответствующего класса. Если же вы открываете файл в двоичном режиме (режим открытия файла содержит флаг “b” в функции fopen) символы CR,NL так и читаются и транслировать текст при размещении в EDIT контроле не надо.

Для того, чтобы работали ускорители, необходимо направлять сообщения на соответствие ускорителям в главное окно приложения, а не в текущее (по умолчанию в цикле обработки сообщений стоит именно текущее).

 

  1. Для смены активного каталога вы можете использовать стандартный диалог выбора файла в каталоге. Для этого воспользуйтесь функцией API GetOpenFileName и, соответственно структуры OPENFILENAME.

 



<== предыдущая лекция | следующая лекция ==>
Конец ознакомительного фрагмента. | Сравнительный анализ конкурентного рынка
Поделиться с друзьями:


Дата добавления: 2018-11-10; Мы поможем в написании ваших работ!; просмотров: 166 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Свобода ничего не стоит, если она не включает в себя свободу ошибаться. © Махатма Ганди
==> читать все изречения...

2307 - | 2069 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.017 с.