簡體   English   中英

C ++中具有褪色圖像的屏幕保護程序

[英]Screensaver in C++ with fading image

如何在C ++中制作一個屏幕保護程序,以在淡出屏幕上指定的時間延遲在屏幕上的隨機位置淡入和淡出圖像?

多監視器支持將非常棒。

如果您有一個有效的代碼,或者知道我在哪里可以得到它,那就太好了。 否則,請指出正確的方向。 我正在尋找一種具有平滑而不滯后的漸變效果的方法。 屏幕保護程序適用於Windows XP。

我不了解C ++,但是我知道AS3,Javascript和PHP。 所以我希望將某些知識與C ++相關聯。

我應該用什么來編譯它?

首先,如果您使用C ++入門,請不要以Windows特定的編譯器(如Visual C ++)開頭。 抓住一個不錯的跨平台IDE,該IDE附帶了eclipse或code :: blocks之類的編譯器。 像任何項目一樣,您將需要將其拆分為可以分階段完成的較小任務。 聽起來您有幾個障礙。

  1. 缺乏C ++知識(我們一次都在這里)
  2. 缺乏有關圖像的知識(非常常見的痛苦)
  3. 缺乏經驗(我們將為此工作)

不要讓其他人灰心。 您可以這樣做,而且可能比您想像的要快。 一定要讀一兩本有關C ++的書,您可能對一個項目一無所知,但是您會經常感到沮喪。 讓我們將您的項目分解為一系列小的目標。 完成每個目標后,您對C ++的信心就會增強。

  1. 圖像融合
  2. 帶有多顯示器支持的Windows屏幕保護程序
  3. 屏幕畫布(directx,opengl,位圖?)
  4. 計時器

首先,讓我們看一下圖像融合的問題。 我假設您將要“淡入”有問題的圖像到任何活動的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編譯文件。 您可以在網上找到許多有關設置屏幕保護程序功能的教程。 當您設置屏幕畫布時,實際上將需要多顯示器支持,我們將在下面討論。

當我指的是“屏幕畫布”時,指的是程序將在其上輸出視覺數據的區域。 所有圖像渲染應用程序或教程基本上都將引用相同的概念。 如果您發現這特別有趣,請考慮使用Computer Vision的研究生課程或學習課程。 相信我,您不會后悔。 無論如何,考慮到您應用程序的基本性質,我建議您不要使用openGL或DirectX,因為它們各自具有自己的應用程序特定知識層,您需要先獲取它們,然后才能有用。 另一方面,如果您想要內置的3d功能(例如雙緩沖和gpu卸載),則可以使用openGL(與平台無關)。 許多有趣的圖片庫也都可以作為給我。

對於多監視器支持,這是一個棘手但不復雜的問題。 基本上,您只是要設置畫布邊界(屏幕邊界)以匹配多台顯示器的幾何形狀。 多個具有相同分辨率的顯示器不應該成為問題,而在顯示器分辨率不匹配的情況下可能會變得棘手(可能未在屏幕上顯示畫布區域等。對於這些問題,有眾所周知的算法和解決方法,但這也許超出了范圍這個問題。

最后,關於所需的計時器,這應該是最簡單的部分。 Windows和Linux以自己獨特的方式處理時間(為什么MS不會實現STRPTIME),因此,如果您對可移植性感興趣,我會使用3rd party庫。 否則,只需使用Windows settimer()基本功能,然后在回調函數中呈現圖像即可。

高級主題:嘿,如果您仍在閱讀,可以對該程序進行一些有趣的算法改進。 例如,當您的計時器每秒關閉一個設置的量子時,您可以緩存前幾張混合圖像並節省一些處理時間(我們的眼睛不太擅長區分變化的顏色梯度)。 如果您使用的是openGL,則可以將混合圖像集作為顯示列表進行緩存(一定要使用所有的圖形卡內存嗎?)。 好玩的東西,祝你好運!

“我不了解C ++,但我確實了解AS3,Javascript和PHP。因此,我希望將其中的一些知識與C ++相關聯。”

哦,男孩,我想你會感到驚訝。 要學習C ++:

  • 至少購買一兩本非常好的書(請參閱此處 )。 不要購買不是很好的書。 他們會教您一些習慣,您以后必須學會這些習慣才能取得進一步的進步。
  • 期望必須進行大量的動手代碼編寫,並且之間要進行大量閱讀。 在最初的幾周內,編譯器將向您吐出大量難以理解的錯誤消息,您的代碼將繼續崩潰,並且經驗豐富的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。 它是免費的並且功能強大。 您可能需要對其進行破解或獲取較舊的版本,以生成不受管的可執行文件。

剩下的很多教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM