如何在C++中创建屏幕保护程序,使图像在屏幕上的任意位置淡入淡出,并在淡出时具有指定的时间延迟?
多显示器支持将是非常棒的。
如果你有一个可以工作的代码,或者知道我可以在哪里得到它,那就太好了。否则,请给我指出正确的方向。我正在寻找一种方法,具有平滑和不滞后的og闪烁褪色。该屏幕保护程序适用于Windows XP。
我不知道C++,但我知道AS3,Javascript和PHP。因此,我希望将其中的一些知识与C++联系起来。
我应该使用什么来编译它?
发布于 2009-09-16 22:03:49
首先,如果你是从C++开始的,不要一开始就使用windows特定的编译器,比如visual c++。找一个很好的跨平台集成开发环境,它带有eclipse或code::blocks这样的编译器。与任何项目一样,您将希望将其拆分成可以分阶段完成的较小任务。听起来你有几个障碍。
不要让别人打消你的念头。你可以做到这一点,而且可能比你想象的更快。一定要读一两本关于C++的书,你可以在不了解太多的情况下完成一个项目,但你会经常感到沮丧。让我们将你的项目分解成一组小目标。当您完成每个目标时,您对C++的信心将会提升。
带有多显示器support
首先,让我们看看图像混合的问题。我假设你想要将有问题的图像“淡出”到你激活的任何窗口背景中。如果你想要一个纯色背景,你可以通过在画布刷新之间改变图像的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编译文件。你可以在网上找到许多关于设置屏幕保护功能的教程。在设置屏幕画布时,多显示器支持实际上是一个需要考虑的问题,我们将在下面讨论这一点。
当我提到屏幕画布时,我指的是程序将在其上输出可视数据的区域。所有的图像渲染应用程序或教程基本上都会引用相同的概念。如果你觉得这特别有趣,请考虑计算机视觉的研究生课程或学习课程。相信我,你不会后悔的。无论如何,考虑到你的应用程序的基本性质,我建议不要使用openGL或DirectX,因为它们都有自己的应用程序特定知识层,在它们有用之前,你需要获取它们。另一方面,如果你想要内置的3d细节,比如双缓冲和图形处理器卸载,我会选择openGL (更多平台无关性)。许多有趣的图像库也是小把戏。
至于多显示器支持,这是一个棘手但并不复杂的问题。基本上,您只需设置画布边界(屏幕边界)以匹配多个监视器的几何形状。对于相同分辨率的多个显示器,不应该是问题,如果显示器分辨率不匹配,可能会变得棘手(可能会有画布区域不显示在屏幕上等)。对于这些问题,有众所周知的算法和解决方法,但这可能超出了本问题的范围。
最后,关于所需的计时器,这应该是最简单的部分。Windows和Linux以自己奇怪的方式处理时间(为什么MS不实现STRPTIME),所以如果你对可移植性感兴趣,我可以使用第三方库。否则,只需使用windows settimer()基本功能,并在回调函数中呈现您的图像。
高级主题:嘿,如果你还在读,你可以对这个程序做一些有趣的算法改进。例如,如果您的计时器每秒关闭设定的量程,您可以缓存前几个混合图像,并节省一些处理时间(我们的眼睛不太擅长注意变化的颜色梯度之间的区别)。如果你使用的是openGL,你可以缓存多组混合图像作为显示列表(必须使用所有的显卡内存,对吧?)有趣的东西,祝你好运!
发布于 2009-09-16 20:35:08
“我不知道C++,但我知道AS3,Javascript和PHP.所以我希望把这些知识和C++联系起来.”
天哪,我想你会大吃一惊的。要学习C++:
,
编辑以求澄清:我对Hunter Davis和Elemental的答案都投了赞成票,因为他们非常好,几乎切中要害,而且总的来说,尽管我在上面大喊大叫,但我还是支持鼓励。事实上,我毫不怀疑,当给出一个框架示例时,许多人都能够在C/C++中拼凑出一些东西来,即使他们实际上对C++了解不多。继续尝试吧,你很有可能在合理的时间内想出一个屏幕保护程序。但。能够“在C/C++中破解一些东西”远远谈不上“已经学会了C++”。(我的意思是非常远。)
C++是一个令人难以置信的复杂、刻薄和顽固的野兽。我也认为它几乎是令人叹为观止的美丽,但在这一点上,它可能反映了从非常高的山上看到的景色:很难达到你能够欣赏到美丽的地步。
发布于 2009-09-17 08:56:08
C++是一门复杂的语言,sbi所指出的一切可能都是真的(当然,在经过10年的商业C++编程之后,仍然有一些需要学习),但我认为,如果你对另一种语言有信心,应该只需要几天的时间: a)安装这里提到的编译器之一(我建议VC作为windows编程的快速入门) b)找到一些使用windows GDI做一些简单事情的屏幕保护程序的示例代码(在MS文档中有一些关于屏幕保护程序的代码) c)修改这些代码来做你想做的事情。
就你有限的需求而言,我想你会发现window GDI++库有足够的能力来平滑地完成你所需要的alpha淡出效果。
https://stackoverflow.com/questions/1435185
复制相似问题