www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
  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
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz