Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Обработка сообщений от ползунка
При перемещении бегунка элемент посылает сообщение 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_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; просмотров: 348. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |