http://tikitak.narod.ru ---- Главная страница сайта
Шаг 10 - Рисуем в окне
Создание проекта
Изменяем Step1. Это очень хороший Шаг. На нем тренироваться и тренироваться.....
Создаем код
Нам необходимо переопределить виртуальную функцию прорисовки экрана. Она реализованна в виде заглушки afx_msg OnPaint.
class CMainWnd : public CFrameWnd
{
public:
CMainWnd();
afx_msg void OnLButtonDblClk( UINT, CPoint );
afx_msg void OnRButtonDblClk( UINT, CPoint );
afx_msg void OnKeyDown( UINT, UINT, UINT );
int OnCreate(LPCREATESTRUCT lpCreateStruct);
void MenuExit();
afx_msg void OnPaint();
// Переопределяем функцию рисования в окне
private:
CStatusBar m_wndStatusBar;
CMenu m_wndMenu;
CStatic* MyStatic;
CMyButton* MyButton;
CEdit* MyEdit;
DECLARE_MESSAGE_MAP();
};
Наша программа должна реагировать на события перерисовки экрана
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
ON_WM_LBUTTONDBLCLK()
ON_WM_RBUTTONDBLCLK()
ON_WM_KEYDOWN()
ON_WM_CREATE()
ON_WM_PAINT()
// Это реакция. Если нету этой строчки ,
// бог вам судья.
ON_COMMAND(ID_EXIT,MenuExit)
END_MESSAGE_MAP()
А вот и сама функция.
void CMainWnd::OnPaint()
{
CPaintDC dc(this); // Получить контекст устройства
dc.TextOut(200,200,"Hello MFC Programm"); // Написать в нем привет
dc.LineTo(600,105); // Начать рисовать линию
dc.MoveTo(300,300); // И продолжить рисовать линию
}
Описание
При программировании под Windows за работу с графикой отвечает GDI Graphics Divice Interface. Все функции работы с графикой сосредоточенны в gdi32.dll.
В программе не только нужно создать графику, нужен код. Этот код должен отвечать за время, место прорисовки. Главным моментом здесь является сообщение WM_PAINT. Это сообщение посылается окну всегда, когда требуется перерисовка экрана. Например: при изменении размера окна, и если окно выходит на передний план, и при запуске программы естественно.
Внимание Windows не хранит массивы пикселей для сохранения окон, как это часто делалось при программировании в DOS. При необходимости "освежить окно" - оно перерисовывается и делает это сообщение WM_PAINT.
Для целей графики и близких к ним в Windows есть понятие контекст устройства. Эти контексты не зависят от самого устройства для программиста. Например, на мониторах разных типов команды одинаковы, при этом ВНИМАНИЕ команды рисования на мониторе и принтере тоже одинаковые. С Windows Вас как программиста не интересует какой язык использует принтер. А еще недавно я помню, как приходилось штудировать документацию по принтеру и писать драйвера к своим программам под каждый тип принтера.
Представьте, что вы установили у себя на компьютере новый монитор, и новый принтер, в программе не нужно править не одного байта, всё будет работать.
Кто теперь скажет, что Windows это плохо, а Microsoft не умеет писать программы ?
Первым делом в классе рамки окна мы описали функцию, которая вызывается в ответ на WM_PAINT.
Потом в обработчике событий указали, что на это событие реагировать.
И написали сам код.
CPaintDC dc(this); Получили контекст нашего окна для рисования.
Вывели текст
Установили указатель в точку
Провели линию
Компилирует, запукаем на выполнение. Ну прям, как у Пикасо !
Шпаргалка
Опиши функцию рисования
class CMainWnd : public CFrameWnd
{
.......
afx_msg void OnPaint();
.......
}
Создай реакцию на сообщение
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
........
ON_WM_PAINT()
......
END_MESSAGE_MAP()
Напиши код
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
............
}
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|