带有淡化图像的C ++屏幕保护程序

时间:2009-09-16 20:08:09

标签: c++ windows windows-xp fade screensaver

如何在C ++中制作一个屏幕保护程序,在淡出时指定的时间延迟,在屏幕上的随机位置淡入和淡出图像?

多监视器支持非常棒。

如果您有工作代码或知道我可以在哪里获得它,那就太棒了。否则指向正确的方向。我正在寻找一种方法,它具有平滑而不滞后的og flickery fade。屏幕保护程序适用于Windows XP。

我不懂C ++,但我确实知道AS3,Javascript和PHP。所以我希望将一些知识与C ++联系起来。

我应该用什么来编译它?

4 个答案:

答案 0 :(得分:9)

首先,如果您是从C ++开始,请不要使用像Visual c ++这样的特定于Windows的编译器。抓住一个很好的跨平台IDE,它带有像eclipse或code::blocks这样的编译器。与任何项目一样,您可能希望将其拆分为可以分阶段完成的较小任务。听起来你有几个障碍。

  1. 缺乏C ++知识(我们都在这里一次)
  2. 缺乏对图像的了解(非常常见的痛苦)
  3. 缺乏经验(我们将继续努力)
  4. 不要让别人劝阻你。你可以做到这一点,并且可能比你想象的更快。读一两本关于C ++的书,你可以在不知情的情况下完成一个项目,但是你会经常感到沮丧。让我们将您的项目分解为一系列小目标。当您完成每个目标时,您对C ++的信心将会提升。

    1. 图像混合
    2. 具有多显示器支持的Windows屏幕保护程序
    3. 屏幕画布(directx,opengl,bitmaps?)
    4. 计时器
    5. 首先,让我们看看图像混合的问题。我假设你想要将有问题的图像“淡化”到你活跃的窗口背景中。如果您将拥有纯色背景,则可以通过在画布刷新之间更改相关图像的Alpha透明度来实现。基本上,您需要根据刷新计时器对两个图像中每个像素的颜色值进行平均。更直接地说,找到任何结果像素的红色,绿色和蓝色像素元素(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时,我指的是程序输出可视数据的区域。所有图像渲染应用程序或教程基本上都会引用相同的概念。如果您觉得这个特别有趣,请考虑计算机视觉的研究生课程或学习课程。相信我,你不会后悔的。无论如何,考虑到你的应用程序的基本性质,我建议不要使用openGL或DirectX,因为每个都有自己的应用程序专用知识层,你需要在它们有用之前获取。另一方面,如果你想要内置的3D细节,如双缓冲和gpu卸载,我会选择openGL(更多平台无关)。许多有趣的图像库也像gimmes一样。

      对于多显示器支持,这是一个棘手但不复杂的问题。您基本上只是设置画布边界(屏幕边界)以匹配多个监视器的几何。不应该是具有相同分辨率的多个显示器的问题,可能因显示器分辨率不匹配而变得棘手(可能在屏幕上没有显示画布区域等等。这些问题有众所周知的算法和解决方法,但这可能超出了范围这个问题。

      最后,对于所需的计时器,这应该是最简单的部分。 Windows和Linux以他们自己奇怪的方式处理时间(为什么MS不实施STRPTIME),所以如果你对可移植性感兴趣,我会使用第三方库。否则只需使用windows settimer()基本功能,并在回调函数中呈现图像。

      高级主题:嘿,如果你还在阅读,你可以对这个程序进行一些有趣的算法改进。例如,当您的计时器每秒关闭一个设定的量子时,您可以缓存前几个混合图像并节省一些处理时间(我们的眼睛不太注意区分变化的颜色渐变)。如果你使用的是openGL,你可以将多组混合图像缓存为显示列表(必须使用所有显卡内存才能正确吗?)。有趣的东西,祝你好运!

答案 1 :(得分:5)

  

“我不懂C ++,但我知道AS3,Javascript和PHP。所以我希望将一些知识与C ++联系起来。”

噢,小伙子,我想你会感到惊讶。学习C ++:

  • 购买至少一本或两本非常好的书(见here)。不要买不太好的书。他们会教你以后必须忘记的习惯,以便取得进一步的进展。
  • 期待必​​须进行大量的动手编写代码,并在其间进行大量阅读。在最初的几周内,编译器会向你发出大量难以理解的错误信息,你的代码将继续崩溃,而经验丰富的C ++程序员在看你的代码时会厌恶他们的手。而总是你的错。
  • 计划大量时间学习。我的意思是很多。无论你投入多少时间,至少需要几个月才能从“虚拟”升级到“新手”。
  • 想象一下,为了成为一名真正的专业人士,不断阅读书籍和文章,花费大量时间在新闻组和论坛上,向别人学习,用头撞击你周围的每一面墙,都要坚持几年。台。
  • 准备好每周至少学习一次你以前不知道的事情,即使经过十年的C ++编程生活。
  • 想一想,我可能不会夸大这一点。

编辑澄清:我已经对Hunter Davis和Elemental的答案进行了投票,因为它们非常好,非常重要,总的来说,尽管我支持鼓励,我在那里咆哮。事实上,我不怀疑许多人在给出一个骨架的例子时能够用C / C ++一起破解某些东西,即使实际上他们对C ++知之甚少。来吧试试吧,你很有可能在合理的时间内拿出屏幕保护程序。但。能够“用C / C ++一起破解某些东西”远非“学习过C ++”。 (我的意思是非常远。)

C ++是一个令人难以置信的复杂,卑鄙和顽固的野兽。我也认为它几乎是令人惊叹的美丽,但它可能反映了一个非常高的山的景色:很难达到你能够欣赏美丽的地步。

答案 2 :(得分:1)

C ++是一种复杂的语言,所有sbi表明可能都是正确的(当然,经过10年的商业C ++编程仍有一些需要学习)但我认为,如果你对另一种语言有信心它应该只需要几个天到: a)安装这里提到的一个编译器(我建议VC快速进入windows编程) b)找一些屏幕保护程序的示例代码,使用Windows GDI做一些简单的事情(屏幕保护程序上的MS文档中有一些代码) c)修改此代码以执行您想要的操作。

就您的有限要求而言,我认为您会发现窗口GDI ++库有足够的能力来平滑地进行Alpha淡化。

答案 3 :(得分:0)

我会看看microsoft c ++ express。它是免费且非常有能力的。您可能需要破解它,或者获取旧版本,以生成非托管可执行文件。

其余

有很多tutorials可用