Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Ed->SetWindowText(програмування); //Встановлення тексту у полі редагування 4 страница






Наступна функція – Pie(). За її допомогою будується сектор, який будується на основі обмежуючого прямокутника і є частиною еліпса, вписаного у прямокутник. Сектор формується дугою – елементом еліпса та та відрізками двох обмежуючих променів, проведених з центру еліпса. Внутрішня частина сектора зоповнюється відповідно до стилю поточного пензля.

 

BOOL CDC:: Pie(int UpX, int UpY, int LowX, int LowY,

int StartX, int StartY, int EndX, int EndY);

BOOL CDC:: Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd);

Параметри функції Pie() – такі ж, як і у функції Arc(). Обробник із побудовою еліпса, дуги та сектора наведено у прикладі 4.15.

 

Приклад 4.15 – Обробник із побудовою еліпса, дуги та сектора

void CMainWin:: OnEllipse()

{CRect a(50, 50, 150, 200);

CPen bluePen(PS_DASH, 1, RGB(0, 0, 255));

CBrush lblueBrush(RGB(0, 255, 255));

memDC.SelectObject(& bluePen);

memDC.SelectObject(& lblueBrush);

memDC.Ellipse(& a); // еліпс

CRect b(200, 50, 300, 200);

CPen mPen(PS_SOLID, 4, RGB(0, 0, 255));

memDC.SelectObject(& mPen);

CPoint p1(250, 300), p2(150, 200);

memDC.Arc(& b, p2, p1); // дуга

CRect c(300, 50, 400, 200);

memDC.Pie(& c, p2, p1); // сектор

InvalidateRect(NULL); }

 

 

Рисунок 4.7 – Вигляд прикладу програми із використанням графічних функцій

Ще один приклад, який можна навести у зв’язку із використанням гра-фічних функцій MFC, наведено у прикладі 4.16. Метою програми є побудова програми для відображення стрілкового годинника.

Програму реалізовано із використанням двох класів: класу вікна та класу прикладки. Конструктор головного вікна реалізує концепцію віртуального вікна. Контроль часу здійснюється таймером, повідомлення якого надсилається програмі кожну 1 секунду. Власне, всі операції відображення годинника зосереджені в обробнику OnTimer().

Спочатку в обробнику отримується значення поточного локального часу, з якого окремо виділяють значення часу у секундах, хвилинах та годинах. Далі формується зображення годинника. Кожну секунду зображення циферблату годинника оновлюється: стирається старе положення стрілок годинника і будується нове положення стрілок. Стрілки відображуються різними кольорами: годинна – жовтим, хвилинна – зеленим, секундна – синім.

Текст програми із реалізацією стрілкового годинника показаний у прикладі 4.16, а вигляд вікна – на рисунку 4.8.

 

Приклад 4.16. – Текст програми із стрілковим годинником

 

// c01.h опис класів програми

class CApp: public CWinApp

{public: BOOL InitInstance(); };

 

class CMain: public CFrameWnd

{public: void OnTimer();

void OnPaint();

void OnExit();

CMain();

DECLARE_MESSAGE_MAP()

private: CDC memDC;

CBrush bkBrush;

CBitmap vbmp;

CMenu m_menu;

};

 

// c01.cpp - Опис функцій програми

include < afxwin.h>

#include < math.h>

#include " с01.h"

#include " resource.h"

 

int maxX, maxY;

double pi = 3.1415926535;

 

CMain:: CMain()

{CRect r(0, 0, 370, 410);

Create(NULL, " ", WS_OVERLAPPEDWINDOW, r);

m_menu.LoadMenu(IDR_MENU1);

SetMenu(& m_menu);

maxX=GetSystemMetrics(SM_CXSCREEN); maxY=GetSystemMetrics(SM_CYSCREEN);

CClientDC dc(this);

memDC.CreateCompatibleDC(& dc);

vbmp.CreateCompatibleBitmap(& dc, maxX, maxY);

memDC.SelectObject(& vbmp);

bkBrush.CreateStockObject(WHITE_BRUSH);

memDC.SelectObject(& bkBrush);

memDC.PatBlt(0, 0, maxX, maxY, PATCOPY);

SetTimer(1, 1000, NULL);

}

 

BOOL CApp:: InitInstance()

{m_pMainWnd = new CMain;

m_pMainWnd-> ShowWindow(m_nCmdShow);

m_pMainWnd-> UpdateWindow();

return TRUE;

}

 

BEGIN_MESSAGE_MAP(CMain, CFrameWnd)

ON_COMMAND(ID_FILE_EXIT, OnExit)

ON_WM_PAINT()

ON_WM_TIMER()

END_MESSAGE_MAP()

 

void CMain:: OnExit(){SendMessage(WM_CLOSE); }

 

CApp App;

 

void CMain:: OnPaint()

{CPaintDC dc(this);

dc.BitBlt(0, 0, maxX, maxY, & memDC, 0, 0, SRCCOPY); }

 

void CMain:: OnTimer()

{char s[250];

CTime curtime = CTime:: GetCurrentTime();

struct tm *newtime;

newtime=curtime.GetLocalTm();

wsprintf(s, asctime(newtime));

s[strlen(s)-1]='\0';

SetWindowText(s);

int Sec=newtime-> tm_sec; int Min=newtime-> tm_min; int Hour=newtime-> tm_hour;

CRect colo(0, 0, 350, 350);

CPen wPen(PS_SOLID, 5, RGB(255, 255, 255));

memDC.SelectObject(& wPen);

CBrush wbr(RGB(255, 255, 255));

memDC.SelectObject(& wbr);

memDC.Ellipse(colo);

CPen redPen(PS_SOLID, 5, RGB(255, 0, 0));

memDC.SelectObject(& redPen);

memDC.Ellipse(colo.left+5, colo.top+5, colo.right-5, colo.bottom-5);

memDC.Ellipse(170, 170, 180, 180);

for (int k=0; k< 12; k++){memDC.Ellipse

(170+160*cos(pi*k/6), 170+160*sin(pi*k/6), 180+160*cos(pi*k/6), 180+160*sin(pi*k/6)); }

InvalidateRect(colo);

int i=0;

if(Sec> =30)i=1;

int j=0;

if(Min> =15)j=1;

if(Min> =30)j=2;

if(Min> =45)j=3;

int x1, y1, x2, y2;

CPen yellowPen(PS_SOLID, 15, RGB(255, 255, 0));

memDC.SelectObject(& yellowPen);

if(Hour> =12)Hour=Hour-12; // перетворення 24-годинного формату годинника у 12-годинний

Hour=Hour-3; // перетворення формату годинника у формат обчислень

double Hr=pi*Hour/6+pi*j/16; // відлік часу враховує зміни у годинах та хвилинах

x1=15*cos(Hr); y1=15*sin(Hr);

memDC.MoveTo(175+x1, 175+y1);

x2=100*cos(Hr); y2=100*sin(Hr);

memDC.LineTo(175+x2, 175+y2);

CPen greenPen(PS_SOLID, 12, RGB(0, 255, 0));

memDC.SelectObject(& greenPen);

Min=Min-15; // різниця між системою координат годинника та відліком кутів складає 15 хвилин

double Mn=pi*Min/30+pi*i/60; // другий доданок враховує перехід через 30 секунд

x1=15*cos(Mn); y1=15*sin(Mn); memDC.MoveTo(175+x1, 175+y1);

x2=150*cos(Mn); y2=150*sin(Mn); memDC.LineTo(175+x2, 175+y2);

CPen bluePen(PS_SOLID, 5, RGB(0, 0, 255));

memDC.SelectObject(& bluePen);

Sec=Sec-15;

x1=15*cos(pi*Sec/30); y1=15*sin(pi*Sec/30);

memDC.MoveTo(175+x1, 175+y1);

x2=160*cos(pi*Sec/30); y2=160*sin(pi*Sec/30);

memDC.LineTo(175+x2, 175+y2);

}

Рисунок 4.8 – Вигляд вікна програми із годинником

(у заголовку вікна - поточний на момент виконання програми час:

вівторок, 16 вересня 2004 року, 00: 18: 05)

 

4.6 Контрольні завдання

 

1. Пояснити порядок створення та використання курсорів, піктограм та пензлів фону у MFC-програмах.

2. Пояснити порядок виведення растрових зображень у головне вікно програми.

3. Пояснити основні функції визначення режимів виведення тексту на екран.

4. Пояснити можливості використання властивостей структури TEXTMETRIC.

5. Пояснити відмінності у застосування системних та логічних шрифтів.

6. Пояснити доцільність використання віртуальних вікон.

7. Пояснити порядок створення та застосування пір’я та пензлів.

8. Розробити MFC-програму із визначеними курсором, піктограмою та пензлем.

9. Розробити MFC-програму із визначенням властивостей системних шрифтів та виведенням текстів у головне вікно програми. Використайте шрифти ANSI_FIXED_FONT, ANSI_VAR_FONT.

10. Розробити MFC-програму із завантаженням та виведенням логічних шрифтів.

11. Розробити MFC-програму із реалізацію конструкцій віртуального вікна. Здійсніть виведення зображень у головне вікно програми.

12. Розробити MFC-програму із використанням виведення графічних функцій через віртуальне вікно. Реалізувати зміну пір’я та пензлів за допомогою меню головного вікна програми.

13. Реалізувати програму із стрілковим годинником.







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.