На этом шаге мы рассмотрим различные примеры вывода значений переменных.
Создадим однодокументное приложение Hello, описанное на 23 шаге.
Изменим созданную мастером программу так, чтобы она выводила сообщение "Добро пожаловать в Visual C++!".
Один из способов решения данной задачи состоит в изменении метода OnDraw() класса CHelloView
(класса объекта вида, используемого для отображения данных). Этот метод вызывается тогда, когда нужно
что-то вывести в клиентской области программы.
Для изменения метода нужно на вкладке ClassView найти класс CHelloView и вывести его
список методов. Переход к редактированию метода - двойной щелчок по имени метода. После изменения
метод должен выглядеть следующим образом (в тексте реализации метода добавлены поясняющие комментарии):
void CHelloView::OnDraw(CDC* pDC) { CString h="Добро пожаловать в Visual C++!"; CHelloDoc* pDoc = GetDocument(); //Указатель на объект документа ASSERT_VALID(pDoc); //Макрос, проверяющий "правильность" //указателя на объект документа pDC->TextOut(0,0,h);//Вывод текста через указатель //на контекст устройства // TODO: add draw code for native data here }
Рис.1. Изменение метода CHelloView::OnDraw()
Текст этого приложения можно взять здесь (25,5 Кб).
В приведенной программе данные (переменная h) хранились в объекте вида. Исправим программу так,
чтобы данные находились в объекте документа. Для этого выполним следующие действия:
- в описании класса CHelloDoc разместим переменную h (файл HelloDoc.h):
class CHelloDoc : public CDocument { protected: // create from serialization only CHelloDoc(); DECLARE_DYNCREATE(CHelloDoc) CString h; . . . }
Рис.2. Описание переменной h - в конструкторе класса CHelloDoc присвоим значение описанной переменной (файл HelloDoc.cpp):
CHelloDoc::CHelloDoc() { // TODO: add one-time construction code here h="Добро пожаловать в Visual C++!"; }
Рис.3. Присвоение начального значения - изменим метод OnDraw(), получив доступ к значению переменной h через указатель на объект документа:
void CHelloView::OnDraw(CDC* pDC) { CHelloDoc* pDoc = GetDocument(); //Указатель на объект документа ASSERT_VALID(pDoc); //Макрос, проверяющий "правильность" //указателя на объект документа pDC->TextOut(0,0,pDoc->h); // TODO: add draw code for native data here }
Рис.4. Вывод в контекст устройства
Текст измененного приложения можно взять здесь (27,6 Кб).
Прокомментируем приведенные приложения.
В первом приложении переменная h описывается в методе CHelloView::OnDraw(), поэтому
для данного случая не требуется получать указатель на объект документа и проверять его правильность.
Напомним, однако, что архитектура "документ/вид" разделяет данные и средства их обработки. Данная особенность
продемонстрирована во втором приложении. Описанние переменной h расположено в классе CHelloDoc.
Присваивание начального значения этой переменной осуществляется в конструкторе класса CHelloDoc().
Вывод значения переменной h осуществляется в методе CHelloView::OnDraw() объекта вида.
Однако прежде всего нужно связать объекты документа и вида. Поэтому сначала создается указатель
pDoc, получающий адрес объекта документа с помощью функции GetDocument().
При выполнении этой функции возможно появление ошибок, поэтому после ее выполнения нужно проверить:
действительно ли указатель pDoc содержит адрес объекта документа. Это достигается использованием
макроса ASSERT_VALID(pDoc).
Если все проверки завершились успешно, то можно приступать к выводу значения переменной h, тем более,
что доступ к ней мы можем получить, используя указатель на объект документа.
Но для вывода значения переменной h нужно иметь указатель на контекст устройства вывода, которым
в нашем случае является клиентская область окна. Этот указатель передается нам как параметр CDC* pDC метода
CHelloView::OnDraw().
Таким образом, строка:
pDC->TextOut(0,0,pDoc->h);
"расшифровывается" так: воспользоваться методом TextOut() контекста устройства, заданного указателем
pDC, и вывести, начиная с точки с координатами (0,0) значение переменной h, находящейся в объекте
документа, доступ к которому осуществляется через указатель pDoc."
На следующем шаге мы рассмотрим еще одно приложение.