На этом шаге мы рассмотрим различные примеры вывода значений переменных.
Создадим однодокументное приложение Hello, описанное на 23 шаге.
Изменим созданную мастером программу так, чтобы она выводила сообщение
Для изменения метода нужно на вкладке 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()
В приведенной программе данные (переменная h) хранились в объекте вида. Исправим программу так, чтобы данные находились в объекте документа. Для этого выполним следующие действия:
class CHelloDoc : public CDocument { protected: // create from serialization only CHelloDoc(); DECLARE_DYNCREATE(CHelloDoc) CString h; . . . }
Рис.2. Описание переменной h
CHelloDoc::CHelloDoc()
{
// TODO: add one-time construction code here
h="Добро пожаловать в Visual C++!";
}
Рис.3. Присвоение начального значения
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. Вывод в контекст устройства
Прокомментируем приведенные приложения.
В первом приложении переменная 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."
На следующем шаге мы рассмотрим еще одно приложение.