|
Программирование >> Процедурные приложения
CFourierDataDialog() передает конструктору родительского класса имя диалогового окна, FourierData, и указатель на родительское окно. Диалоговое окно возвращает введенные данные после щелчка пользователя на кнопке ОК. Для диалоговых окон, требующих предварительной инициализации, может быть переопределен метод OninitDialog(). Файлы ресурсов Файл FOURIERR.H содержит пять идентификаторов. Константы idm four, idm aboutи Idm exitслужат идентификаторами команд меню, тогда как константы IDD TERMS и IDD TITLE используются для описания элементов диалогового окна. Файл FOURIER. RC содержит описания меню и диалоговых окон. Файл FOURIER.CPP Сложность программного кода рассматриваемого приложения возросла по сравнению с предыдущими примерами, поскольку в него были добавлены меню и два диалоговых окна. В следующих параграфах вы, в частности, узнаете, как: определить текущие размеры окна; нарисовать объект в окне и выполнить его заливку; выбрать новый указатель мыши; задать область просмотра и начало координат; установить цвет фона. Создание окна Одновременно с созданием окна выполняется регистрация класса окна с помощью функции AfxRegisterWndciass() . В качестве указателя мыши устанавливается перекрестие (idc cross), для заливки фона выбирается белая кисть (white brush), а значком приложения становится стандартный системный значок (последний параметр равен null). CMainWnd::CMainWnd() ( Create(AfxRegisterWndciass(CS HREDRAW I CS VREDRAW, LoadCursor(NULL, IDC CROSS), (HBROSH)(GetStockObject(WHITE BRUSH)), NULL), Fourier Series Application with the MFC , WSJDVERLAPPEDWINDOW, rectDefault, NULL, FourierMenu ); 1 Обратите также внимание, что в функции Create() задается название меню приложения. Определение текущих размеров окна Сообщение wm sizeгенерируется всякий раз, когда изменяются размеры окна приложения. В функцию OnSizet)передаются текущие размеры окна, которые сохраняются в переменных m cxdientи m cyClient: void CMainWnd::OnSize(UINT, int x, int y) { m cxClient = x; m cyClient = y; Значения этих переменных используются для масштабирования содержимого окна в соответствии с его размерами. Построение ряда Фурье Чтобы избежать проблем с масштабированием выводимого изображения, о которых упоминалось выше, создается свободно масштабируемая поверхность рисования. Сначала с помощью функции SetMapMode() устанавливается режим отображения MM ISOTROPIC: dc.SetMapMode(MM ISOTROPIC); Далее логические размеры окна задаются равными по вертикали и горизонтали 500 единицам: dc.SetWindowExt(500,500); Это означает, что какими бы ни были действительные размеры окна, программа будет рассматривать его как квадрат со сторонами по 500 единиц. В следующей строке размеры области просмотра задаются равными текущим размерам рабочей области окна: dc.SetViewportExt(ra cxClient, -m cyClient); Это является гарантией того, что все содержимое окна будет видимым. Отрицательное значение у означает, что ось у увеличивается в направлении снизу вверх. В следующей строке точка начала области просмотра устанавливается на пересечении середины оси у и одной пятой от левого края оси х. dc.SetViewportOrg(m cxClient/20, m cyClient/2); Затем строятся оси координат х и у. рисование осей координат х и у dc.MoveTo(0, 240); dc.LineTo(0, -240); dc.MoveTo(0, 0); dc.LineTo(400, 0); dc.MoveTo(0,0); Показанный ниже фрагмент программы, ответственный за выведение на экран ряда Фурье, содержит два цикла for. В переменной цикла i хранится значение координаты х, я в переменной цикла j - значение текущей гармоники. Координата у каждой точки представляет собой сумму значений всех гармоник для заданного угла. рисование ряда Фурье for(i= 0; i <= 400; { for (j = 1; j <= nterms; y= (150.0/((2.0*j)-1.0)) * sin(((j*2.0)-1.0)*0.015708*ang); yp = yp + y; } dc.LineTo (i, (int)yp); yp -= ур; ang++; Для связи всех точек графика в единую кривую используется функция LineTo(). Внутренняя область графика будет закрашена серым цветом с помощью функции ExtFloodFill(). Эта функция требует указания координат произвольной точки внутри закрашиваемой области и цвета границы области. Установка параметра floodfillborder означает, что функция будет закрашивать всю область до границы, заданной указанным цветом. заливка внутренних областей графика сер1м цветом newbrush.CreateSolidBrushfdwColor[7]) ; oldbrush = dc.SelectObject(Snewbrush); dc.ExtFloodFill (150,10, dwColor[0], FLOODFILLBORDER); dc.ExtFloodFill(300,-10,dwColorfO],FLOODFILLBORDER) ; Построение графика завершается выведением надписи и удалением из памяти созданного ранее объекта кисти: вывод заголовка графика Ititle = strlen(mytitle); dc.TextOut(200-(ltitle*8/2), 185, mytitle, Ititle); удаление кистей dc.SelectObject(oldbrush); newbrush.DeleteObjeot() ; Диалоговое окно About Окна типа About служат для выдачи пользователю информации о программе, ее авторах, авторских правах и т.д. Модальное диалоговое окно About появляется на экране при выборе в меню команды Fourier About..., в результате чего вызывается функция OnAbout(): void CMainWnd::OnAbout() { CDialog about( AboutBox , this); about.DoModal(); } Конструктор класса CDialogвоспринимает текущее окно как родительский объект. С этой целью используется указатель this, который всегда указывает на текущий объект. Метод DoModal() выводит диалоговое окно About на экран. После щелчка на кнопке ОК Окно About удаляется с экрана и становится доступным окно приложения, которое при этом перерисовывается. Окно ввода данных Диалоговое окно, принимающее данные от пользователя, вызывается путем выбора в меню команды FourierData.... В нем пользователь получает возможность ввести заголовок графика и задать количество членов ряда Фурье. После щелчка на кнопке ОК окно удаляется с экрана и обновляется рабочая область окна приложения. void CMainWnd::OnFourierData() CFourierDataDialog dlgFourierData(this); if (dlgFourierData.DoModal() == IDOK) InvalidateRect(NULL, TRUE); UpdateWindow(); } }; В файле FOURIER.H классCFourierDataDialog объявлен потомком класса CDialog. Обратите внимание, что к моменту завершения функции DoModal()введенные пользователем данные уже переданы в программу. Это происходит в методе ОпОК (), вызываемом путем щелчка на кнопке ОК: void CFourierDataDialog:: 0n0K() 1 GetDlgItemText(IDD TITLE, mytitle, 80); nterms = GetDlgItemInt(IDD TERMS, NULL, 0); CDialog: :OnOK(); Функция GetDlgitemText() записывает строку заголовка графика (определяемую по идентификатору iddjtitle) в переменную mytitle. Аналогичным образом с помощью функции GetDlgltemlntО возвращается введенное пользователем количество членов ряда Фурье. Поле, в котором вводится это число, идентифицируется константой IDD TERMS. Второй параметр функции GetDlgltemlnt() позволяет проконтролировать успешность преобразования введенной строки в число, но в нашем приложении эта возможность не используется. Если третий параметр не равен нулю, функция должна проверять наличие знака минус и в случае необходимости возвращать знаковое число. Но поскольку в нашем случае значения должны быть только положительными, этот параметр установлен равным 0. Вызов функции OnExit( ) В меню также содержится команда Exit, при вызове которой с экрана удаляется окно приложения, для чего вызывается функция DestroyWindow(): void CMainWnd::OnExit() { DestroyWindow () ; } Схема сообщений Вмакросе BEGIN MESSAGE MAP указываются два класса: CMainWnd иCFrameWnd. Принимающей стороной является класс CMainWnd, а в классе CFrameWndсодержатся базовые обработчики. Макрос on hm paint() управляет обработкой всех сообщений WM PAINT, направляя их методу OnPaint(). Другой макрос, ON WM SIZE(), управляет сообщениями WM SIZE и направляет их методу OnSize(). Макрос ON WM CREATE() связан с сообщениями wm create, которые передаются методу OnCreate(). И еще один макрос,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |