|
Программирование >> Процедурные приложения
координаты объектов отсчитываются (в пикселях) начиная с верхнего левою угла окна, имеющего координаты 0,0. Вот почему в программе SINE.C вид изображения будет меняться всякий раз при изменении разрешения экрана. В программе PINE.C устанавливается режим отображения mm isotropic. SetMapMode(hdc, MM ISOTROPIC) ; SetWindowExtEx(hdc, 500, 500, NULL); SetViewportExtEx(hdc, xClientView, -yClientView, NULL); SetViewportOrgEx(hdc, xClientView/2, yClientView/2, NULL); Режимы отображения, существующие в Windows, перечислены в табл. 17.4.
Режим mm isotropic позволяет программисту самостоятельно выбирать масштаб изображения по осям х и у. Функция SetWindowExtEx( ) задает размеры окна по горизонтали и вертикали (в нашем примере они равны 500). Эти логические размеры автоматически преобразуются системой в соответствии с физическими размерами экрана. В функции SetviewportExtEx( ) устанавливается размер области просмотра (в пикселях). Отрицательное значение координаты у означает, что ось у направлена снизу вверх. Система сравнивает размеры окна и области просмотра и вычисляет соотношение между логическими единицами и пикселями. Функция SetViewportOrgEx( ) устанавливает координаты точки начала области просмотра (в пикселях). В нашем примере это будет центр окна. После вызова этих функций все последующие координаты можно указывать в логических единицах. Заголовок диаграммы выводится уже с учетом текущего режима отображения. Если размеры окна слишком малы, заголовок не показывается вообще. if (xClientView > 200) TextOutfhdc, strlen(szTString)*(-8/2) , 240, szTString,. 1 strlen (szTString) ); Прежде чем приступать к построению секторов диаграммы, давайте вернемся к началу процедуры WndProc и выясним, каким образом вычисляются относительные размеры секторов. В следующем фрагменте определяется, из скольких секторов будет состоять круг: iNWedges=0; for(i=0;i < maxnumwedge; i++) { if (iWedgesizeli] != 0) iNWedges++;} Приращение переменой iNWedgesвыполняется каждый раз, когда в массиве iWedgesize [i] обнаруживается ненулевое значение. Таким образом, по окончании цикла будет известно число секторов диаграммы. Накопительные размеры секторов хранятся в массиве iTotalWedge[] . Эти значения необходимы для вычисления границ между секторами. Например, если пользователь ввел в качестве размеров секторов значения 5, 10, 7 и 20, то в массиве iTotalWedge[] .. будут представлены значения 0, 5, 15, 22 и 42. Вот как они получаются: iTotalWedge[0] = 0; for(i= 0; i < iNWedges; i++) iTotalWedge[i+l] = iTotalWedge [i]+ iWedgesize [i]; Элементы массива iTotalWedge[ ] используются для вычисления начального и конечного углов каждого сектора. Вспомните, что функция Pie( ) принимает девять параметров. Первый является дескриптором контекста устройства. Следующие четыре определяют координаты прямоугольника, в который вписывается эллипс. В нашем примере выбраны координаты -200,200 и 200,-200. Оставшиеся четыре параметра определяют координаты начальной и конечной точек сектора. Координата х вычисляется с помощью функции cos( ) , а координата у - с помощью функции sin( ) . Так, начальную координату х первого сектора можно определить как произведение радиуса окружности на косинус значения 2*pi*iTotalWedge[0] . Коэффициент 2*piздесь необходим для преобразования градусов в радианы. Координаты конечной точки сектора определяются по тому же алгоритму, но для их вычисления используется следующий элемент массива iTotalWedge[] - iTotalWedge[1 ]. Чтобы все секторы вписались в круг, значение координаты делится на общий накопительный размер всех секторов - iTotalWedge [iNWedges]. for(i = 0; i < iNWedges; i++) { hBrush = CreateSolidBrush(lColor [i]) ; SelectObject (hdc, hBrush); Pie(hdc, -200, 200, 200, -200, (int)(radius*cos (2*pi*iTotalWedge [i]/ iTotalWedge [iNWedges] )), (int)(radius*sin (2*pi*iTotalWedge [i]/ iTotalWedge [ iNWedges] )), (int)(radius*cos(2*pi*iTotalWedge[i+l] / iTotalWedge [iNWedges] ), (int)(radius*sin(2*pi*iTotalWedge[i+l] / , iTotalWedge [ iNWedges ]); Весь цикл повторяется столько раз, сколько указано в переменной iNWedges. Диаграмма, представленная на рис. 17.18, строится по умолчанию, а показанная на рис. 17.19 - на основании значений, введенных пользователем. Рис. 17.18. Диаграмма, построенная по умолчанию Рис. 17.19. Диаграмма, построенная с учетом введеных пользователем данных
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |