2010-05-29 15 views
5

Ho visto cose come questa e mi chiedevo se fosse possibile, diciamo che eseguo la mia applicazione e mostrerà il rendering su qualunque cosa ci sia sotto.Disegna OpenGL sul desktop di Windows senza una finestra

Quindi, in pratica, il rendering sullo schermo senza una finestra.

Possibile o una bugia?

Nota: desidera eseguire questa operazione su Windows e in C++.

+0

Non capisco cosa vuoi fare con l'output di rendering: dove vuoi mostrarlo? Relativo: http://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file –

risposta

4

È possibile utilizzare l'applicazione per disegnare su altre finestre dell'applicazione. Una volta trovata la finestra che vuoi, hai HWND, puoi quindi usarla come se fosse la tua finestra ai fini del disegno. Ma dal momento che quella finestra non sa che l'hai fatto, probabilmente rovinerà tutto ciò che hai disegnato quando tenta di ridisegnarsi.

Ci sono alcuni modi molto complicati per aggirare questo problema, alcuni dei quali implicano l'uso di "ganci" di Windows per intercettare i messaggi di disegno in quella finestra in modo da sapere quando è stato ridisegnato in modo da poter eseguire anche il ridisegno.

Un'altra opzione consiste nell'utilizzare regioni di ritaglio su una finestra. Questo può consentire di dare alla tua finestra una forma insolita, e avere tutto dietro di esso sembra ancora corretto.

Ci sono anche modi per riprendere il disegno della finestra di sfondo del desktop, ed è possibile eseguire un'applicazione che disegna animazioni e cose sullo sfondo del desktop (mentre il desktop è ancora utilizzabile). Almeno, questo è stato possibile tramite XP, non so se è cambiato in Vista/Win7.

Sfortunatamente, tutte queste opzioni sono troppo complesse per andare in profondità senza ulteriori informazioni su ciò che si sta tentando di fare.

1

È possibile utilizzare GetDesktopWindow() per ottenere il HWND del desktop. Ma come dice una risposta precedente (SoapBox), fai attenzione, potresti rovinare il desktop perché il sistema operativo si aspetta che lo possegga.

+0

Sì è difficile da lavorare con esso (correttamente), la mia ipotesi era che io potrebbe rasterizzare ogni fotogramma e quindi usarlo come una finestra a forma personalizzata per tutto il tempo ma che diventerebbe piuttosto lento. Ho usato GDI prima per disegnare png sul desktop, ecc. Ma ottenere delle animazioni in questo è un po 'complicato ma proverò a fare la mia idea di rasterizzazione con GDI, renderizzare tutto in un png e usarlo con GDI. Grazie per l'aiuto SoapBox e gbrandt ovviamente. – Yonathan

0

Ho scritto un progetto open source alcuni anni fa per ottenere questo risultato sullo sfondo del desktop. Si chiama Uberdash. Se segui la gerarchia delle finestre, il desktop è solo una finestra in una sorta di contenitore "di sfondo". Poi c'è un contenitore principale e un contenitore anteriore. Il contenitore frontale è come le finestre diventano a schermo intero o "sempre in primo piano". Potresti essere in grado di utilizzare la composizione Aero per eseguire il rendering di una finestra con alfa nel contenitore anteriore, ma dovrai passare gli eventi alle finestre inferiori. Non sarà carino

Inoltre, in alcune schede video è presente una tecnologia denominata sovrapposizioni/sottopunti. Un tempo era possibile eseguire il rendering direttamente su una sovrapposizione. La tua GPU lo applicherebbe direttamente, senza interferenze con la memoria principale. Quindi, anche se hai catturato una schermata, il tuo overlay/underlay non si sarebbe mostrato nella schermata. Purtroppo MS ha vietato questa tecnologia in Vista ...