代码之家  ›  专栏  ›  技术社区  ›  Sindre Sorhus

具有渐变图像的C++屏幕保护程序

  •  0
  • Sindre Sorhus  · 技术社区  · 16 年前

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

    多监视器支持将是了不起的。

    我不知道C++,但我知道AS3、JavaScript和PHP。所以我希望把一些知识与C++联系起来。

    4 回复  |  直到 16 年前
        1
  •  9
  •   Hunter Davis    16 年前

    code::blocks

    1. 缺乏C++知识(我们曾经在这里)
    2. 缺乏图像知识(非常常见的疾病)

    不要让别人使你气馁。你可以做到这一点,而且速度可能比你想象的要快。读一本或两本关于C++的书,你可以在不知道很多的情况下通过一个项目,但是你经常会感到沮丧。让我们将您的项目分解为一组小目标。当你完成每一个目标时,你对C++的信心就会提高。

    1. 图像混合
    2. 支持多显示器的Windows屏幕保护程序
    3. 计时器

    首先,让我们看看图像混合的问题。我假设您希望将有问题的图像“淡入”到您激活的任何windows背景中。如果要使用纯色背景,只需在画布刷新之间更改相关图像的alpha透明度即可。基本上,您需要根据刷新计时器平均两幅图像中每个像素的颜色值。以更直接的方式查找任意结果像素(P3)的红色、绿色和蓝色像素元素


    T=此间隔内发生的滴答声

    P2r=来自图像2的红色像素元素
    P3r=混合图像的合成红色像素元素

    P2g=来自图像2的绿色像素元素

    P1b=来自图像1的蓝色像素元素

    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
    

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

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

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

    高级主题:如果你还在阅读,你可以对这个程序做一些有趣的算法改进。例如,当计时器每秒关闭一个设定的量程时,您可以缓存最初的几个混合图像并节省一些处理时间(我们的眼睛不太擅长注意变化的颜色渐变之间的差异)。如果您使用的是openGL,那么您可以将混合图像集缓存为显示列表(必须使用所有图形卡内存来完成某些事情,对吗?)。有趣的东西,祝你好运!

        2
  •  5
  •   Community Mohan Dere    9 年前

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

    哦,孩子,我想你会感到惊讶的。要学习C++,请执行以下操作:

    • here ).不要买不太好的书。他们会教给你一些习惯,你以后为了取得更大的进步就必须改掉这些习惯。
    • 除了大量的实际代码编写外,还要进行大量的阅读。在最初的几周,编译器会向你吐出大量难以理解的错误信息,你的代码将不断崩溃,经验丰富的C++程序员看着你的代码会厌恶地举起手来。而且是 总是 你的错。
    • 很多
    • 准备好学习一些你以前不知道的东西,甚至在C++编程十年后,每周至少学习一次。
    • 就一会儿,想象一下我可能不会夸大这一点。

    编辑以澄清 当前位置我对亨特·戴维斯和《元素》的答案都投了赞成票,因为它们都非常好,非常中肯,而且总的来说,尽管我在上面大喊大叫,我还是支持这种鼓励。事实上,我不怀疑很多人在C/C++中能够在一起给出一个框架例子,即使他们实际上不知道C++的很多东西。继续尝试吧,你很有可能在合理的时间内想出一个屏幕保护程序。但是能够“在C/C++中一起破解某些东西”远远不是“学会了C++”。(我是说 非常 远。)

    C++是一种不可思议的复杂、卑鄙、顽固的野兽。我还认为它几乎是惊人的美丽,但在这方面,它可能反映了从一个非常高的山风景:很难达到的点,你可以欣赏美丽。

        3
  •  1
  •   Elemental    16 年前

    C++是一种复杂的语言,SBI所指的一切可能是真的(当然,经过10年的商业C++编程还有一些要学习),但我认为如果你对另一种语言有信心,那么只需要几天时间: a) 安装这里提到的一个编译器(我建议VC作为windows编程的快速入门) b) 查找使用windows GDI执行简单操作的屏幕保护程序的示例代码(MS文档中有一些关于屏幕保护程序的代码) c) 修改此代码以执行所需操作。

    就您有限的需求而言,我想您会发现windowgdi++库有足够的能力来顺利完成您所需的alpha淡入淡出。

        4
  •  0
  •   Jay    16 年前

    有很多 tutorials 其余的都可以