3Графика
Рассмотрим начала использования библиотек Microsoft для рисования.
Создадим проект. Выберем Win32 Application. Выбираем File New и переключаемся на вкладку Project. Введя имя, проекта нажимаем OK.
Появится окошко мастера проектов. В нем мы выберем пустой проект - An Empty Project. И нажмем кнопку Finish для подтверждения своего выбора. IDE VC++ начнет генерацию серии файлов необходимых для работы с проектом и его сборки.
Добавим в наш проект файл, в котором будет исходный код. Мы же с вами выбрали пустой проект и нам нужен cpp файл в этом проекте. Вам нужно перейти на вкладку FileView и щелкнуть правой кнопкой мыши на step1 files. Выбрать пункт меню Add File to Project.
Появится диалоговое окно добавления файла в проект Insert Files Into Project. У нас файла нет. Поэтому надо просто написать его имя с расширением и нажать OK.
В нашем случае именем проекта является номер задачи (Task123), а хранить проект нужно под тем же именем в своей папке.
Теперь нужно настроить проект так, чтобы он использовал MFC. Это очень важно. MFC находится в DLL файлах. И если наш проект будет использовать MFC, мы должны это указать для того, чтобы компилятор мог подключить необходимые LIB файлы со ссылками на функции в DLL. Если этого не сделать, то проект не соберется. В окне Build будут такие ошибки.
Linking...
nafxcw.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcw.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
Release/step1.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
Нам нужно пойти в меню Project, а потом Setting.
Вот здесь и вот так. Не забудем проверить поддержку MFC для всех типов (Setting For).
В файле запишем код.
//Рисование средствами библиотеки MFC
#include "afxwin.h" // MFC Основные и стандартные компоненты
#include "afxext.h" // MFC Расширения
class CMainWnd : public CFrameWnd
{
public:
CMainWnd(); // Конструктор по умолчанию
int OnCreate(LPCREATESTRUCT lpCreateStruct); // эта функция //вызывается при создании окна
afx_msg void OnPaint(); // Переопределяем функцию рисования в окне
~CMainWnd(); // Деструктор
private:
CStatusBar m_wndStatusBar; // класс панели состояния
DECLARE_MESSAGE_MAP(); // таблица откликов
};
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd) // таблица откликов на //сообщения
ON_WM_CREATE() // событие создания окна
ON_WM_PAINT() // Это реакция. Если нет этой строчки ,
// Бог вам судья.
END_MESSAGE_MAP()
void CMainWnd::OnPaint()
{
CPaintDC dc(this); // Получить контекст устройства
CPen MyPen(PS_DASHDOT,2,RGB(0,255,0)); //настраиваем перо
CPen MyPen1(PS_DASHDOT,2,RGB(255,255,255)); //настраиваем перо
dc.SelectObject(MyPen); //Выбираем перо
dc.TextOut(100,100,"Привет от MFC Programm"); //Написать в нем привет
dc.MoveTo(300,300); // Начать рисовать линию
dc.LineTo(600,125); // И продолжить рисовать линию
dc.LineTo(105,125); // И еще продолжить рисовать линию
//Прямоугольник
dc.Draw3dRect(200,200,300,400, RGB(255, 0, 0), RGB(0, 255, 0));
//Окружность в движении
for(int i=0;i<500;++i)
{ //Бегущая по диагонали окружность
dc.SelectObject(MyPen); //Меняем перо
dc.Ellipse(200+i,200+i,250+i,250+i); //Рисуем
for(long j=0; j<1000000; ++j); //Задержка
dc.SelectObject(MyPen1); //Меняем перо
dc.Ellipse(200+i,200+i,250+i,250+i); //Стираем
dc.SelectObject(MyPen); //Меняем перо
dc.Ellipse(200+i+1,200+i+1,250+i+1,250+i+1); //Рисуем в другом месте
}//End For
}
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
m_wndStatusBar.Create(this);
return 0;
}
CMainWnd::CMainWnd() // Конструктор по умолчанию
{
Create(NULL,"Paint",WS_OVERLAPPEDWINDOW,rectDefault,
NULL,NULL); // Создать окно программы
// оператор new, по умолчанию, в случае ошибки вернет NULL
// проверка указателя на NULL дает возможность избавиться от дальнейших //ошибок
}
CMainWnd::~CMainWnd()
{}
class CMyApp : public CWinApp
{
public:
CMyApp(); //Конструктор по умолчанию
virtual BOOL InitInstance(); //Cтандартная инициализация
};
CMyApp::CMyApp() //Конструктор главного класса приложения
{}
BOOL CMyApp::InitInstance() //Стандартная инициализация
{
m_pMainWnd=new CMainWnd(); //Создать класс окна
ASSERT(m_pMainWnd); //Проверить его правильность
m_pMainWnd->ShowWindow(SW_SHOW); //Показать окно
m_pMainWnd->UpdateWindow(); //Обновить окно
return TRUE; //Вернуть что все нормально
};
CMyApp theApp; //Запуск приложения
Результатом запуска программы является окно:
Окружность пробегает диагональ слева направо. Видны части сторон прямоугольника, стертые при движении окружности.
Для построения графика функции f(x) используется следующая технология:
y = f(x)
dc.MoveTo(x,y); // Начать рисовать график
Цикл i = 1 to N
x += dx //Увеличить х
y = f(x)
dc.LineTo(x, y); // Продолжить рисовать график
Конец цикла
|