Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Получение символов с клавиатуры в multiview




Процедура чтения символов в программе multiview почти не отличается от предыдущих приведенных приложений. Это лишь подчеркивает то обстоятельство, что работа с несколькими документами и видами во многом похожа на работу с одним документом и видом — приложение выполняет большую часть работы за программиста.

Начнем с создания объектаStringDataкласса CString, в котором будут храниться введенные символы:

 // multiviewDoc.h: интерфейс класса CMultiviewDoc

 // Атрибуты

CString StringData;

В конструкторе документа необходимо занести в созданный объект пустую строку:

CMultivlewDoc::CMultiviewDoc()

 {

StringData = "";

}

Вот и все, что требуется сделать для хранения данных, — несмотря на то, что мы работаем с несколькими документами и несколькими видами. Для каждого документа программа создает особый объект документа (пользуясь шаблоном), поэтому по отношению к хранению данных программу можно писать так, словно она поддерживает всего один документ.

Когда наступит время сохранять документ на диске, необходимо лишь сохранить его версию объекта StringDataв методе Serialize():

void CMultiviewDoc::Serialize(CArchive& ar)

 {

           if (ar.IsStoring())

            {

           ar<<StringData;

}

else

{

  ar>>StringData;

      }

 }

Для каждого нового документа программа также создает новый объект вида, так что отображение данных, как и раньше, может выполняться методом OnDraw():

void. CMultiviewView::OnDraw(CDC* pDC)

{

CMultiviewDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

  pDC->TextOut(0, 0, pDoc->StringData); 

}

Мы получаем символы, вводимые пользователем, и заносим их в объект StringDataточно так же, как это делалось в предыдущих программах:

void CMultiviewView::OnChar(UINT nChar, UINT nRepCnt, UINT           nFlags)

 {

            CMultiviewDoc* pDoc = GetDocument();

   ASSERT_VALID(pDoc);

           Doc->StringData += nChar;

  Invalidate();

CView::OnChar(nChar, nRepCnt, nFlags);

}

Тем не менее, необходимо учесть одно важное обстоятельство. Выполняемые этом фрагменте действия относятся к конкретному виду - мы объявляем его недействительным, вызывая метод Invalidate(), чтобы обновить вид после чтения очередного символа с клавиатуры. Раз уж мы обновили один вид, следует предположить, что существуют и другие виды, которые также необходимо перерисовать. Для этого служит метод UpdateAllViews()объекта документа (во внутренних данных этого объекта хранится список всех видов):

void CMultiviewView::OnCnar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

         CMultiviewDoc* pDoc = Get0ocument();

         ASSERT,VALID(pDoc);

         pDoc->StringData += nChar;

         Invalidate();

         pDoc->UpdateAllViews(this, 0L, NULL);

          CView::OnChar(nChar, nRepCnt, nFlags);

         }

Данный метод вызывает методыOnUpdate()всех видов документа, а по умолчанию тот делает то же самое, что и Invalidate(), — заставляет вид перерисовать себя. Таким образом, метод UpdateAllViews() позволяет после ввода нового символа обновить все виды данного документа.

Обратите внимание на параметры, передаваемые UpdateAllViews(): ключевое слово this, длинное целое со значением 0 и указатель NULL. Для чего они нужны?

Первый параметр методаUpdateAllViews() является указателем на вид, вызывающий данный метод (чтобы документ не вызывал метод OnUpdate() текущего вида, поскольку текущий вид уже знает об изменениях в документе). Здесь мы передаем указатель this, ссылающийся на текущий объект.

Два следующих параметра позволяют передавать другим видам подсказки (hints) (термин, используемый в Visual C++), определяющие, какая часть данных нуждается в перерисовке.

Использование подсказок

Хотя в нашем примере подсказки не используются (вместо них передается 0 и указатель NULL), при изменении данных документа другим видам можно передать некоторый числовой код и указатель на объект. Обычно передается указатель на изменившийся объект в данных документа. Это позволит другим видам подойти к процессу обновления "интеллектуально" и обновить лишь те данные, которые действительно в этом нуждаются, не перерисовывая весь вид.

ПОДСКАЗКА: Конечно, вы не обязаны пользоваться подсказками, однако следует запомнить, что при выполнении в одном виде действий, относящихся лишь к данному виду (например, при объявлении вида недействительным для отражения изменений в данных), необходимо, по меньшей мере, вызвать UpdateAllViews(), чтобы обеспечить обновление и перерисовку всех остальных видов.

Флаг изменения документа

Помимо вызова UpdateAllViews(), мы также устанавливаем в методе OnChar() флаг изменения документа:

void CMultiviewView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CMultiviewDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData += nChar;

Invalidate();

pDoc->UpdateAllViews(this. 0L, NULL);

           pDoc->SetModifiedFlag();

CView::OnChar(nChar, nRepCnt, nFlags);

}     

Мы уже встречались с методом SetModifiedFlag()в предыдущих программах. Если пользователь попытается закрыть текущий документ при установленном флаге изменения, программа спросит, не желает ли он сохранить документ и избежать потери данных.

Программа multiview готова — запустите ее. В ней можно создать сразу несколько документов, а для каждого документа - несколько видов. Пользователь может сохранять и открывать эти документы. На примере программы multiview мы познакомились с основами многодокументного программирования.

Мы рассмотрели основные принципы работы с несколькими видами. Тем не менее, наличие нескольких видов принесет пользу лишь в том случае, если в них можно будет просматривать различные части документа. До настоящего момента содержимое различных видов было абсолютно одинаковым, но в следующем примере у пользователя появится возможность независимого просмотра разных частей документа в различных окнах.      










Последнее изменение этой страницы: 2018-04-12; просмотров: 272.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...