Чтение онлайн

на главную - закладки

Жанры

Применение Windows API

Легалов А. И.

Шрифт:

 }

 void Kill {

::KillTimer(_hwnd, _id);

 }

 int GetId const {

return _id;

 }

private:

 HWND _hwnd;

 int _id;

};

We'll put the timer in our Controller object and initialize it there.

class Controller {

public:

 Controller(HWND hwnd, CREATESTRUCT* pCreate);

 ~Controller;

 void Timer(int id);

 void Size(int x, int y);

 void Paint;

 void Command(int cmd);

private:

 HWND _hwnd;

 WinTimer _timer;

 View _view;

};

Controller::Controller(HWND hwnd, CREATESTRUCT * pCreate) : _hwnd (hwnd), _timer (hwnd, 1), _view(pCreate->hInstance) {

 _timer.Set (100);

}

Once set, the timer sends our program timer messages and we have to process them.

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {

 Controller* pCtrl = WinGetLong<Controller*>(hwnd);

 switch (message) {

 ...

 case WM_TIMER:

pCtrl->Timer(wParam);

return 0;

 ...

 }

 return ::DefWindowProc(hwnd, message, wParam, lParam);

}

void Controller::Timer(int id) {

 _timer.Kill;

 _view.Step;

 UpdateCanvas canvas(_hwnd);

 _view.Update(canvas);

 ::InvalidateRect(_hwnd, 0, FALSE);

 _timer.Set(50);

}

void Controller::Paint {

 PaintCanvas canvas(_hwnd);

 _view.Paint(canvas);

}

The Update method of View is the workhorse of our program. It creates the image in the buffer. We then call InvalidateRectangle to force the repaint of our window (the last parameter, FALSE, tells Windows not to clear the previous image — we don't want it to flash white before every frame).

Here's the class View, with the three bitmaps.

class View {

public:

 View(HINSTANCE hInst);

 void SetSize(int cxNew, int cyNew) {

_cx = cxNew;

_cy = cyNew;

 }

 void Step { ++_tick; }

 void Update(Canvas& canvas);

 void Paint(Canvas& canvas);

private:

 int _cx, _cy;

 int _tick;

 Bitmap _bitmapBuf; // for double buffering

 Bitmap _background;

 int _widthBkg, _heightBkg;

 Bitmap _sprite;

 Bitmap _mask;

 int _widthSprite, _heightSprite;

};

View::View(HINSTANCE hInst) : _tick (0) {

 // Load bitmap from file

 _background.Load("picture.bmp");

 // Load bitmap from resource

 _background.GetSize(_widthBkg, _heightBkg);

 // Load bitmaps from resources

 _sprite.Load(hInst, IDB_FANNY);

 _mask.Load(hInst, IDB_MASK);

 _sprite.GetSize(_widthSprite, _heightSprite);

 DesktopCanvas canvas;

 _bitmapBuf.CreateCompatible(canvas, 1, 1);

 _cx = 1;

 _cy = 1;

}

And here's the implementation of Update. We create a bitmap canvas in memory, making it compatible with the current display canvas. We blit the background image into it, then blit the mask and the sprite (notice the change of position for each frame). Finally, we transfer the complete bitmap into our buffer (overloaded assignment operator at work!).

void View::Update(Canvas& canvas) {

 const double speed = 0.01;

 Bitmap bmp(canvas, _cx, _cy);

 BitmapCanvas bmpCanvas(canvas, bmp);

 RECT rect = { 0, 0, _cx, _cy };

 bmpCanvas.WhiteWash(rect);

 // Do the off-line drawing

 Blitter bltBkg(_background);

 bltBkg.BlitTo(bmpCanvas);

 int xRange = (_widthBkg - _widthSprite) / 2;

 int yRange = (_heightBkg - _heightSprite) / 2;

 int x = xRange + static_cast<int>(xRange * sin(speed * _tick));

Поделиться:
Популярные книги

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Жених из гроба

Сотис Майя
1. Гробокопательница
Фантастика:
юмористическое фэнтези
сказочная фантастика
фэнтези
5.00
рейтинг книги
Жених из гроба

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Заклятие предков

Прозоров Александр Дмитриевич
3. Ведун
Фантастика:
фэнтези
альтернативная история
8.49
рейтинг книги
Заклятие предков

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Экспансия: Сотрудничество. Том 5

Белов Артем
5. Планетарный десант
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Экспансия: Сотрудничество. Том 5

Отверженный III: Вызов

Опсокополос Алексис
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Отверженный III: Вызов

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Возвышение Меркурия. Книга 8

Кронос Александр
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 8

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4