Студопедия

Главная страница Случайная страница

Разделы сайта

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






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






  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.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.