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

Sin*_*hus 0 c++ windows windows-xp fade screensaver

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

多监视器支持非常棒.

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

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

我应该用什么来编译它?

小智 9

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

  1. 缺乏C++知识(我们都在这里一次)
  2. 缺乏关于图像的知识(非常常见的痛苦)
  3. 缺乏经验(我们将在此工作)

不要让别人劝阻你.你可以做到这一点,并且可能比你想象的更快.读一两本关于C++的书,你可以在不知情的情况下完成一个项目,但是你会经常感到沮丧.让我们将您的项目分解为一系列小目标.当您完成每个目标时,您对C++的信心将会提升.

  1. 图像混合
  2. Windows屏幕保护程序,支持多显示器
  3. 屏幕画布(directx,opengl,bitmaps?)
  4. 计时器

首先,我们来看看图像混合的问题.我假设你想要将有问题的图像"淡化"到你活跃的窗口背景中.如果您将拥有纯色背景,则可以通过在画布刷新之间更改相关图像的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
Run Code Online (Sandbox Code Playgroud)

现在让我们来看看Windows屏幕保护程序和多显示器支持的问题.这些实际上是两个不同的问题.Windows屏幕保护程序实际上只是具有特定回调函数的常规.exe编译文件.您可以在网上找到许多关于设置屏幕保护功能的教程.当您设置Screen Canvas时,实际上会关注多显示器支持,我们将在下面讨论.

当我参考Screen Canvas时,我指的是程序将输出可视数据的区域.所有图像渲染应用程序或教程基本上都会引用相同的概念.如果您觉得这个特别有趣,请考虑计算机视觉的研究生课程或学习课程.相信我,你不会后悔的.无论如何,考虑到你的应用程序的基本性质,我建议不要使用openGL或DirectX,因为每个都有自己的应用程序专用知识层,你需要在它们有用之前获取.另一方面,如果你想要内置的3D细节,如双缓冲和gpu卸载,我会选择openGL(更多平台无关).许多有趣的图像库也像gimmes一样.

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

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

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


sbi*_*sbi 5

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

哦,孩子,我想你会感到惊讶.学习C++:

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

编辑澄清:我已经投了亨特戴维斯和元素的答案,因为他们非常好,几乎到了这一点,总的来说,尽管我在那里咆哮,我仍然支持鼓励.事实上,我不怀疑许多人在给出一个骨架的例子时能够用C/C++一起破解某些东西,即使实际上他们对C++知之甚少.来吧试试吧,你很有可能在合理的时间内拿出屏幕保护程序.但.能够"用C/C++一起破解某些东西"远非"学习过C++".(我的意思是远.)

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