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

Void winapi EndPaint( hwnd hWnd, paintstruct far *lpps);

Функции BeginPaintиEndPaintможно использовать только внутри обработчика сообщенияWM_PAINT. Если требуется рисовать при обработке других сообщений, получить контекст отображения можно с помощью функцииGetDC() и освободить функциейReleaseDC();

Функция GetDCвозвращает контекст отображения для окна с идентификаторомhwnd:

HDC WINAPI GetDC( HWND hWnd );

Функция ReleaseDCосвобождает контекст изображенияhdc, полученный для окнаhwnd:

Int winapi ReleaseDc( hwnd hwnd, hdc hdc );

Каждый раз, когда приложение получает общий контекст отображения, его атрибуты получают значения по-умолчанию: белая кисть для заполнения фигур, черное перо для рисования линий и т.п. Если перед выполнением рисования приложение изменит атрибуты контекста отображения, вызвав соответствующие функции GDI, в следующий раз при получении значений эти атрибуты вновь примут значения по-умолчанию. Поэтому установка атрибутов должна выполняться каждый раз после получения общего контекста отображения.

Итак, данные в программе определяются следующим образом:

const float g_data[] = { 10.0f, 4.0f, 30.0f, 12.0f, 26.0f, 5.0f, 18.0f };

struct Brush

{

Int fnStyle;

COLORREF clrref;

};

unsigned int g_iNumOfPies;

Brush* g_pBrushes;

где g_data– массив некоторых данных, по которым строится диаграмма;

структура Brushбудет использоваться для хранения типов кистей (различные виды штриховки) и их цветов;

g_iNumOfPies– количество значений, по которым строится диаграмма;

g_pBrushes– кисти, массив будет динамически создан при запуске программы и заполнен случайными значениями, разумеется размеры массивовg_dataиg_pBrushesодинаковы и равныg_iNumOfPies.

После успешного создания окна массив кистей создается и заполняется:

case WM_CREATE:

g_iNumOfPies = sizeof(g_data) / sizeof(g_data[0]);

g_pBrushes = new Brush[g_iNumOfPies];

srand((unsigned int)time(NULL));

for (I = 0u; I < g_iNumOfPies; ++i)

{

g_pBrushes[i].fnStyle = rand() % 7;

g_pBrushes[i].clrref = RGB(rand() % 0xFF, rand() % 0xFF, rand() % 0xFF);

}

Зачем он нужен? Например, пользователь поменял размер окна, всю диаграмму придется перерисовать и при этом желательно, чтобы, цвета всех сегментов остались такими же какими были. Если программу запустить повторно, диаграмма перекрасится.

Все ресурсы, которые мы запрашиваем в программе, например, оперативную память под массив данных, должны быть освобождены при завершении программы. Это удобно сделать при обработке противоположного WM_CREATEсообщенияWM_DESTROY:

case WM_DESTROY:

If (g_pBrushes)

delete[] g_pBrushes;

Все действия по построению диаграммы осуществляются при обработке сообщения 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;

Весь код инкапсулирован в три пользовательские функции:

ShadyDiagram– построение полной диаграммы;

Diagram– построение части диаграммы (основной или тени);

DiagramPie– построение одного сегмента диаграммы.

ShadyDiagramпросто вызывает два раза функциюDiagramпередавая немного разные на величинуiShadowDepth(глубина тени) координаты центра для диаграммы и ее тени:

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