|
Программирование >> Процедурные приложения
x2 += IBarWidth; удаление кисти dc.SelectObject(oldbrush); newbrush.DeleteObject(); } int CMainWnd::OnCreate(LPCREATESTRUCT) { UpdateWindow(); return (0); void CMainWnd::OnAbout() { CDialog about( AboutDlgBox , this); about.DoModal(); } void CBarDataDialog::OnOK() GetDlgltemText(DMJTITLE, szTString, 80); GetDlgltemText(DM XLABEL, szXString, 80); GetDlgltemText(DM YLABEL, szYString, 80); iBarSize[0] = GetDlgltemlnt(DM P1, NULL, 0) iBarSize[l]= GetDlgltemlnt(DM P2, NULL, 0) iBarSize[2] = GetDlgltemlnt(DM P3, NULL, 0) iBarSize[3] = GetDlgltemlnt(DM P4, NULL, 0) iBarSize[4] = GetDlgltemlnt(DM P5, NULL, 0) iBarSize[5] = GetDlgltemlnt(DM P6, NULL, 0) iBarSize[6]= GetDlgltemlnt(DM P7, NULL, 0) iBarSize[7] = GetDlgltemlnt(DM P8, NULL, 0) iBarSize[8] = GetDlgltemlnt(DM P9, NULL, 0) iBarSize[9]= GetDlgltemlnt(DM P10, NULL, 0) CDialog: :OnOK(); void CMainWnd::OnBarData() { CBarDataDialog dlgBarData(this); if(dlgBarData.DoModal{) == IDOK) InvalidateRect(NULL, TRUE); UpdateWindow(); ) }; void CMainWnd::OnExit() { DestroyWindowO ; } BEGIN MESSAGE MAP(CMainWnd, CFrameWnd) ON WM PAINT() ON WM SIZE() ON WM CREATE () ON COMMAND(IDM ABOUT, OnAbout) ON COMMAND(IDM INPUT, OnBarData) ON COMMAND(IDM EXIT, OnExit) END MESSAGE MAP() BOOL CTheApp::Initlnstance() { m pMainWnd = new CMainWnd (); m pMainWnd->ShowWindow(m nCmdShow); m pMainWnd->UpdateWindow() ; return TRUE; Файл BARCHART.H В данной программе используются многие блоки, встречавшиеся в предыдущем приложении. Обратите, например, внимание на однотипность описания класса CMainWnd: afx msg void OnPaint(); afx msg void OnSize(UINT, int, int); afx msg int OnCreate(LPCREATESTROCT cs); afxjnsg void OnAbout(); afx msg void OnBarData(); afx msg void OnExit(); Объявление класса CBarDataDialog аналогично объявлению класса CFourierDataDialog из предыдущего примера. В то же время окно ввода данных поддерживает теперь ввод большего числа значений, хотя при его разработке мы взяли за основу аналогичное диалоговое окно из предыдущей программы. Файлы ресурсов Два исходных файла, BARCHARTR.H и BARCHRT.RC, объединяются компилятором ресурсов Microsoft в единый файл ресурсов BARCHART.RES. Файл заголовков BARCHARTR.Hсодержит идентификаторы трех команд меню: idm about, idm inputи IDM EXIT. Еще тринадцать идентификаторов относятся к элементам управления диалогового окна ввода данных. Три из них, dm title, DM XLABLEи dm ylable, связаны с заголовком и подписями к осям. Остальные десять констант, от DM P1 до ом Р10, указывают на целочисленные значения, введенные для отдельных столбцов гистограммы. Файл сценариев ресурсов BARCHART.RCсодержит описания меню и двух диалоговых окон. Приложение содержит два диалоговых окна. Окно About практически идентично тому, что использовалось в предыдущем приложении, а окно ввода данных является более сложным. Файл BARCHART.CPP В этом параграфе мы сконцентрируем внимание в первую очередь на тех программных блоках, которые не были представлены в предыдущем примере, т.е. являются уникальными для данного приложения. Программа на основании введенных данных строит гистограмму. С помощью модального диалогового окна BarChartData пользователь может ввести заголовок гистограммы, подписи к осям х и у и до десяти значений отдельных столбцов. Программа автоматически масштабирует размеры столбцов в соответствии с размерами рабочей области окна и назначает каждому из них цвет из предварительно заданного списка. В константе maxnumbarхранится информация о максимально допустимом числе столбцов гистограммы: #definemaxnumbar 10 В следующих массивах записаны заданные по умолчанию заголовок гистограммы, подписи к осям, а также размеры четырех столбцов: char szTString[80] = (barchart title area) ; char szXString[80] = x-axis label ; char szXString[80] - y-axis label ; int iBarSize[maxnumbar] = (20,10,40,50}; Размеры рабочей области окна приложения также сохраняются в глобальных переменных: int ii cxClient, m cyClient; Наличие этих переменных позволяет масштабировать содержимое окна в соответствии с его текущими размерами. Цвета столбцов гистограммы выбираются из массива dwColor в определенном порядке. Например, если гистограмма состоит из трех столбцов, то им будут назначены черный, красный и зеленый цвета. Классы CFont и CBrush позволяют передавать объекты шрифтов и кистей любым функциям класса CDC (базовый класс для работы с контекстами устройств). Новые шрифты требуются для вывода заголовка гистограммы и подписей к осям. Как объявляются такие объекты, показано ниже: CFont newfont; CFont* oldfont; CBrush newbrush; CBrush* oldbrush; Масштабирование столбцов При построении гистограммы прежде всего необходимо установить, сколько в ней будет столбцов. Данные о размерах столбцов хранятся в глобальном массиве iBarSize.Для определения числа столбцов используется следующий цикл: iNBars = 0; for(i=0;i < maxnumbar; i++) if (IBarSizefi] != 0) iNBars++; Значения записываются в этот массив при закрытии диалогового окна ввода данных, в методе ОпОК ( ) . Ширина столбцов зависит от их количества, так как ширина самой гистограммы постоянна. Для вычисления ширины столбцов используется следующая формула: IBarWidth = 400/iNBars; Высота столбцов регулируется с учетом максимального введенного значения. Сначала определяется, какова будет высота самого большого столбца: Поиск столбца с максимальной высотой IBarMax = iBarSize[0]; for(i= 0; i< iNBars; if(iBarMax < iBarSize [i])iBarMax = iBarSize [i]; Максимальное значение будет выведено слева от оси у. Для преобразования числового значения в строку вызывается функция itoa( ) : Преобразование максимального значения по оси у в строку strptr = itoa (iBarMax, sbuffer, 10); ilenMaxLabel= strlen (sbuffer) Размеры остальных столбцов масштабируются в соответствии с максимальным значением: Масштабирование столбцов в массиве. Максимальная высота столбца - 270. for(i=0;i < iNBars; i++) iBarSizeScaled[i] = iBarSize[i] * (270/iBarMax); Подготовка окна Прежде чем выводить гистограмму, необходимо задать режим отображения, установить размеры окна и области просмотра, а также координаты точки начала области просмотра: Задание режима отображения исоздание области просмотра dc.SetMapMode(MM ISOTROPIC) ; dc.SetWindowExt(640,400); dc.SetViewportExt(m cxClient, m cyClient); dc.SetViewportOrg(0, 0) ; Благодаря этому коду изображение гистограммы при изменении размеров окна будет автоматически масштабироваться. Вывод текста в окно В предыдущем приложении мы выводили текстовую информацию в окно при использовании шрифта, установленного по умолчанию. При необходимости применить какой-нибудь специальный шрифт или изменить ориентацию текста можно воспользоваться функциями работы со шрифтами, основными из которых являются CreateFont () иCreateFontlndirect () . В нашем примере использовалась функция CreateFont(). Что такое шрифт Под шрифтом понимают набор печатных символов, имеющих одинаковые начертание и размер. Шрифт включает символы букв, знаков препинания и других вспомогательных знаков. В качестве примеров различных шрифтов можно привести Arial размером в 12 пунктов, TimesNewRoman в 12 пунктов, TimesNewRomanв 14 пунктов и т.д. Пункт - это наименьшая единица в типографской системе мер, равная 0,376 мм. 72 пункта составляют один дюйм.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |