|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.08.2009, 21:29 | #1 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
Анимированный осцилограф на WinAPI (С++)
В этой небольшой статье я бы хотел продемонстрировать, как создается окно и как рисовать средствами GDI+.
Возможно данный материал будет полезен всем тем, кто хочет разобраться с созданием графический приложений Windows, средствами WinAPI, тем более в преддверии нового учебного года, новых лабораторных, новых сессий Анимироваться, в данной статье, будет синусоида, получиться своего рода осциллограф. Для создания этого приложения я использовал среду Microsoft Visual C++ 6.0 Вы можете использовать более поздние версии Visual Studio, а так же Dev C++. Запустите IDE и создайте новое Win32 приложение, но укажите опцию, запрещающую генерацию любого кода, нам нужен чистый проект. Т.к. мы собираемся использовать WinAPI функции, а так же некоторые математические функции, в начале программы следует подключить два заголовочных файла: Код:
Код:
Данная функция будет реализована чуть ниже, но что бы ее можно было вызывать из любой точки программы, объявим ее в начале: Код:
Объявим, так же, еще две вспомогательные переменные: Код:
Вот мы и подобрались к самой главной функции Windows приложения - WinMain. Эта функция выполняет роль, аналогичную роли функции main. WinMain принимает ряд аргументов: HINSTANCE hInstance - дескриптор приложения, присваеваемый операционной системой. HINSTANCE hPrevInstance - параметр, ныне не используемы, оставленный для совместимости с очень старыми приложениями LPSTR lpCmdLine - строка, содержащая аргументы запуска приложения, аналог argv[] int nCmdShow - режим показа главного окна (свернутое, развернутое, по умолчанию) Общее объявление функции выглядит как: Код:
Далее, в самой функции, нам следует объявить три переменные, дескритор окна, системное сообщение и структура окна. Код:
Последний раз редактировалось oleg kutkov; 04.08.2009 в 21:48. |
04.08.2009, 21:31 | #2 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
После объявления переменных, следует заполнить поля структуры, ниже показано как, с комментариями:
Код:
Код:
Код:
Код:
Код:
В самом конце следует написать return msg.wParam; Функция WinMain завершена. |
04.08.2009, 21:33 | #3 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
Теперь на очереди реализация вышеобъявленной функции WindowProcedure. В ней происходит обработка всех сообщений и выполнение соответствующих действий. Сразу следует сообщить, т.к. в нашем приложении будет рисоваться анимация в окне - в данной функции объявлены необходимые переменные и обработчики сообщений. Ниже представлен код всей функции с комментариями:
Код:
Код:
Последний раз редактировалось oleg kutkov; 04.08.2009 в 22:15. |
04.08.2009, 21:35 | #4 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
И в конце концов самая большая и сложная функция программы - функция рисования синусоиды. Её заголовок уже приведен вышею
На самом деле данная функция рисует не только синусоиду, он так же отвечает за отрисовку вертикальных и горизонтальных линий координатной сетки, а так же числовые отметки осей абсцис и ординат. Пусть это будет напряжение и время. Начать функцию следует с объявление важных констант - координаты рисования сетки, максимальные, минимальные значения, а так же два массива, содержащие текст - числа, которые будут нарисованы возле осей. Так же тут вызываются четыер API функции, задающие необходимые параметры рисования, подробнее о них Вы можете прочесть в MSDN. Код:
Далее создадим наше "перо", которым будет осущестляться рисование линй, так же зададим ему цвет. Код:
Рисование текста выполняется с помощью TextOut(hdc, x, y, string, strlen(string)). Код:
Код:
Последний раз редактировалось oleg kutkov; 04.08.2009 в 23:13. |
04.08.2009, 21:37 | #5 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
Сетка нарисована, теперь нужно нарисовать сами оси, для этого выберем другое "перо":
Код:
Код:
Вновь берем "перо": Код:
Код:
Все, программа закончена, можете смело компилировать, не обращая внимания на предупреждения компилятора (преобразования из int в double и наооборот, не существенно, в данном случае), и запускать. Ниже представлен скриншот того, что у Вас должно в итоге получиться, а так же приложен файл с полным листингом программы и комментариями. |
04.08.2009, 21:40 | #6 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
Скриншот (разумеется анимацию тут не видно):
Исходный код: |
05.08.2009, 15:17 | #7 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
Если можно - закрепите пожалуйста
Жалко будет, если статья канет в бездне постов... |
06.08.2009, 13:35 | #8 |
Старожил
Регистрация: 06.08.2009
Сообщений: 2,992
|
У меня есть свой Starter Kit на разные случаи жизни, и одна из программ - окно, рисующая синусоиду. вот мой вариант:
Код:
|
06.08.2009, 13:54 | #9 |
Старожил
Регистрация: 06.08.2009
Сообщений: 2,992
|
А теперь комментарии:
#define WIN32_LEAN_AND_MEAN делает компиляцию чуть быстрее (отсекаются редко используемые функции), а также требуется для модулей типа WinSock 2.0 чтобы не было конфликта со старыми версиями, включенными в <windows.h>. Я предпочитаю не объявлять отдельно число пи, а объявлять #define _USE_MATH_DEFINES #include <cmath> и использовать стандартный M_PI Код:
Я не разобрался сходу, зачем нужен TranslateMessage(&msg); (в Олеговом коде), но работать должно и без него. Вопрос Олегу: SetTimer() находится в WindowProcedure(). То есть при любом событии (при движении мышки, и т. д) будет устанавливаться таймер? Странно, если это работает... Переход от одного case к другому без break - может и некрасиво, но гораздо проще, чем отдельный вызов WM_PAINT. В этих случаях я обычно ставлю комментарий // no break. Насколько я знаю желательно всегда вызывать DefWindowProc (hWnd, message, wParam, lParam); и возвращать его значение. Поэтому эта строчка у меня за пределами switch. А вообще - хоршая статья. Кстати, могу выложить свои Starter Kit-ы по OpenGL, динамическому определению типов (RTTI), Multithreaded DLL и по C++/.Net. |
06.08.2009, 15:32 | #10 | |
Пользователь
Регистрация: 10.01.2009
Сообщений: 71
|
Цитата:
Как в Dev C++ запустить эту программу , "закрыв глаза" на эти ошибки (преобразование типов и тд)? Компилятор закрывать на это глаза не хочет, как настроить его, чтобы все запустилось? |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Анимированный Gif в компоненте Image | Ermiss | Мультимедиа в Delphi | 17 | 12.09.2010 06:11 |
БД на WinApi | yngwie | Win Api | 3 | 09.03.2009 20:54 |
Анимированный фон | Delph1n | Мультимедиа в Delphi | 11 | 31.01.2009 14:47 |
USB осцилограф | Toha Chorniy | Помощь студентам | 1 | 13.10.2008 19:47 |
WinApi | Andr | Безопасность, Шифрование | 3 | 17.06.2007 13:38 |