2009-09-16 4 views
0

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

Поддержка нескольких мониторов будет потрясающей.

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

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

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

+2

Помимо основы экранной заставки вам понадобятся некоторые возможности обработки изображений. Это не то, что я хотел бы пожелать кому-то в качестве начального проекта на C++. –

ответ

9

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

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

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

  1. Изображение смешивания
  2. экран Windows Saver поддержки ж/нескольких мониторов
  3. экрана Canvas (DirectX, OpenGL, растровые изображения?)
  4. Таймеры

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

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 на самом деле являются только регулярными .exe скомпилированными файлами с определенной функцией обратного вызова. Вы можете найти множество руководств по настройке функций заставки в сети. Поддержка нескольких мониторов будет фактически вызвана тем, что вы настроите свой экранный холст, о чем мы поговорим ниже.

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

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

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

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

0

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

Есть много tutorials для остальных

+4

Вам не нужно взламывать C++ express, чтобы получить неуправляемый код. – ZippyV

5

«Я не знаю, C++, но я знаю, AS3, JavaScript и PHP. Так что я надеялся связать некоторые из этих знаний на C++. "

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

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

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

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

+0

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

1

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

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