Создание простейшего приложения в архитектуре «документ/вид»

   
На этом шаге мы рассмотрим различные примеры вывода значений переменных.

   
Создадим однодокументное приложение 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."

   
На следующем шаге мы рассмотрим еще одно приложение.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий