如何在 C++ 中制作一个屏幕保护程序,使图像在屏幕上的随机位置淡入淡出,并在淡出时具有指定的时间延迟?
多显示器支持会很棒。
如果您有有效的代码或知道我在哪里可以得到它,那就太好了。否则为我指明正确的方向。我正在寻找一种具有平滑且不滞后的闪烁褪色的方法。屏幕保护程序适用于 Windows XP。
我不知道 C++,但我知道 AS3、Javascript 和 PHP。所以我希望将其中的一些知识与 C++ 联系起来。
我应该用什么来编译它?
如何在 C++ 中制作一个屏幕保护程序,使图像在屏幕上的随机位置淡入淡出,并在淡出时具有指定的时间延迟?
多显示器支持会很棒。
如果您有有效的代码或知道我在哪里可以得到它,那就太好了。否则为我指明正确的方向。我正在寻找一种具有平滑且不滞后的闪烁褪色的方法。屏幕保护程序适用于 Windows XP。
我不知道 C++,但我知道 AS3、Javascript 和 PHP。所以我希望将其中的一些知识与 C++ 联系起来。
我应该用什么来编译它?
首先,如果您从 C++ 开始,请不要从特定于 Windows 的编译器(如 Visual C++)开始。获取一个不错的跨平台 IDE,它带有像 eclipse 或code::blocks这样的编译器。像任何项目一样,您将希望将其拆分为可以分阶段完成的较小任务。听起来你有几个障碍。
不要让别人气馁。你可以做到这一点,而且可能比你想象的要快。一定要读一两本关于 C++ 的书,你可以在不知道太多的情况下完成一个项目,但你会经常感到沮丧。让我们将您的项目分解为一组小目标。当您完成每个目标时,您对 C++ 的信心就会增强。
首先,我们来看看图像融合的问题。我假设您希望将相关图像“淡化”到您活动的任何 Windows 背景中。如果您要使用纯色背景,只需在画布刷新之间更改相关图像的 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 细节,例如双缓冲和 gpu 卸载,我会选择 openGL(与平台无关)。许多有趣的图像库也作为礼物出现。
至于多显示器支持,这是一个棘手但并不复杂的问题。您基本上只是要设置画布边界(屏幕边界)以匹配多个监视器的几何形状。具有相同分辨率的多台显示器不应该是问题,可能会因显示器分辨率不匹配而变得棘手(可能有画布区域未显示在屏幕上等。这些问题有众所周知的算法和解决方法,但这可能超出了范围这个问题的。
最后,关于所需的计时器,这应该是最简单的部分。Windows 和 Linux 以自己奇怪的方式处理时间(为什么 MS 不实现 STRPTIME),所以如果您对可移植性感兴趣,我会使用 3rd 方库。否则,只需使用 windows settimer() 基本功能并在回调函数中呈现您的图像。
高级主题:嘿,如果您仍在阅读,您可以对这个程序进行许多有趣的算法改进。例如,随着您的计时器每秒关闭一个设定的数量,您可以缓存前几张混合图像并节省一些处理时间(我们的眼睛不太擅长区分变化的颜色渐变)。如果您使用的是 openGL,您可以将混合图像集缓存为显示列表(必须使用所有显卡内存来做一些事情吗?)。有趣的东西,祝你好运!
“我不懂 C++,但我知道 AS3、Javascript 和 PHP。所以我希望将其中的一些知识与 C++ 联系起来。”
哦,男孩,我想你会感到惊讶。学习 C++:
编辑澄清:我对 Hunter Davis 和 Elemental 的答案都投了赞成票,因为它们非常好,非常中肯,总的来说,尽管我在那里咆哮,但我还是支持鼓励。事实上,我不怀疑许多人在给出一个骨架示例时能够在 C/C++ 中一起破解某些东西,即使他们实际上并不了解 C++。继续尝试,很有可能您会在合理的时间内提供屏幕保护程序。但。能够“用 C/C++ 一起破解某些东西”远非“学会了 C++”。(我的意思是很远。)
C++ 是一个令人难以置信的复杂、卑鄙和顽固的野兽。我也认为它几乎美得令人窒息,但它可能反映了从一座非常高的山上看到的景色:很难到达能够欣赏美景的地步。
C++ 是一门复杂的语言,sbi 指出的一切可能都是正确的(当然,经过 10 年的商业 C++ 编程,还有一些东西需要学习)但我认为,如果你对另一种语言有信心,只需几天时间即可: a) 安装这里提到的编译器之一(我建议 VC 作为对 windows 编程的快速入门) b) 找到一些使用 windows GDI 执行简单操作的屏幕保护程序示例代码(MS 文档中有一些代码屏幕保护程序) c)修改此代码以执行您想要的操作。
就您有限的要求而言,我认为您会发现窗口 GDI++ 库有足够的能力来平滑地完成您需要的 alpha 渐变。
我会看看 microsoft c++ express。它是免费的,而且非常有能力。您可能需要破解它或获取旧版本来生成非托管可执行文件。
其余的有很多教程可用