Графики с помощью MFC
Пакет Microsoft Foundation Classes (MFC) библиотека на языке C++, разработанная Microsoft и призванная облегчить разработку GUI-приложений для Microsoft Windows путем использования богатого набора библиотечных классов.
Создать проект типа MFC Application Dialog based MFC in a static library
В простейшем случае программа, написанная с помощью MFC, содержит два класса, порождаемые от классов иерархии библиотеки: класс, предназначенный для создания приложения, и класс, предназначенный для создания окна. class CTestGraphApp : public CWinApp { … }; class CTestGraphDlg : public CDialog { };
Область для рисования Поместить на диалог элемент Static Text Через окно свойств задать ему уникальный ID IDC_GRAPH Объявить переменную типа CStatic в классе диалогового окна CStatic m_DrawArea; Связать переменную и элемент DDX_Control(pDX, IDC_GRAPH, m_DrawArea); в методе DoDataExchange
Рисование по кнопке Добавить кнопку на диалоговое окно Создать метод, вызывающийся при нажатии на кнопку –Двойной щелчок по кнопке –Add Event Handler механизм
Device context CClientDC – класс, который позволяет выводить графику в рабочей области окна. Рисование происходит на так называемом контексте устройства (Device context). Идея следующая: рисуем на некотором абстрактном DC. Если DC связать с окном на экране, то рисование будет в происходить в окне; если связать его с принтером – то на принтере; если с файлом – то, соответственно, в файл. Если рисование происходит внутри функции OnDraw, то в качестве параметра функции передается указатель на уже созданный приложением DC, поэтому его можно просто использовать, не заботясь о создании и удалении. Если рисование происходит в какой-то другой функции (в ответ на какое-нибудь событие, например, при нажатии кнопки), то этот контекст нужно получить. Это делается так: CClientDC dc(this);
Рисуем график void CGraphDlg::OnBnClickedButton1() { //Создаем контекст, в котором будем рисовать CClientDC dc(&m_DrawArea); //Узнаем размеры прямоугольника CRect rc; m_DrawGraphics.GetClientRect(&rc); int w = rc.Width(); int h = rc.Height(); int x_start = 10; int y_start = h-10; //Рисуем … }
//Рисуем CPen pnPenBlack(PS_SOLID,1,RGB(0,0,0)); CPen * pOldPen = dc.SelectObject(&pnPenBlack); dc.FillSolidRect(rc,RGB(255,255,255)); dc.MoveTo(x_start - 5,y_start); dc.LineTo(x_start + w-15, y_start); dc.MoveTo(x_start,y_start+5); dc.LineTo(x_start, y_start-h+15); CPen pnPenRed(PS_SOLID,1,RGB(255,0,0)); dc.SelectObject(&pnPenRed); dc.MoveTo(x_start, y_start); for(int i = 3; i < w-x_start-2; i+=3) { dc.LineTo(x_start + i, y_start - int(h/3*(1 - sin((float)i)))); } dc.SelectObject(pOldPen);