Cтраница 2
Его конкретный тип задается объектом контекста устройства, передаваемого функции в качестве параметра. Например, для вывода на экран она получает в качестве параметра указатель на объект класса CPaintDC, а для печати документа - на объект класса CDC, ассоциированного с текущим принтером. [16]
Наконец, функция OnChar создает объект контекста устройства для окна представления и использует его для отображения всей строки, включая новый символ в конце. Даже если в окно просто добавляется последний символ, то заново отобразить строку проще, чем вычислять позицию последнего символа и выводить этот символ. Определение точного места символа в строке - сложная задача для шрифтов с переменным питчем или курсивных шрифтов. [17]
Функция OnDraw принимает указатель на объект контекста устройства, являющийся экземпляром класса CDC библиотеки MFC. Объект контекста устройства связан с определенным устройством ( в WinGreet - с окном представления) и обеспечивает набор функций-членов для отображения выводимой информации на этом устройстве. Чтобы поместить строку в центре окна представления, эта функция вызывает функцию-член GetclientRect класса CWrid для получения текущих размеров окна представления. Объект контекста устройства и функция DrawText описаны в гл. [18]
При вычислении высоты текста создается объект контекста устройства окна представления, затем выбирается объект шрифта в объекте контекста устройства и вызывается функция GetTextMetrics для получения размеров символов. Высота текста равна сумме высоты одиночной строки, умноженной на количество строк, и высоты верхнего поля. [19]
Выберите перо или кисть в объекте контекста устройства, сохраняя указатель на предыдущее перо или кисть. [20]
Перо или кисть необходимо удалить из объекта контекста устройства, чтобы объект контекста устройства не хранил некорректный дескриптор после удаления объекта. При инициализации пера или кисти Windows добавляет дескриптор, сохраняемый внутри объекта. При выборе пера или кисти объект контекста устройства также сохраняет этот дескриптор. Когда объекты выходят за пределы области видимости или удаляются, деструктор объекта уничтожает дескриптор. Однако этот шаг не нужно выполнять, если объект контекста устройства удаляется до удаления объекта пера или кисти. [21]
При отображении текста в окне необходимо получить объект контекста устройства. Если текст отображается функцией OnDraw, то используется объект контекста устройства, адрес которого передан в эту функцию. [22]
Для рисования внутри окна функция OnMouseMove создает объект контекста устройства, связанный с окном представления. Объекты контекста устройства описаны в гл. Объект класса cciientDC позволяет рисовать внутри окна представления с помощью функции, отличающейся от OnDraw. Затем OnMouseMove вызывает функцию CDC: : SetROP2, задающую режим рисования, в котором линии строятся методом инвертирования ( обращения) текущего цвета экрана. В этом режиме линия, нарисованная в определенной позиции в первый раз, будет видима, а при повторном выводе в той же самой позиции - невидима. Таким образом, обработчики сообщения легко отображают и удаляют группы временных линий. Линии выводятся с помощью CDC: : MoveTo, указывающей положение одного конца линии, и CDC: : LineTo, задающей положение другого конца. Объекты контекста устройства описаны в гл. [23]
Когда документ печатается или просматривается, MFC готовит объект контекста устройства, связанный с принтером, и передает его в функцию OnDraw. Однако при просмотре документа код MFC в объекте контекста устройства фактически передается в окно предварительного просмотра. При этом используется отдельный контекст устройства, который связан с окном представления и задает установки для имитации печатаемой страницы. [24]
![]() |
Порядок печати последовательных страниц с частями рисунка. [25] |
Фрагмент, добавленный в функцию OnPrepareDC, размещает объект контекста устройства, используя тот же метод, который использовался в классе GScrollView при прокрутке документа в окне представления, т.е. настраивает начало представления ( см. параграф Преобразование координат гл. Перед печатью каждой новой страницы функция OnPrepareDC настраивает начало представления, сдвигая позиции фигур относительно страницы, чтобы при вызове функции OnDraw печаталась следующая часть документа. [26]
Как известно, для отображения текста или графики необходим объект контекста устройства, соответствующий окну или устройству вывода данных. При рисовании этот объект сохраняет выбранные средства и установленные атрибуты и предоставляет функции-члены для рисования точек, линий, прямоугольников и других фигур. [27]
Фрагмент программы, добавленный в функцию OnBeginPrinting, использует объект контекста устройства для вызова функции GetDevicecaps класса CDC, чтобы получить размеры доступной для печати области страницы. [28]
Функция DisplayBitmap отображает растровое изображение на устройстве, соответствующем объекту контекста устройства, передаваемому в первом параметре. Второй параметр содержит адрес объекта растрового изображения, который необходимо инициализировать, используя один из описанных ниже способов, совместимых с экраном. Последние два параметра описывают горизонтальную и вертикальную координаты позиции внутри целевого устройства, в левом верхнем углу которого должно размещаться растровое изображение. [29]
После того как MFC вызовет функцию OnPreparePrinting, чтобы подготовить объект контекста устройства для печати или просмотра, она передает этот объект в функцию OnDraw класса представления. Поскольку объект контекста устройства связывается с принтером, а не с окном представления, выводимая графическая информация появляется на печатаемой странице ( или в окне предварительного просмотра печати), а не внутри окна представления. Единственная программа рисования внутри функции OnDraw имеет возможность отобразить выводимую информацию как в окне представления, так и при печати, поскольку вызываемые для этого функции класса CDC в достаточной степени аппаратно независимы. [30]