Заставка в C ++ с исчезающим изображением - PullRequest
0 голосов
/ 17 сентября 2009

Как создать экранную заставку в C ++, которая постепенно отображает изображение в случайных местах на экране с заданной задержкой при исчезновении?

Поддержка нескольких мониторов была бы замечательной.

Если у вас есть рабочий код или вы знаете, где я могу его получить, это было бы здорово. В противном случае направьте меня в правильном направлении. Я ищу метод, который имеет плавное и не медленное мерцание. Заставка для Windows XP.

Я не знаю C ++, но я знаю AS3, Javascript и PHP. Поэтому я надеялся связать некоторые из этих знаний с C ++.

Что мне использовать для его компиляции?

Ответы [ 4 ]

9 голосов
/ 17 сентября 2009

Прежде всего, если вы начинаете в C ++, не начинайте со специфичного для Windows компилятора, такого как Visual C ++. Возьмите хорошую кроссплатформенную IDE, которая поставляется с таким компилятором, как eclipse или code :: blocks . Как и любой проект, вы захотите разделить его на более мелкие задачи, которые вы можете выполнить поэтапно. Похоже, у вас есть пара препятствий.

  1. Недостаток знаний C ++ (мы все были здесь когда-то)
  2. Недостаток знаний об изображениях (очень распространенная болезнь)
  3. Недостаток опыта (мы над этим поработаем)

НЕ позволяйте другим отговаривать вас. Вы МОЖЕТЕ сделать это, и, вероятно, быстрее, чем вы думаете, возможно. ЧИТАЙТЕ одну или две книги о C ++, вы можете обойтись одним проектом, не зная многого, но вы будете часто разочаровываться. Давайте разберем ваш проект на множество маленьких целей. По мере выполнения каждой цели ваша уверенность в C ++ будет расти.

  1. Смешивание изображений
  2. Заставка Windows с поддержкой нескольких мониторов
  3. Канва экрана (directx, opengl, растровые изображения?)
  4. Таймеры

Сначала давайте посмотрим на проблему смешивания изображений. Я предполагаю, что вы захотите «закрасить» изображение в любой фон окна, который у вас активен. Если у вас будет однотонный фон, вы можете просто сделать это, изменив альфа-прозрачность рассматриваемого изображения между обновлениями холста. По сути, вы хотите усреднить значения цвета каждого пикселя в двух изображениях на основе вашего таймера обновления. В более прямом смысле, чтобы найти элементы красного, зеленого и синего пикселей для любого результирующего пикселя (P3)

N = время отсчета таймера за интервал (секунды / миллисекунды / и т. Д.)
T = тики, которые произошли в этом интервале
P1r = красный пиксельный элемент из изображения 1
P2r = красный пиксельный элемент из изображения 2
P3r = результирующий красный пиксельный элемент для смешанного изображения
P1g = зеленый пиксельный элемент из изображения 1
P2g = зеленый пиксельный элемент из изображения 2
P3g = результирующий зеленый пиксельный элемент для смешанного изображения
P1b = синий пиксельный элемент из изображения 1
P2b = синий пиксельный элемент из изображения 2
P3b = результирующий синий пиксельный элемент для смешанного изображения

P3r = ((T/N * P1r) + ((N-T)/N * P2r))/2
P3g = ((T/N * P1g) + ((N-T)/N * P2g))/2
P3b = ((T/N * P1b) + ((N-T)/N * P2b))/2

Теперь давайте рассмотрим проблему экранных заставок Windows и поддержки нескольких мониторов. Это действительно две отдельные проблемы. Заставки Windows на самом деле представляют собой только обычные .exe скомпилированные файлы с определенной функцией обратного вызова. Вы можете найти множество учебных пособий по настройке функций заставки в сети. Поддержка нескольких мониторов на самом деле будет проблемой при настройке Screen Canvas, о которой мы поговорим далее.

Когда я ссылаюсь на Screen Canvas, я имею в виду область, в которой ваша программа будет выводить визуальные данные. Все приложения или учебные пособия по рендерингу изображений будут в основном относиться к этой же концепции. Если вы находите это особенно интересным, рассмотрите программу для выпускников или учебный курс в Computer Vision. Поверьте мне, вы не пожалеете об этом. В любом случае, учитывая основную природу вашего приложения, я бы рекомендовал не использовать openGL или DirectX, просто потому, что у каждого из них есть свой собственный уровень специфичных для приложения знаний, которые вам необходимо приобрести, прежде чем они будут полезны. С другой стороны, если вам нужны встроенные функции 3d, такие как двойная буферизация и разгрузка графического процессора, я бы выбрал openGL (более независимый от платформы). Множество забавных библиотек изображений также представлены в виде gimmes.

Что касается поддержки нескольких мониторов, это сложная, но не сложная проблема. Вы просто устанавливаете границы холста (границы экрана) в соответствии с геометрией нескольких мониторов. Не должно быть проблем с несколькими мониторами с одинаковым разрешением, может быть сложно с несоответствующими разрешениями монитора (могут быть области холста, не отображаемые на экране и т. Д. Существуют хорошо известные алгоритмы и обходные пути для этих проблем, но, возможно, это выходит за рамки этого вопроса.

Наконец, что касается требуемых таймеров, это должна быть самая простая часть. Windows и Linux обрабатывают время своими странными способами (ПОЧЕМУ MS не реализует STRPTIME), поэтому если вы заинтересованы в переносимости, я бы использовал стороннюю библиотеку. В противном случае просто используйте базовую функциональность windows settimer (), и ваше изображение будет отображено в функции обратного вызова.

Advanced Topic: Эй, если вы все еще читаете, есть ряд интересных алгоритмических улучшений, которые вы можете внести в эту программу. Например, если ваш таймер сбрасывает заданные кванты каждую секунду, вы можете кэшировать первые несколько смешанных изображений и сэкономить некоторое время на обработку (наши глаза не очень хорошо замечают разницу между изменением цветовых градиентов). Если вы используете openGL, вы можете кэшировать наборы смешанных изображений в виде списков отображения (для чего-то нужно использовать всю эту память видеокарты?). Прикольные вещи, удачи!

5 голосов
/ 17 сентября 2009

«Я не знаю C ++, но я знаю AS3, Javascript и PHP. Поэтому я надеялся связать некоторые из этих знаний с C ++».

О, мальчик, я полагаю, ты будешь удивлен. Для изучения C ++:

  • Купите хотя бы одну или две очень хорошие книги (см. здесь ). Не покупайте книги, которые не очень хороши. Они научат вас привычкам, которые вам придется позже разучить, чтобы добиться дальнейшего прогресса.
  • Ожидайте, что вам придется много писать, а потом читать. В первые несколько недель компилятор будет выплевывать вам легионы непонятных сообщений об ошибках, ваш код будет продолжать падать, а опытные программисты на C ++, глядя на ваш код, с отвращением вскинут руки. И это всегда твоя вина.
  • Планируйте много времени, чтобы учиться. И я имею в виду реальный лот . Независимо от того, сколько времени вы посвятите, потребуется не менее пары месяцев, пока вы не перейдете с «фиктивного» на «новичка».
  • Представьте себе, что вам понадобится пару лет, чтобы стать настоящим профессионалом, постоянно читать книги и статьи, уделять много времени группам новостей и дискуссионным форумам, учиться у других, биться головой о каждую стену вокруг стол письменный.
  • Будьте готовы учиться чему-то, чего вы не знали раньше, хотя бы раз в неделю, даже после десятилетий программирования на C ++.
  • На мгновение представьте, что я не могу преувеличить это.

Редактировать для уточнения : Я проголосовал за ответы как Хантера Дэвиса, так и Элементаля, потому что они очень хорошие, по сути, и в целом поддержка поддерживается мной, несмотря на мои разглагольствовать там. На самом деле, я не сомневаюсь, что многие могут взломать что-то вместе в C / C ++, если привести скелетный пример, даже если на самом деле они мало знают о C ++. Попробуй, есть хороший шанс, что ты найдешь заставку за разумное время. Но. Возможность «взломать что-то вместе в C / C ++» далеко не значит «выучить C ++». (И я имею в виду очень далеко.)

C ++ - невероятно сложный, подлый и упрямый зверь. Я также считаю его почти потрясающе красивым, но в нем, вероятно, отражается вид с очень высокой горы: довольно трудно добраться до точки, где вы сможете оценить красоту.

1 голос
/ 17 сентября 2009

C ++ - это сложный язык, и все, что указывает sbi, вероятно, верно (конечно, после 10 лет коммерческого программирования на C ++ еще есть чему поучиться), НО я думаю, что если вы уверены в другом языке, это займет всего пару дней до: a) Установите один из упомянутых здесь компиляторов (я бы посоветовал VC как быстрый способ программирования Windows) б) Найдите пример кода экранной заставки, которая делает что-то простое, используя Windows GDI (в документации MS по экранным заставкам есть код) c) Измените этот код, чтобы сделать то, что вы хотите.

С точки зрения вашего ограниченного требования, я думаю, вы обнаружите, что оконные библиотеки GDI ++ обладают достаточной мощностью для плавного выполнения альфа-фейдинга, который вам необходим.

0 голосов
/ 17 сентября 2009

Я бы посмотрел на Microsoft C ++ Express. Это бесплатно и довольно способно. Возможно, вам придется взломать его или получить более старую версию для создания неуправляемых исполняемых файлов.

Есть множество учебных пособий , доступных для остальных

...