Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_elektronnykh_ustroystv.doc
Скачиваний:
53
Добавлен:
28.05.2015
Размер:
1.44 Mб
Скачать

Void Diagram(hdc hDc, int X, int y, int r, bool fShadow, const float* pData, const Brush* pBrushes, unsigned int iNumOfPies)

{

HPEN hOldPen, hPen;

char szLabel[BUFSIZ];

int dx, dy;

float e, s;

float k;

unsigned int I;

for (I = 0u, s = 0.0f; I < iNumOfPies; ++i)

s += pData[i];

if (s == 0.0f)

return;

k = (float)(2.0f * M_PI / s);

hPen = CreatePen(PS_SOLID, 2, 0);

hOldPen = (HPEN)SelectObject(hDC, hPen);

for (I = 0u, s = 0.0f; I < iNumOfPies; ++i)

{

e = s + pData[i] * k;

if (I == 1 || I == 3 || I == 6)

{

dx = int(cos((e + s) / 2) * r * 0.25f);

dy = int(sin((e + s) / 2) * r * 0.25f);

}

else

{

dx = dy = 0;

}

sprintf(szLabel, “%d - %.02f (%.0f%%)”, I + 1u, (float)pData[i], (float)(pData[i] * k * 50.0f / M_PI));

If (fShadow)

DiagramPie(hDC, x + dx, y + dy, r, s, e, 6, 0, NULL);

else

DiagramPie(hDC, x + dx, y + dy, r, s, e, pBrushes[i].fnStyle, pBrushes[i].clrref, szLabel);

s = e;

}

SelectObject(hDC, hOldPen);

DeleteObject(hPen);

return;

}

Void DiagramPie(hdc hDc, int X, int y, int r, float s, float e, int fnStyle, colorref clrref, const char* szLabel)

{

HBRUSH hBrush, hOldBrush;

float dx, dy;

float m;

hBrush = CreateHatchBrush(fnStyle, clrref);

hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);

Pie(

hDC,

x – r,

y – r,

x + r,

y + r,

x + int(cosf(e) * r),

y + int(sinf(e) * r),

x + int(cosf(s) * r),

y + int(sinf(s) * r)

);

SelectObject(hDC, hOldBrush);

DeleteObject(hBrush);

If (!szLabel)

return;

m = (e + s) / 2.0f;

dx = cosf(m) * r;

dy = sinf(m) * r;

MoveToEx(

hDC,

x + int(dx * 0.5f),

y + int(dy * 0.5f),

NULL

);

LineTo(

hDC,

x + int(dx * 1.2f),

y + int(dy * 1.2f)

);

TextOut(

hDC,

x + int(dx * 1.25f) + 5,

y + int(dy * 1.25f) – 15,

szLabel,

(int)strlen(szLabel)

);

return;

}

Void ShadyDiagram(hdc hDc, int X, int y, int r, int iShadowDepth, const float* pData, const Brush* pBrushes, unsigned int iNumOfPies)

{

Diagram(hDC, x + iShadowDepth, y + iShadowDepth, r, true, pData, pBrushes, iNumOfPies);

Diagram(hDC, x, y, r, false, pData, pBrushes, iNumOfPies);

return;

}

Подробно рассмотрим ее работу. Вывод на экран осуществляется при обработке сообщения WM_PAINT:

case WM_PAINT:

hDC = BeginPaint(hWnd, &ps);

ShadyDiagram(hDC, 320, 260, 200, 10, g_data, g_pBrushes, g_iNumOfPies);

EndPaint(hWnd, &ps);

break;

Почему нельзя просто вывести данные в произвольном месте программы? Современные операционные системы, как правило, являются многозадачными, что означает возможность одновременной работы нескольких программ. Допустим, Вы отобразили в окне программы какой-то рисунок, потом окно частично перекрывается другим окном или полностью исчезает с экрана. Затем через некоторое время верхнее окно сдвигается. Казалось бы, операционная система должна самостоятельно восстановить пропавшую часть изображения. Увы, но это не так.

Существует взаимодействие «документ – вид», используемое при графических построениях с помощью электронных устройств. Документ представляет некие данные, невидимые для пользователя, хранимые в памяти компьютера, которые пользователь может редактировать, загружать и сохранять, используя диск. С другой стороны вид – временные данные, которые связаны с документом, и которые пользователь ассоциирует с ним. Например, текстовый документ программы «Блокнот» – массив байт, каждый байт представляет один символ, хранимый в оперативной памяти. Видом этого документа является графическое изображение на экране монитора с помощью шрифта определенного типа, размера, цвета и т.д. Вид можно всегда восстановить по данным документа, используя предопределенный программистом алгоритм, что и осуществляется при обработке сообщения WM_PAINT.

Функция BeginPaintвозвращает контекст отображения для окнаhWnd:

HDC WINAPI BeginPaint( HWND hWnd, PAINTSTRUCT FAR *lpps);

Перед этим функция подготавливает окно для рисования, заполняя структуру PAINTSTRUCTинформацией, которую можно использовать в процессе рисования.

Контекст отображения, полученный с помощью функции BeginPaint, необходимо освободить перед завершением обработки сообщенияWM_PAINT, вызвав функциюEndPaint с теми же параметрами:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]