- •Материал к курсам «Объектно-ориентированное программирование», «Инструментальные средства визуального программирования» и «Современные технологии и инструментарий программирования»
- •8. Интерфейс графического устройства, цвет и шрифт 71
- •10. Консольные приложения Windows 91
- •21. Алгоритмы 220
- •22. Профилирование программы в Microsoft Visual Studio 6.0 238
- •23. Некоторые функции api Win32 240
- •24. Разное-всякое 247
- •Часть2.Технология сом 299
- •Предисловие автора
- •1.3.Работа со строками
- •1.3.1.Кодировки и кодовые страницы
- •1.3.2.О кодировке Unicode
- •1.3.3.Использование класса cString
- •1251 (Cyrillic (Windows) ) в кодировку 866 (Cyrillic dos).
- •1.3.4.Некоторые полезные функции класса cString
- •1.4.Явное преобразование типов
- •1.4.1.Преобразование полиморфных типов dynamic_cast
- •1.4.2.Преобразование неполиморфных типов static_cast
- •1.4.3.Преобразование reinterpret_cast
- •2.Соглашения об именах
- •3.Пространства имен
- •4.Макросы и отладка
- •4.1.Макрос trace
- •4.2.Объект afxDump
- •4.3.Классы cDumpContext и cObject
- •4.5.Макрос assert_valid
- •4.6.Макрос verify
- •4.7.Автоматическая диагностика неуничтоженных объектов
- •5.Каркас приложений mfc
- •5.1.Понятие каркаса приложений
- •Каркас приложений и библиотека классов
- •Пример на базе каркаса приложений
- •5.2.Сопоставление сообщений в библиотеке mfc
- •5.3.Документы и их представление
- •5.4.Функции взаимодействия «документ-вид»
- •5.5.Простейшее приложение на базе архитектуры «документ-вид»
- •5.6.Усложненное взаимодействие «документ-вид»
- •6.Класс «вид» библиотеки mfc (версия mvs 6.0)
- •6.1.Что такое «вид»
- •6.2.Интерфейсы sdi и mdi
- •6.3. Сценарий создания приложения drw в ис mvs 6.0
- •6.4.Класс cdrwView
- •6.5.Рисование внутри окна представления: Windows gdi
- •Функция-член OnDraw
- •Контекст устройства в Windows
- •Добавление кода рисования в программу drw
- •6.6.Первое знакомство с редакторами ресурсов
- •Содержимое файла drw.Rc
- •Работа с редактором диалоговых окон
- •6.7.Конфигурации Win32 Debug и Win32 Release
- •6.8.Активизация диагностических макросов
- •6.9.Предкомпилированные заголовочные файлы
- •6.10.Два способа запуска программы
- •7.Класс «вид» библиотеки mfc (версия mvs 2005)
- •7.1.Что такое «вид»
- •7.2.Интерфейсы sdi и mdi
- •7.3. Сценарий создания приложения с архитектурой документ-вид в среде mvs 2005
- •7.4.Класс cdrwView
- •7.5.Рисование внутри окна представления: Windows gdi
- •Функция-член OnDraw
- •Контекст устройства в Windows
- •Добавление кода рисования в программу drw
- •7.6.Конфигурации Win32 Debug и Win32 Release
- •7.7.Активизация диагностических макросов
- •7.8.Два способа запуска программы
- •8.Интерфейс графического устройства, цвет и шрифт
- •8.1.Классы контекста дисплея cClientDc и cWindowDc
- •8.2.Создание и уничтожение cdc-объектов
- •8.3.Состояние контекста устройства
- •8.4.Класс cPaintDc
- •8.5.Объекты gdi
- •8.6.Создание и уничтожение gdi-объектов
- •8.7.Управление gdi-объектами
- •8.8.Стандартные gdi-объекты
- •8.9.Время жизни контекста устройства
- •9.1.Приложение, основанное на диалоговом окне
- •9.2.Приложение без поддержки архитектуры документ-вид
- •9.3.Приложение с поддержкой архитектуры документ-вид
- •9.4.Краткая характеристика базовых классов класса вид
- •9.4.1.Класс cView
- •9.4.2.Класс cFormView
- •9.4.3.Класс cHtmlView
- •9.4.4.Класс cListView
- •9.4.5.Класс cRichEditView
- •9.4.6.Класс cScrollView
- •9.4.7.Класс cTreeView
- •10.2.Создание консоли
- •10.3.Закрытие консоли
- •10.4.Дескрипторы консоли
- •10.5.Входной буфер консоли
- •10.6.Буферы дисплея консоли
- •10.7.Размер буфера окна и дисплея
- •10.8.Скроллинг дисплейного буфера
- •10.9.Методы ввода/вывода в консольных приложениях
- •10.10.Режимы консоли
- •10.11.Высокоуровневый консольный ввод/вывод
- •10.12.Высокоуровневые режимы консоли
- •10.13.Высокоуровневые функции ввода и вывода консоли
- •10.15.Низкоуровневые режимы консоли
- •10.16.Низкоуровневые функции ввода консоли
- •10.14.Низкоуровневые функции ввода и вывода консоли
- •10.17.Низкоуровневые функции вывода консоли
- •10.18.Кодовые страницы в консольных приложениях
- •10.19.Пример консольного приложения ColorRusConsole
- •10.20.Использование графики в консольных приложениях
- •10.21.Изменение заголовка окна приложения и его прятание
- •11.Архитектура документ-вид и диалоговое окно
- •11.1.Как получить доступ к документу из диалогового окна
- •11.1.1.Первый способ
- •11.1.2.Второй способ
- •11.2.Как получить доступ к представлению из диалогового окна
- •11.3.Отображение данных в управляющих элементах диалогового окна и их получение (mvs 6.0)
- •11.4.Создание оконных подклассов для расширенного управления вводом данных
- •12.Обработка файлов
- •12.1.Обработка текстовых файлов (mvs 6.0)
- •12.2.Обработка текстовых файлов (mvs 2005)
- •12.3.Обработка двоичных файлов
- •12.4.Поиск файлов и каталогов по заданному пути и маске
- •12.5.Диалоги по выбору имени файла и каталога
- •13.Обработка сообщений Windows
- •13.1.Обработка сообщений в рамках одного приложения
- •13.2.Об обработке команд
- •13.3.Обработка сообщений в рамках системы
- •14.Разработка и использование собственных dll
- •14.1.Основы dll
- •14.1.1.Согласование импортируемых элементов с экспортируемыми
- •14.1.2.Явное и неявное связывание
- •14.1.3.Связывание по символьным именам против связывания по порядковым номерам
- •14.1.4.Точка входа в dll: функция DllMain
- •14.1.5.Описатели экземпляров и загрузка ресурсов
- •14.1.6.Порядок поиска dll клиентской программой
- •14.1.7.Отладка dll
- •14.1.9.Общие dll mfc-библиотеки
- •14.1.10.Dll-расширения: экспорт классов
- •14.1.11.Последовательность поиска ресурсов в dll-расширении
- •14.2.Разработка библиотеки
- •14.3.Разработка клиентского приложения, использующего библиотеку dll
- •15.Обработка растровых изображений
- •16.Обработка исключительных ситуаций
- •If (блок будет работать)
- •16.1.Введение в обработку исключительных ситуаций
- •16.2.Синтаксис обработки исключительных ситуаций
- •16.3.Синтаксис инициирования исключительных ситуаций
- •16.4.Примеры генерации и обработки исключительных ситуаций
- •17.Классы
- •17.1.Пример класса tVector
- •17.2.Класс tVector с перегруженными операциями
- •18.Шаблоны классов
- •18.1.Пример шаблона класса
- •18.2.Шаблон класса tVector
- •19.Стандартная библиотека, библиотеки mfc и atl
- •19.1.Состав стандартной библиотеки
- •19.2.Библиотеки mfc и atl
- •20.Коллекции
- •20.1.Обзор коллекций mfc
- •20.2.Шаблонные классы коллекций mfc
- •20.3.Использование массивов, списков и ассоциативных массивов
- •20.3.1.Использование простых массивов и списков
- •20.3.2.Члены класса cArray
- •Конструкторы
- •Атрибуты
- •Обработка
- •Доступ к элементам
- •Увеличение размера массива
- •Вставки и удаления
- •Операции
- •20.3.3.Члены класса cList
- •Параметры
- •Возвращаемое значение
- •Замечания
- •Параметры
- •Возвращаемое значение
- •20.3.4.Использование простых ассоциативных массивов
- •20.4.Использование шаблонов коллекций типизированных указателей
- •20.4.1.Использование массивов и списков типизированных указателей
- •20.4.2.Использование типизированных указателей на ассоциативные массивы
- •20.5.Использование контейнера vector
- •20.5.1.Конструкторы
- •Пример использования конструкторов
- •20.5.4.Иллюстрация использования класса vector
- •21.Алгоритмы
- •21.1.Общие соглашения
- •21.2.Итераторы
- •21.3.Функциональные объекты
- •21.4.Распределители
- •21.5.Состав библиотеки алгоритмов
- •21.6.Немодифицирующие алгоритмы
- •21.7.Пример использования шаблонной функции sort() из библиотеки алгоритмов
- •21.8.Сортировка массива объектов пользовательского класса
- •21.9.Еще одна иллюстрация некоторых алгоритмов на примере обработки числового массива
- •22.Профилирование программы в Microsoft Visual Studio 6.0
- •23.Некоторые функции api Win32
- •23.1.Получение информации о компьютере и операционной системе
- •23.1.1.Функция GetLogicalDrives
- •23.1.2.Функция GetDriveType
- •23.1.3.Функция GetDriveType
- •23.1.4.Функция GetDiskFreeSpaceEx
- •23.1.5.Функция GlobalMemoryStatus
- •23.1.6.Функции GetComputerName, GetUserNameA
- •23.1.7.Функции GetSystemDirectory, GetTempPath, GetWindowsDirectory, GetCurrentDirectory
- •23.1.8.Функция GetSystemInfo
- •24.Разное-всякое
- •24.1.Русификация приложений
- •24.2.Помощь и всплывающие подсказки
- •24.3.Использование ini-файла
- •24.3.1.Ansi-версия программы для среды mvs 6.0.
- •24.3.2.Unicode-версия программы для ис mvs-2005 и mvs-2008.
- •24.3.3.Ansi-версия программы для ис mvs-2005.
- •24.3.4.Ansi-версия программы для ис mvs-2008
- •24.4.Установка размеров и положения главного окна-рамки приложения
- •24.5.Создание дополнительного потока в консольном приложении
- •24.6.Интеллектуальные указатели
- •24.7.Управление формой курсора мыши
- •24.8.Как выйти из длительного цикла
- •24.9.Получение изображения содержимого окна
- •Сохранение изображения в файле
- •0, // Первая строка развертки, которая должна
- •0, // Число копируемых линий
- •Int I; // Количество выбираемых линий
- •0, // Первая строка развертки, которая должна быть выбрана
- •0, // Число копируемых линий
- •0, // Первая выбираемая линия для изображения назначения
- •0, // Режим использования
- •24.10.Подстройка очертания окна под контур изображения
- •24.11.Как корректно завершить приложение с графическим интерфейсом из него самого
- •24.12.Обработка ошибок ввода
- •25.Интегрированная среда Microsoft Visual Studio 2005
- •25.1.Терминология
- •25.2.Свойства решения и проекта
- •25.3.Что обозначают иконки на вкладке Class View
- •26.О справочной системе msdn версий 6.0 и 2005
- •26.1.Примеры приложений (версия 6.0)
- •26.2.Учебные пособия (tutorials)
- •26.3.Примеры приложений из msdn-2005
- •26.3.1.Примеры приложений mfc (mfc samples)
- •27.Процессы и потоки
- •27.1.Основные понятия Понятие приложений, процессов и потоков
- •Текущие диск и каталог для процесса
- •Определение версии системы
- •Когда полезно создавать потоки
- •Когда многопоточность неэффективна
- •Механизм многопоточности Windows
- •Приостановка, возобновление и переключение потоков
- •Приостановка и возобновление процессов
- •27.2.Функция потока
- •Функция CreateThread
- •Завершение потока
- •Часть2.Технология сом
- •28.Краткий обзор концепций программирования
- •29.Обзор технологии .Net и c#
- •29.1.Введение
- •29.2.Характеристика платформы .Net Framework
- •Среда разработки: Microsoft Visual Studio
- •Язык f#
- •29.3.Пример консольного приложения
- •29.4.Класс стек на основе связного списка
- •29.5.Чтение текстового файла
- •30.Предпосылки возникновения com
- •31.Межпроцессное взаимодействие
- •34.Введение в com технологии
- •34.1.Основные понятия и определения
- •34.2.Технология com как спецификация и реализация
- •34.3.Составляющие приложений com
- •35.Способы реализации сом серверов
- •35.1.Виды серверов и их основные характеристики
- •35.2.Алгоритм взаимодействия клиента с внутрипроцессным сервером
- •Последовательность действий при вызове клиентом внутрипроцессного сервера.
- •Последовательность действий при вызове клиентом локального или удаленного сервера
- •36.Интерфейсы
- •37.Доступ к серверу с помощью пользовательских интерфейсов
- •38.Доступ к серверу с помощью интерфейса iDispatch
- •38.1.Сценарий для версии mvs 6.0
- •38.2.Сценарий для версии mvs 2005
- •38.3.Доступ к серверу Excel в mvs 2005 с помощью диспетчерского интерфейса
- •39.Применение интеллектуальных указателей для доступа к серверам
- •39.1.Импорт библиотеки типов
- •39.2.Доступ к серверу SolidWorks 2003 с помощью интеллектуальных указателей
- •39.3.Доступ к серверу SolidWorks 2007 с помощью интеллектуальных указателей
- •39.4.Доступ к серверу Microsoft Word с помощью интеллектуальных указателей из консольного приложения
- •39.5.Доступ к серверу Microsoft Word с помощью интеллектуальных указателей из gui-приложения
- •40.Внедрение и связывание объектов
- •40.1.Понятие внедрения и связывания объектов
- •40.2.Серверы и контейнеры
- •41.Обработка ошибок
- •41.1.Функция SetErrorMode – управление реакцией программы на ошибочные состояния
- •41.2.Функции GetLastError и SetLastError – получение кода ошибки и его установка
- •41.3.Коды ошибок hresult
- •41.4.Получение текстов сообщений об ошибках
- •42.Типы данных сом
- •42.1.Типы данных методов и свойств сом объектов
- •43.Приложения
- •43.1.Словарь терминов
- •43.2.О регистрации внутрипроцессного сервера сом
- •5. Степанов а., Менг Ли. Руководство по стандартной библиотеке шаблонов (stl)/ Пер. На русский а.Суханова и а.Кутырина – м.: 1999.
- •Список литературы по платформе .Net
- •9. Дон Бокс, Крис Селлз. Основы платформы .Net, том 1. Общеязыковая исполняющая среда /Пер. С англ. – м.; сПб.: к.: Издательский дом "Вильямс", 2003. – с.288. Isbn 5-8459-0455-2
- •10. Деймьен Уоткинз, Марк Хаммонд, Брэд Эйбрамз. Программирование на платформе .Net среда /Пер. С англ. – м.; сПб.: к.: Издательский дом "Вильямс", 2003. – с.368. Isbn 5-8459-0456-0
- •11. Джеффри Рихтер. Clr via c#. Программирование на платформе Microsoft .Net Framework 2.0 на языке c#. Мастер-класс / Пер. С англ. – м.:Издательство «Русская редакция»; сПб.: Питер, 2007. - 656с.
- •12. Джеффри Рихтер. Программирование на платформе Microsoft .Net Framework / Пер. С англ. – м.:Издательско-торговый дом «Русская редакция», 2003 - 512с.
- •14. Пауэрс Ларс, Майкл Снелл. Microsoft Visual Studio 2008 / Пер. С англ. — сПб.:
- •Список литературы по технологии сом
- •13. Дейл Роджерсон. Основы сом/Пер. С англ.–2-е изд., исправл. И дополн.–м,:Изд.-торг. Дом «Русская редакция».–2000, 400с.
- •15. Дэвид Чеппел. Технология ActiveX и ole/ Пер. С англ. – м.: Издательский отдел "Русская редакция" тоо "Channel Traiding Ltd.", 1999. – 320с.
- •16. Бокс д. Сущность технологии сом. Библиотека программиста. — сПб.: Питер, 2001. — 400 с.: ил. (Есть в электронном формате)
- •17. К. Таваре, к. Фертитта, б. Ректор, к. Селлз. Библиотека atl 8: внутренняя структура и применение. Microsoft Visual Studio 2005. – м.; сПб.:, к.: Издательский дом "Вильямс", 2007, 736с.
12.4.Поиск файлов и каталогов по заданному пути и маске
Ниже представлен текст главного файла консольного приложения (проект FindFilesVC), предназначенного для иллюстрации поиска файлов и каталогов по заданному пути и маске.
#include "stdafx.h"
#include "FindFilesVC.h"
#include <io.h>
#include <conio.h>
//опускаем директивы препроцессора
CWinApp theApp;
using namespace std;
/* ProcessMessages() - выполняет обработку сообщений Windows для того,
чтобы приложение смогло обработать нажатие кнопки пользователем
в процессе поиска файлов и каталогов.
Если эту функцию не вызвать, то приложение
не будет реагировать на команды пользователя во время выполнения
«длинного» цикла.
*/
void ProcessMessages()
{ MSG Message;
if(PeekMessage(&Message, NULL, 0,0,PM_REMOVE))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
}
/*ShowFiles - поиск файлов, удовлетворяющих маске FileSpec и имеющих
атрибуты FileAttr. Ограничением функции является то, что она
не обрабатывает должным образом символы * и ?, которые могут быть
в маске, и всегда отыскивает файлы с любыми именами.
Вызов функции может иметь такой вид: ShowFiles("C:\\Temp\\*.*", _A_ARCH);
Другие атрибуты файлов, объявленные в io.h:
_A_NORMAL 0x00 Normal file - No read/write restrictions
_A_RDONLY 0x01 Read only file
_A_HIDDEN 0x02 Hidden file
_A_SYSTEM 0x04 System file
_A_SUBDIR 0x10 Subdirectory
_A_ARCH 0x20 Archive file
Атрибуты файлов можно комбинировать с помощью операции |
Обратите внимание, что маска FileSpec, передаваемая функции ShowFiles()
в качестве параметра, должна заканчиваться символами "*.*", так как
это ограничение заложено в коде функции. ОБЯЗАТЕЛЬНО!
*/
void ShowFiles(char * FileSpec, unsigned int FileAttr)
{
const int FNameWidth=40, FSizeWidth=10;
/* FNameWidth и FSizeWidth - максимальное число символов в имени файла
и число цифр в его размере соответственно, которые в данной версии
программы используются только для вывода на монитор
*/
_finddata_t FileInfo;
long hFile;
CString s, NewFileSpec, Mask="*.*";
char Spaces[]=" ";
ProcessMessages(); /* чтобы можно было, например, суметь нажать кнопку.
Вызов функции ProcessMessages() для консольного приложения
в нынешней его реализации необязателен*/
/* _findfirst() - начинаем поиск файлов и каталогов по заданной
в FileSpec маске. Информацию о найденном файле или каталоге получим
в структуре FileInfo
*/
hFile=_findfirst(FileSpec, &FileInfo);
if(hFile == -1L) return; // пустой каталог?
do
{
/* если найден файл с заданным атрибутом, то выводим его.
ctime() преобразует упакованные дату и время создания файла
в формате строки символов
*/
char *DateTime=ctime(&(FileInfo.time_write));
DateTime[strlen(DateTime)-1]=0; /* "затираем" символ перевода строки,
который нам не нужен */
FileInfo.attrib=FileInfo.attrib & 0x00ff; /* Избавляемся от старшего
байта атрибута, который может быть ненулевым в некоторых
случаях, например, у файлов, находящихся на защищенном от записи
диске*/
if(((FileInfo.attrib & FileAttr)==FileAttr) /* если атрибут файла
совпадает с заданным */
&& (FileInfo.name[0]!='.') /* если найденный файл не есть
ссылка на вышестоящий каталог */
&& (!(FileInfo.attrib & _A_SUBDIR))) /* если файл не является
каталогом */
{ // выводим имя файла, дату, время и размер
cout.width(FNameWidth);
s=FileInfo.name;
s.CharToOem(); /* на всякий случай преобразуем имя файла в
кодировку MS DOS */
/* С помощью strncat() добавляем требуемое количество
пробелов в строку s для ее выравнивания при выводе*/
strncat(s.GetBuffer(s.GetLength()+FNameWidth), Spaces,
FNameWidth-s.GetLength()-2);
cout<<LPCTSTR(s)<<' '<<DateTime;
cout.width(FSizeWidth);
cout<<FileInfo.size<<endl;
}
/* если найденный файл - каталог, то выводим его имя и организуем
поиск файлов в нем путем рекурсии */
if((FileInfo.attrib & _A_SUBDIR) &&(FileInfo.name[0]!='.'))
{
/*выводим имя каталога в окно консоли*/
cout.width(FNameWidth);
s=strupr(FileInfo.name); /*strupr() - преобразование букв англ.
алфавита в прописные*/
s.CharToOem();
strncat(s.GetBuffer(s.GetLength()+FNameWidth), Spaces,
FNameWidth-s.GetLength());
cout<<LPCTSTR(s)<<' '<<DateTime<<endl;
/*готовим параметры для рекурсивного вызова ShowFiles.
Суть этой задачи. Если, например, в текущее время
FileSpec=="C:\Windows\*.*" и найден каталог
FileInfo.name=="System", то надо вызвать функцию так:
ShowFiles("C:\Windows\System\*.*", FileAttr);
*/
NewFileSpec=FileSpec; //int Delete( int nIndex, int nCount = 1 )
NewFileSpec.Delete(NewFileSpec.GetLength()-Mask.GetLength(),
Mask.GetLength());
NewFileSpec+=FileInfo.name; NewFileSpec+="\\";
NewFileSpec+=Mask;
ShowFiles(NewFileSpec.GetBuffer(NewFileSpec.GetLength()+1), FileAttr);
}
/*цикл продолжается, пока находится файл (или каталог) и
пользователь не нажал какую-либо клавишу*/
}while(!_findnext( hFile, &FileInfo) && !kbhit());
_findclose( hFile );
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
ShowFiles("d:\\Temp\\*.*", 0);
getch();
}
return nRetCode;
}
