
Создание и уничтожение gdi-объектов.
Для создания собственных объектов применяются функции, начинающиеся со слова Create... ( CreatePen или CreateSolidBrush).
Полученный объект выбирается в контекст устройства функцией:
HGDIOBJ SelectObject( hDC, hObject );
В большинстве случаев может быть удобнее воспользоваться вместо функции SelectObject макросами из windowsx.h, предназначенными для работы с конкретными объектами:
HPEN SelectPen( hDC, hPen ); HBRUSH SelectBrush( hDC, hBrush );
Объект уничтожается функцией: BOOL DeleteObject( hObject ); Эта функция удаляет указанный объект, если только это не стандартный объект и если он не выбран в контекст устройства. Вместо одной универсальной функции в windowsx.h можно найти макросы, удаляющие объекты конкретных типов: DeletePen, DeleteBrush, DeleteFont и т.д.
В.26 Распределенный СОМ Microsoft (DCOM) развивает многокомпонентную модель (СОМ) до уровня поддержки связи между объектами различных.
DCOM — это последовательное развитие СОМ, а значит, ваши инвестиции в создание СОМ-приложений, компонентов, инструментария плавно переносятся в сферу стандартизированных распределенных решений. DCOM возьмет на себя низкоуровневые детали сетевых протоколов, а вы сможете сфокусироваться на вашем настоящем деле: создании хороших решений для пользователей.
DCOM является развитием многокомпонентной модели (СОМ). СОМ определяет, каким образом компоненты взаимодействуют со своими клиентами. Это взаимодействие осуществляется таким образом, чтобы клиент и компонент могли соединяться, без необходимости использовать некоторый промежуточный компонент системы и клиент мог вызывать методы компонента.
Распределенные приложения предоставляют вам абсолютно новые решения в проектировании и развитии. Для того чтобы получить эти дополнительные возможности, необходимо сделать значительные вложения. Некоторые приложения являются распределенными изначально: многопользовательские игры, приложения для обмена мнениями, для телеконференций - все это примеры подобных приложений. Многие другие приложения также являются распределенными в том смысле, что они имеют как минимум два компонента, работающие на различных машинах. Но, поскольку эти приложения не были созданы для использования в распределенной среде, они достаточно ограничены в масштабируемости и в гибкости перераспределения. Приложения, которые разрабатывались как распределенные, могут совмещать различных клиентов с различными мощностями посредством работы компонента со стороны клиента, если это возможно, и - со стороны сервера, когда это необходимо.
В.27, 34 Основные стили интерфейсов: интерфейс с одним документом (single-document interface, SDI) и интерфейс со многими документами (multiple-document interface, MDI).
Текстовый редактор с интерфейсом SDI позволяет открыть только один документ - чтобы открыть другой, следует закрыть предыдущий. В приложении MDI Вы можете открыть сразу несколько документов.
Каждый документ в многодокументном интерфейсе (MDI) показывается внутри рабочей области главного окна прикладной программы. Типичные приложения многодокументного интерфейса (MDI) включают в себя программы обработки текстов, которые дают возможность пользователю работать с несколькими текстовыми документами, а программы электронных таблиц также дают возможность пользователю работать с несколькими диаграммами и электронными таблицами.
CMDIFrameWnd – базовый класс для главного окна (фрейма) многодокументного приложения. Ещё создаётся специальное окно, которое управляет рабочей областью фрейма – MDIClient.
CMDIChildWnd – обеспечивает работоспособность дочерних окон многодок приложения
В.28 MFC избавляет программиста от необходимости непосредственной работы с дискрипторами контекста. Для этого создан класс контекста устройства CDC.
В MFC есть несколько контекстов устройств и все наследники от CDC.
CDC - >
|-> CClientDC (клиентская область окна)
|-> CWindowDC (окно)
|-> CMetaFileDC (метафайл – изображение как последовательность команд)
|-> CPaintDC (область рисования)
Каждый из контекстов рисует в определенном месте, то есть каждый контекст предназначен для рисования в определенной области.
CPaintDC и CClientDC очень похожи. Оба эти класса предназначены для рисования внутри клиентской области окна. То есть они не могут добраться до меню или рамки окна. CPaintDC используется только тогда когда отвечает на сообщение WM_PAINT. Вместе с этим сообщением будет передана та область, которая требует перерисовки. Ведь окно может быть на экране не полностью. Для извещения о перерисовке вызываются функции BeginPaint и EndPaint. Без их вызова Windows будет считать, что перерисовка не произошла. Вот в этом и существенные отличия CPaint, в его конструкторе автоматически вызывается BeginPaint, а в деструкторе EndPaint. CClientDC не выполняет эти функции автоматически.
В.29 Базовый класс библиотеки MFC - класс CObject. Большинство классов MFC наследовано от базового класса CObject, лежащего в основе всей иерархии. Класс CObject, а также все классы, наследованные от него, обеспечивают возможность сохранения объектов класса в файлах на диске с их последующим восстановлением.
1)CCmdTarget. 2)СFile. 3)CMenu.
Класс CCmdTarget – представляет структуру приложения. Особенность: объекты этих классов могут получать от ОС сообщения и обрабатывать их.
1)CWnd: основные свойства окон.
2) CDocument: для представления документов приложения.
3)CWinThred, CWinApp: представляет подзадачу приложения.
4)CDocTemplate: шаблон докумнтов:
а)CSingleDocTemplate, б)CMultiDocTemplate.
Класс CFile - для работы с файловой системой компьютера. От класса CFile наследуется еще несколько классов - CMemFile, CStdioFile, CSocketFile.
Класс CDC – контекст отображения. От него наследуется: CClientDC, CPaintDC, CWindowDC, CMetafileDC.
Класс CMenu - управление меню.
В.30 Для отображения графического объекта с помощью функции OnDraw класса Представления используется объект контекста устройства, адрес которого передается в функцию.
void CMyView::OnDraw (CDC* pDC ) {
// отобразите графику, используя 'pDC->'
}
Функция OnDraw вызывается при рисовании или перерисовке окна Представления. Если класс Представления поддерживает прокрутку (т.е. порожден от класса CScrollView), то переданный в него объект контекста устройства настраивается на текущую позицию прокрутки документа.
Если программа отображает графику не в окне Представления, а в каком-то другом окне (например, в диалоговом), то класс окна для рисования или перерисовки предоставляет обработчик сообщений wm_paint, называемый OnPaint, который создает объект контекста устройства, порождаемый от MFC-класса CPaintDC.
void CMyDialog::OnPaint() {
CPaintDC PaintDC (this);
// отобразите графику, используя 'PaintDC". . .
}
В.31 CArray, CMap и классы CList используют глобальные вспомогательные функции, как правило, их необходимо настраивать.
CArray - Класс шаблона для создания произвольных типов массивов.
CByteArray – байты
CDWordArray – двойные слова
CObArray – указатель на объект класса CObject
CStringArray – объект класса CString
CWordArray - слова
CList - Класс шаблона для создания произвольных типов списков.
СObList – указатель на объект класса CObject
CMap - Класс шаблона коллекций, для сопоставления с произвольными клавишами и типами значений.
В.32 Класс CFile предназначен для обеспечения работы с файлами. Он позволяет упростить использование файлов, представляя файл как объект, который можно создать, читать, записывать и т.д.
Чтобы получить доступ к файлу, сначала надо создать объект класса CFile. Конструктор класса позволяет сразу после создания такого объекта открыть файл. Но можно открыть файл и позднее, воспользовавшись методом Open.
После завершения работы с файлом, его надо закрыть методом Close.
Для доступа к файлам предназначено несколько методов класса CFile: Read, ReadHuge, Write, WriteHuge, Flush. Методы Read и ReadHuge предназначены для чтения данных из предварительно открытого файла.
В состав класса входят методы, позволяющие выполнять над файлами различные операции: копирование, переименование , удаление, изменение.
Чтобы определить дату и время создания файла, его длину и атрибуты, предназначен статический метод GetStatus. Существует две разновидности метода - первый определен как виртуальный, а второй - как статический метод.
Виртуальная версия метода GetStatus определяет состояние открытого файла, связанного с данным объектом класса CFile. Статическая версия метода GetStatus позволяет определить характеристики файла, не связанного с объектом класса CFile. Чтобы воспользоваться этим методом, необязательно предварительно открывать файл.
В.33 Сериализация – процесс сохранения и восстановления объектов на диск. Используется класс MFC – Serialize.
Требования к сериализации:
1)В объявлении класса должен присутствовать макрос DECLARATE_SERIALIZE.
2)В определении класса должен вызываться макрос IMPLEMENT_SERIALIZE.
Методы сериализации:
1)Обычным способом с помощью метода CDocument. Нужно просто переопределить метод.
2)С помощью создания собственного класса на основе CObject для работы с данными.
Переопределяем метод Serialize. Чтобы узнать, какую операцию он будет выполнять исп: IsStoring – для записи, IsLoading – для чтения.
В методе Serialize для обмена данными используется объект CArchive. Прога посылает документы не в файл, а в архив и читает из архива. Объект класса CFile связывается с объектом-архивом.
В.35 Многопоточные приложения более эффективные и мощные, чем однопоточные.
Процесс - выполняемое приложение, обладающее собственной памятью, описателями файлов и другими системными ресурсами.
Поток - код, исполняемый внутри процесса.
Процесс может иметь как один поток, так и множество параллельно выполняющихся потоков. Всё пространство кода и данных процесса доступно всем его потокам. Несколько потоков могут обращаться к одним и тем же глобальным переменным или функциям.
Потоками управляет операционная система, и у каждого потока есть свой собственный стек.
Обработка сообщений в однопоточной программе
До сих пор все наши программы были однопоточными (single-threaded), т. е. у кода был лишь один поток исполнения. Казалось бы, при появлении сообщения каким-то чудом вызывается ваш обработчик, но в Windows все происходит совсем не так.
Программирование многопоточных приложений
Потоки в Windows бывают двух видов рабочие потоки (worker threads) и потоки пользовательского интерфейса (user-interface threads). MFC-библиотека поддерживает оба вида. У потока пользовательского интерфейса есть окна, а, значит, и свой цикл выборки сообщений, а у рабочего — нет. Рабочие потоки легче программировать, и они, как правило, полезнее.
Даже в однопоточном приложении есть поток, который называется основным потоком (main thread). Здесь важно помнить, что приложение — это процесс, содержащий как минимум один поток.
В.36 Выделение памяти можно разделить на основные категории:
1)Выделения
2)Выделения кучи.
Одно из основных различий между 2 методами в распределении кадра, оно ведется с фактическим блоком памяти, пока самим с распределением кучи, всегда присваивается указатель на блок памяти. Другое основное отличие, что объекты кадра, автоматически удаляются, а объекты в куче, должны быть явно удалять разработчиком приложения.
В.37 ActiveX – элемент управления, создаётся пользователем и помещается в прогу.
В основе ее лежит COM (Component Object Model - модель компонентного объекта). Это системная технология фирмы Microsoft, представляющая совокупность средств, с помощью которых объекты, разработанные различными разработчиками на разных языках программирования и работающие в разных средах, могут взаимодействовать друг с другом без какой-либо модификации их исполняемых модулей (двоичных кодов).
Термин ActiveX заменил термин OLE (Object Linking and Embedding - связывание и внедрение объектов).
Технология СОМ изначально разрабатывалась как ядро для осуществления межпрограммного взаимодействия. Уже на этапе разработки предполагалось расширять возможности технологии при помощи так называемых расширений СОМ. СОМ расширяет собственную функциональность, благодаря созданию специализированных наборов интерфейсов для решения конкретных задач.
Технология ActiveX - это технология, которая использует компоненты СОМ, особенно элементы управления. Она была создана для того, чтобы работа с элементами управления была более эффективной. Это особенно необходимо при работе с приложениями Internet, в которых элементы управления должны быть загружены на компьютер клиента, прежде чем они будут использоваться.
В.38 ActiveX – это файл с расширением ОСХ (например, MyButton.OCX), который вы можете использовать в своем приложении Visual C++. Visual C++ и другие визуальные языки программирования дают вам возможность включить элемент управления ActiveX в свою программу и пользоваться им так же, как и стандартным элементом управления Visual C++. Вы помещаете элемент управления ActiveX в диалоговую панель, задаете его свойства и связываете код с его событиями. После того как ы создали собственный элемент управления ActiveX, вы можете передавать его другим программистам, которые могут вводить его в свои программы.
Раньше при написании программ использовалась OLE-технология, а сейчас DCOM (Distributed Component Object Model) - распределенная компонентная объектная модель, а реализуют ее библиотеки ActiveX, которые по объему оказались гораздо меньше, чем библиотеки OLE, а по скорости - быстрее. Сохранилась и совместимость - любой программный компонент OLE будет работать с библиотеками ActiveX.