Cтраница 1
Функция класса представления вызывается для отображения документа в окне представления при автономном выполнении программы. Заметьте: при запуске сервера для редактирования компонента OLE сервер создает объект представления для отображения компонента, а также объекты приложения, документа и обрамляющего окна. [1]
Функция InvalidateRect вызывает функцию OnDraw класса представления, которая, в свою очередь, вызывает функцию GetClipBox, чтобы получить размеры недействительной области и перерисовать только тот текст и графику, которые находятся в этой области. [2]
Так как DrawFractal не является функцией класса представления, то при создании объекта контекста устройства она не может просто передать указатель this в конструктор cciientDC, а передает дескриптор окна представления ( содержащийся в параметре функции DrawFractal) в функцию CWnd: : FromHandle для получения указателя на новый временный объект окна представления. [3]
Для отображения графического объекта с помощью функции OnDraw класса представления используется объект контекста устройства, адрес которого передается в функцию. [4]
Следующий пример обработчика сообщения COMMAND для команды Сору ( определенной как функции класса представления) иллюстрирует действия, описанные в разделе. [5]
Теперь добавим данные для сохранения строки текста, реализуем функции обработки сообщений, сгенерированные выше, и добавим код в функцию OnDraw класса представления. [6]
После того как MFC вызовет функцию OnPreparePrinting, чтобы подготовить объект контекста устройства для печати или просмотра, она передает этот объект в функцию OnDraw класса представления. Поскольку объект контекста устройства связывается с принтером, а не с окном представления, выводимая графическая информация появляется на печатаемой странице ( или в окне предварительного просмотра печати), а не внутри окна представления. Единственная программа рисования внутри функции OnDraw имеет возможность отобразить выводимую информацию как в окне представления, так и при печати, поскольку вызываемые для этого функции класса CDC в достаточной степени аппаратно независимы. [7]
Передает объект InvalidRect в функцию InvalidateRect класса CWnd, что делает указанную прямоугольную область недействительной ( т.е. помечает ее как требующую перерисовки) и вызывает функцию OnDraw класса представления. Передаваемые в функцию InvalidateRect координаты - это координаты устройства. Обратите внимание: если координаты устройства, переданные в функцию InvalidateRect, не принадлежат области окна представления ( например, одно окно представления в настоящее время не отображает часть рисунка, измененную в другом окне), часть окна представления не становится недействительной. [8]
Поскольку функция OpenClipboard принадлежит классу CWnd, то предполагается, что код внутри функции класса, наследуемого от CWnd, такой же, как и у функции класса представления программы. [9]
При рисовании с помощью функции OnDraw класса представления можно использовать объект контекста устройства, передаваемый в функцию. [10]
Теперь программа постоянно хранит данные, позволяющие восстановить линию, а класс представления может использовать их при перерисовке окна. Вспомните: для перерисовки окна система удаляет его содержимое, а затем вызывает функцию OnDraw класса представления. В минимальную версию функции OnDraw, генерируемую мастером АррWizard, необходимо добавить собственный код для перерисовки окна. [11]
Обычно этот текст сохраняется в классе документа ( позже вы увидите, как это делается) и отображается функцией OnDraw класса представления. [12]
Для завершения действий, описанных в пункте 1, функция OnDraw ничего не выполняет, поэтому программе передается указатель на уже созданный объект контекста устройства. Вспомните: для отображения текста или графики необходимо иметь объект контекста устройства, который связан с определенным устройством ( например, окном на экране или принтером), сохраняющим информацию о шрифте и других атрибутах рисования, и предоставляет функцию для рисования графических изображений на контекстно-связанном устройстве. Если программа отображает выводимую информацию с помощью функции класса представления, отличной от функции OnDraw, создается собственный объект контекста устройства. Эта методика реализована в функции CEchoView: : OnChar в программе Echo, описанной ниже. [13]
Каждый тип сообщения имеет идентификатор. Например, при нажатии пользователем левой кнопки мыши, когда указатель мыши находится внутри окна представления, передается идентификатор WM LBUTTONDOWN. Если на это событие нужно ответить, можно использовать мастер ClassWizard, чтобы определить обработчик сообщений WM LBUTTONDOWN как функцию класса представления. [14]
В данной главе программа MiniDraw, созданная в предыдущей главе, будет дополнена основными возможностями класса документа. Сначала в него добавятся переменные, сохраняющие координаты созданной линии. После этого реализуется функция OnDraw класса представления, восстанавливающая линии при перерисовке окна с использованием данных, сохраненных объектом документа. [15]