Студопедия

КАТЕГОРИИ:

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

Обработка сообщений от ползунка     




При перемещении бегунка элемент посылает сообщение WM_HSCROLL (WM_VSCROLL для вертикальных ползунков). При помощи ClassWizard свяжите сообщение WM_HSCROLL с методом OnHScroll() (OnVScroll() для вертикальных ползунков). Проследите, чтобы при добавлении обработчика в ClassWizard был выбран идентификатор объекта CSliderDlg. Метод OnHScrol() обрабатывает сообщения, предназначенные для диалогового окна:    

void CSlidersDlg: :OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

// TODO: добавьте код обработки сообщения

// и/или вызовите обработчик по умолчанию

}

Параметрами данного метода являются код операции прокрутки, новая позиция ползунка и указатель на управляющий элемент, от которого поступило сообщение. Возврат из операции может принимать стандартные значения, перечисленные в табл. 8.4.

Таблица 8.4. Сообщения о прокрутке в Windows

Код операции Значение
SB_ENDSCROLL Завершение прокрутки
SB_LEFT Прокрутка в крайнюю левую позицию
SB_LINELEFT Прокрутка влево
SB_LINERIGHT Прокрутка вправо
SB_PAGELEFT Прокрутка на страницу влево
SB_PAGERIGHT Прокрутка на страницу вправо
SB_RIGHT Прокрутка в крайнюю правую позицию
SB_THUMBPOSITION Прокрутка в заданную позицию
SB_THUMBTRACK Перемещение бегунка в заданную позицию

В нашем случае необходимо перехватывать сообщения с кодом SB_THUMBPOSITION, посылаемые при перемещении бегунка (если вы захотите обрабатывать другие сообщения прокрутки, например, посылаемые при щелчках на шкале ползунка, включите в этот метод соответствующий код):

void CSlidersDlg: :OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

        if(nSBCode == SB_THUMBPOSITION){

}

else{

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

} }

Если в полученном сообщении содержался код прокрутки SB_THUMBPOSITION. значит, пользователь переместил бегунок, и мы должны вывести в текстовом поле его новую позицию.

Начнем с создания переменной m_text, связанной с содержимым текстового поля. Мы хотим присвоить ей значение параметра nPos, но как это сделать? Объект m_text относится к классу CString, а параметр nPos имеет целый тип. В следующем разделе мы научимся представлять целые числа в виде текстовой строки.

Отображение чисел в текстовых полях

Для нашей цели можно воспользоваться методом Format() класса CString. Передаваемая ему форматная строка ничем не отличается от форматных строк, используемых в строковых функциях С. Это означает, что форматирование параметра nPos в виде длинного целого и его последующее занесение в текстовое поле могут быть выполнены так:

void CSlidersDIg::OnHScroll(UINT nSBCode. UINT nPos. CScrollBar*

pScrollBar)

{

if(nSBCode == SB_THUMBPOSITION){

         m_text.Format("%ld", nPos);

         UpdateData(false);

}

 else{

CDialog::OnHScroll(nSBCode, nPos. pScroll Bar);

        }

}

Запустите программу. При перемещении бегунка в текстовом поле отображается информация о его текущей позиции. Программа sliders работает в полном соответствии с нашими планами, а мы освоили работу с ползунками.

ПОДСКАЗКА: Если в вашей программе содержится несколько типов элементов с возможностью прокрутки (ползунки, стандартные полосы прокрутки и т. д.), учтите, что при горизонтальной прокрутке все эти элементы будут вызывать метод OnHScroll(). Чтобы определить, кто именно вызвал OnHScroll(), поочередно сравните элемент, переданный методу в качестве параметра (то есть элемент, на который ссылается указатель pScrollBar), с различными элементами своей программы. Существует и другой способ — вы можете определить тип элемента, вызвавшего OnHScroll(), с помощью макроса Visual C++ RUNTIМE_CLASS (макросом называется именованный набор заранее написанных инструкций). Макрос возвращает указатель на объект CRuntmeClass, несущий информацию о классе объекта.

Работа с файлами

Наша очередная программа посвящена работе с файлами в Visual C++. Как вы вскоре убедитесь, написанные на Visual C++ программы наделяются существенной файловой поддержкой — и в командах меню, и в других, менее заметных, аспектах.

Из предыдущих программ мы уже знаем, что созданные с помощью AppWizard приложения (не основанные на диалоговых окнах) имеют встроенное меню File с командами Save As, Open и New; мы узнаем, как наделить эти команды полезными функциями. Мы воспользуемся встроенными файловыми средствами программы - эта методика известна под названием сериализацииданных. После должной подготовки процесса сериализации данных в методеSerialize()документа пользователь сможет пользоваться файловыми командами меню File — Open, Save и т. д. Здесь мы узнаем, как это делается, и научимся выполнять сериализацию (то есть чтение и запись на диск) как встроенных классов Visual C++ (например, CString), так и нестандартных, созданных нами классов.

Впрочем, иногда в программе отсутствует документ, на который можно возложить файловые операции. Например, программы на базе диалоговых окон не используют документов Visual C++; в таких случаях приходится работать с классом MFC CFile. Он обладает возможностями, необходимыми при работе с файлами в программах без документов как для записи данных на диск, так и для их последующего чтения.

Что такое сериализация?

Сериализацией называется процесс записи или чтения некоторого объекта с "постоянного носителя информации", или, проще говоря, с диска. В большинстве программ на Visual C++ вся работа с данными происходит в документах, поэтому этот раздел будет ориентирован на работу с объектом документа. В частности, включая в метод Serialize()документа код для сериализации данных, мы автоматически обеспечиваем работу файловых команд в меню File.

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

Создание программы writer

При помощи AppWizard создайте однодокументную (SDI) программу writer:

1. Начнем с добавления кода, который позволит приложению получать и отображать вводимые пользователем символы. Как и прежде, они будут храниться в объекте StringDataкласса CString, который принадлежит документу:

// writerDoc.h : интерфейс класса CWriterDoc

class CWriterDoc : public CDocument

 {

           protected: // создается только при сериализацим

CWriterDoc();

 DECLARE_DYNCREATE(CWriterDoc)

//Атрибуты

public:

 CString StringData;

2. ОбъектStringData необходимо инициализировать пустой строкой в конструкторе документа:

CWriterDoc::CWriterDoc()

{

 StringData = "";

}

При помощи ClassWizard свяжите сообщение WM_CHAR с методом OnChar() и затем добавьте код для сохранения вводимых символов в объектеStringData:

void CWriterView::OnChar(UINT nChar, UINT nRepCnt, DINT        nFlags)

{  

CWriterDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);.

pDoc->StringData += nChar;

Invalidate();

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

}

4. Обратите внимание - с вводом очередного символа мы объявляем вид недействительным. Чтобы вывести в окне новую строку, добавьте в метод OnDraw() следующий фрагмент:

void CWriterView::OnDraw(CDC* pDC)

{

CWriterDoc* pDoc = GetDocumentO;

ASSERT_VALID(pDoc);

pDC->TextOut(0, 0. pDoc->StringData):

}

5. Наша программа получает символы от пользователя, отображает их в окне и сохраняет в объекте StringData.

Теперь необходимо сделать так, чтобы пользователь мог сохранить данные программы (то есть объект StringData), и загрузить их с диска.










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

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