Программирование | Отладка | Web-технологии | Microsoft Office | Теор.информатика | Исслед-е операций | Операц. сис-мы | Новости |
Проектирование ИС | Исск. инт-т | Трансляторы | Об авторах | Карта сайта | Поиск |
Язык программирования Turbo Pascal |
Среда программирования Delphi 6 |
Язык программирования C++ |
Язык программирования C# |
Язык программирования Assembler |
Язык программирования Go |
Язык программирования Haskell |
Язык программирования Java |
Язык программирования Kotlin |
Язык программирования LISP |
Язык программирования Prolog |
Язык программирования Python |
Параллельные алгоритмы |
Сети Петри |
Начала |
Отладчик Turbo Debugger |
Основы HTML |
Технология Flash |
Язык программирования Perl |
Основы языка PHP |
Основы PhotoShop |
Основы JavaScript |
Основы CSS |
Основы CorelDRAW |
Библиотека jQuery |
Текстовый процессор Microsoft Word |
Электронные таблицы Microsoft Excel |
Система управления базами данных Microsoft Access |
Использование VBA в Microsoft Excel |
Место информатики в системе наук |
Общие сведения об информации |
Кодирование информации в теории Шеннона |
Основные понятия теории алгоритмов |
Классические формализации понятия 'алгоритм' |
Понятие рекурсии |
Сложность алгоритма |
Методы разработки алгоритмов |
Сложность задачи |
Информационное моделирование |
Основные понятия теории графов |
Алгоритмы поиска на графах |
Матроиды. 'Жадные' алгоритмы |
Динамическое программирование |
Алгоритмы |
UNIX и Linux |
Унифицированный язык моделирования UML |
Введение в машинное обучение с использованием Python |
Основы создания нейросети на Python |
Глубокое обучение на Python |
Начала |
Динамические структуры данных |
Библиотека RX |
Основные классы и события Delphi |
Основные компоненты Delphi |
Организация потоков |
Технология COM |
Язык программирования Object Pascal |
Локальные БД в Delphi |
Библиотека OWL |
Библиотека Qt |
Библиотека STL |
Библиотека шаблонов классов Borland |
Основы компьютерной графики |
Динамические структуры данных |
Начала |
Обработка исключительных ситуаций |
Оптимизация с помощью ассемблера |
Основы объектно-ориентированного программирования |
Потоки ввода-вывода |
Разное |
Редактор Resource Workshop |
Среда Visual C++ |
Программирование в Microsoft Visual C++ 2010 |
Технология CUDA |
Технология OLE |
Начала |
16-битное программирование |
32-битное программирование |
Основы логического программирования |
Динамические структуры данных |
Visual Prolog |
Библиотека PyQt5 |
Библиотека Tkinter |
Визуализация данных |
Начала |
Задачи ComputerScience |
Рекурсия |
Вкладка RXControls |
Вкладка RXDBAware |
Вкладка RXTools |
Вкладка Standard |
Вкладка Additional |
Создание Internet-приложений |
Вкладка System |
Вкладка Win32 |
Вкладка Servers |
Технология ADO |
Вкладка QReport |
Вкладка InterBase |
Вкладка Dialogs |
Начала |
Среда программирования. Язык С/С++ |
На этом шаге мы рассмотрим общие положения, связанные в выводом информации на различные устройства.
На этом шаге мы расскажем, какие возможности отображения данных на устройства вывода - экран и принтер - предоставляет класс CView.
В Windows приложения и устройства вывода взаимодействуют п другом посредством интерфейса графических устройств (Graphics Device Interface, GDI). Его использование гарантирует правильный вывод на все GDI-совместимые устройства.
GDI управляет структурой данных, называемой контекстом устройства, которая содержит информацию о текущих атрибутах данного устройства. В нее можно включить информацию о цветовой палитре, шрифтах, толщине пера, рисующего линии, типе кисти, закрашивающей области. В Windows API есть GDI-функции для рисования линий и других геометрических фигур, для закрашивания областей и печати текста. Все эти функции осуществляют вывод на контекст устройства, описатель которого передается в качестве параметра.
В MFC контекст устройства и многие функции GDI инкапсулирует класс CDC. В нем представлены функции создания и инициализации контекста устройства, а также функции рисования. Помимо класса CDC существует масса специализированных классов, производных от него (таблица 1).
Класс | Описание |
---|---|
CPaintDC | Инкапсулирует контекст устройства, подготовленный для перерисовки недействительной области окна при получении сообщения WM_PAINT. Конструктор этого класса вызывает функцию CWnd::BeginPaint(), которая создает контекст устройства и подготавливает клиентскую область к графическому выводу. Для очистки памяти из деструктора вызывается функция CWnd::EndPaint() |
CClientDC | Описывает контекст устройства, представляющего клиентскую область окна |
CWindowDC | Инкапсулирует контекст устройства, представляющего все окно вместе с рамкой |
CMetafileDC | Содержит набор структур, хранящих изображение в аппаратно-независимом формате, который необходим при рисовании в метафайл Windows |
Графический вывод данных приложения осуществляется функцией-членом объекта представления OnDraw(). В производном от CView классе, котьорый создал мастер АррWizard, имеется функция-заглушка OnDraw(). К ней можно добавлять свой код для отображения данных. Она выглядит следующим образом:
void CMyAppView::OnDraw(CDC* pDC) { CMyAppDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here }
Обратите внимание на то, что в эту функцию передается указатель на объект CDC. Он необходим для вызова рисующих функций контекста устройства. Кроме того, функция OnDraw() получает указатель на объект документа, который Вы можете использовать для обращения к данным приложения.
Приведем простую реализацию функции OnDraw().
Рис.1. Выбор пункта Add Member Variable
Рис.2. Создание переменной
Рис.3. Выбор конструктора
Рис.4. Добавление строки
CSize TextSize = pDC->GetTextExtent(pDoc->m_string); CRect rect(10,10, 10+TextSize.cx,10+TextSize.cy); rect.InflateRect(4,4); pDC->Rectangle(&rect); pDC->TextOut(10,10,pDoc->m_string);
Рис.5. Функция OnDraw()
Выводы:
Если изменение данных документа может повлиять на их отображение, то представление должно быть перерисовано. Обычно такое происходит при внесении пользователем изменений в представление. При этом код, обновляющий данные документа, должен вызывать функцию-член класса документа UpdateAllViews(), уведомляющую все представления о необходимости перерисовки.
Функция UpdateAllViews() вызывает функцию-член каждого представления OnUpdate(). По умолчанию при этом перерисовывается вся клиентская область представления. Вы можете переопределить эту функцию так, что перерисовываться будут только те части окна, в которых произошло изменение.
Когда представление становится недействительным, Windоws сылает ему сообщение WM_PAINT. Обработчик этого cooбщения OnPaint() создает контекст устройства на основе класса CPaintDC и передает его в функцию OnDraw().
В программировании для Windows практически не существует разницы между выводом на экран и на принтер, потому что GDI - аппаратно-независимый интерфейс. Одни и те же функции могут использоваться для отображения на экран и для печати на принтер в зависимости от контекста устройства. Если объект класса CDC, который получает функция OnDraw(), представляет принтер, то и вывод выполняется на него.
Библиотека MFC позволяет осуществить печать документа. Каркас приложения сам отображает диалоговое окно Print и создает контекст устройства для принтера. При выборе пункта Print в меню File представление передает этот контекст устройства в функцию OnDraw(), которая и осуществляет вывод.
Рис.6. Вызов каркасом приложения функции OnDraw()
Однако между выводом на принтер и на экран есть существенные различия. При печати документ должен быть разделен на страницы, поэтому Вам необходимо знать размер листа бумаги. Кроме того важна на ориентация листа (книжная или альбомная). Для этого в классе CView предусмотрены специальные функции.
На следующем шаге мы рассмотрим конкретный пример приложения в архитектуре "документ/вид".