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

多显示器支持会很棒。

如果您有有效的代码或知道我可以在哪里获得它,那就太好了。否则请为我指明正确的方向。我正在寻找一种平滑且不滞后或闪烁的淡入淡出方法。该屏幕保护程序适用于 Windows XP。

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

我应该用什么来编译它?

有帮助吗?

解决方案

首先,如果您开始使用 C++,请不要从特定于 Windows 的编译器(如 Visual C++)开始。获取一个不错的跨平台 IDE,带有 eclipse 等编译器 代码::块. 。与任何项目一样,您需要将其分成可以分阶段完成的较小任务。听起来你有几个障碍。

  1. 缺乏 C++ 知识(我们都曾经来过这里)
  2. 缺乏对图像的了解(非常常见的毛病)
  3. 缺乏经验(我们会努力解决这个问题)

不要让别人劝阻你。你可以做到这一点,而且可能比你想象的要快。一定要读一两本关于 C++ 的书,你可以在不了解太多的情况下完成一个项目,但你会经常感到沮丧。让我们将您的项目分解为一组小目标。当您完成每个目标时,您对 C++ 的信心就会增强。

  1. 图像混合
  2. 支持多显示器的 Windows 屏幕保护程序
  3. 屏幕画布(directx、opengl、位图?)
  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

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

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

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

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

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

其他提示

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

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

  • 至少购买一两本非常好的书(参见 这里)。不要买不太好的书。他们会教给你一些习惯,你必须在以后忘记这些习惯才能取得进一步的进步。
  • 预计必须进行大量的实践代码编写,并在其间进行大量的阅读。在最初的几周内,编译器会向你吐出大量难以理解的错误消息,你的代码会不断崩溃,经验丰富的 C++ 程序员看到你的代码会厌恶地举手。这是 总是 你的错。
  • 计划大量的时间来学习。我的意思是 真正的很多. 。无论你投入多少时间,从“傻瓜”升级到“新手”至少需要几个月的时间。
  • 想象一下,为了成为一名真正的专业人士,必须苦苦钻研几年,不断地阅读书籍和文章,投入大量时间参加新闻组和论坛,向他人学习,用头撞办公桌周围的每一面墙。
  • 即使在以 C++ 编程为生十年之后,也要准备好每周至少学习一次以前不知道的东西。
  • 暂时想象一下我可能不会夸大这一点。

编辑以澄清: :我对亨特·戴维斯和元素的答案都投了赞成票,因为他们非常好,几乎切中要点,而且总的来说,尽管我在那里咆哮,但我还是支持鼓励。事实上,我毫不怀疑许多人在给出一个框架示例时能够用 C/C++ 来组合某些东西,即使他们实际上对 C++ 不太了解。继续尝试,您很有可能在合理的时间内想出一个屏幕保护程序。但。能够“用 C/C++ 一起破解一些东西”与“学会 C++”相去甚远。(我的意思是 非常 远的。)

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

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

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

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

有很多教程其他可用

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top