Программирование >>  Процедурные приложения 

1 ... 100 101 102 [ 103 ] 104 105 106 ... 150


координаты объектов отсчитываются (в пикселях) начиная с верхнего левою угла окна, имеющего координаты 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.

Таблица 17.4. Режимы отображения

Режим

Описание

mm anisotropic

Одной логической единице соответствует произвольная физическая единица; масштабирование по осям х и у независимое

mm hienglish

Одной логической единице соответствует 0,001 дюйма; ось у направлена снизу вверх

mm himetric

Одной логической единице соответствует 0,01 мм; ось у направлена снизу вверх

mm isotropic

Одной логической единице соответствует произвольная физическая единица; масштаб по осям х и у одинаков

mm loenglish

Одной логической единице соответствует 0,01 дюйма; ось у направлена снизу вверх

mm lometric

Одной логической единице соответствует 0,1 мм; ось у направлена снизу вверх

MM TEXT

Одной логической единице соответствует один пиксель; ось у направлена сверху вниз (это режим по умолчанию)

MM TWIPS

Одной логической единице соответствует 1/20 точки принтера (1/1440 дюйма); ось у направлена снизу вверх

Режим 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. Диаграмма, построенная с учетом введеных пользователем данных



1 ... 100 101 102 [ 103 ] 104 105 106 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика