[VC++] Comment faire pour simuler un OnScreenDisplay ?

Comment faire pour simuler un OnScreenDisplay ? [VC++] - Programmation

Marsh Posté le 05-08-2002 à 09:36:46    

Salut
 
Sur les TVs actuelles (ou meme les scopes), ya un OSD, càd un affichage de l'action en cours (Volume, numéro de chaine, etc...).
 
Comment faire pour simuler ca sur le un ecran windows ?
En creant une fenetre transparente ? (ca a pas l'air top)
En captant le DC du Bureau et en utilisant un TextOut ? (oui dakor mais comment faire ?)
 
Merci pour vos idées et conseils :)
 
NB : je débute ;)

Reply

Marsh Posté le 05-08-2002 à 09:36:46   

Reply

Marsh Posté le 05-08-2002 à 10:51:53    

Personne ne sait ? :(

Reply

Marsh Posté le 05-08-2002 à 12:35:47    

Un exemple vaut mieux qu'un long discours.
Voila donc un exemple en win32 :
 
HDC hdcScr, hdcMem;
    int cx, cy, x1, y1, x2, y2;
    HWND hwndScreen;
       
    if (LockWindowUpdate(hwndScreen = GetDesktopWindow()))
    {
     hdcScr  = GetDCEx (hwndScreen, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE);
     hdcMem  = CreateCompatibleDC (hdcScr);
     cx      = GetSystemMetrics(SM_CXSCREEN) / 10;
     cy      = GetSystemMetrics(SM_CYSCREEN) / 10;
     srand ((int)GetCurrentTime());    
     for (int i=0;i<300;i++)
     {
      x1 = cx * (rand () % 10) ;
      y1 = cy * (rand () % 10) ;
      x2 = cx * (rand () % 10) ;
      y2 = cy * (rand () % 10) ;
      BitBlt(hdcMem,  0,  0, cx, cy, hdcScr, x1, y1, SRCCOPY) ;
      BitBlt(hdcScr, x1, y1, cx, cy, hdcScr, x2, y2, SRCCOPY) ;
      BitBlt(hdcScr, x2, y2, cx, cy, hdcMem,  0,  0, SRCCOPY) ;
     }
     DeleteDC(hdcMem);
     ReleaseDC(hwndScreen, hdcScr);
     //LockWindowUpdate(NULL);
    }
 
c'est un truc marrant : il découpe ton écran en carrés et les échange de place. ca te fait un damier a l'écran.
voila.

Reply

Marsh Posté le 05-08-2002 à 13:19:23    

ok merci c bien sympa comme effet ....  
 
mais c pas tout à fait ca que je voulais :)
 
non en fait, si on prend l'exemple des claviers multimedia (Logitech par exemple) et des softs qui les accompagnent, ben si on augmente ou baisse le volume, une barre verte préfixée par "Volume", et representant ce fameux volume, apparait en "surimpression" sur l'écran.. comme sur une télé quoi ;)
 
c'est cet effet que je voudrais ..
 
des idées ?

Reply

Marsh Posté le 05-08-2002 à 15:11:58    

Et comme sur tous les écrans vendus depuis qques années d'ailleurs. Désolé moi je peux pas t'aider. Mais à mon avis c'est autant une histoire de design que de prog.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 05-08-2002 à 15:20:07    

oui c vrai aussi :)
 
en supposant que je capte le DC du bureau (GetDeskTopWindow()), un TextOut sur ce fameux DC ferait-il l'affaire ? (mais ca me parait bien "simple" :/ )
 
myDC = GetDC(GetDeskTopWindow()));
SetBkMode(myDC, TRANSPARENT);  
 
BeginPath(myDC);  
 
TCHAR truc[] = "- OSD -";  
TextOut(myDC, 0, 0, texte, ARRAYSIZE(truc));
 
EndPath(myDC);  
 
 
un truc comme ca :??:

Reply

Marsh Posté le 06-08-2002 à 09:22:36    

UP :)

Reply

Marsh Posté le 06-08-2002 à 16:09:50    

Etant plutôt expérimentateur, je dis : pourquoi ne pas essayer ? Si le simple fonctionne.
 
A savoir si le texte restera affiché et effacé qu'au prochain REDRAW du fond d'écran, ou restera "collé".
 
Dans mes maladresses des débuts (elles durent encore :pt1cable:) j'ai réussi une fois à faire déborder le texte de ma feuille volante et écrire sur le fond (je sais plus comment).
 
Y a peut-être moyen aussi de fixer la couleur du texte, avant ?
 
Si le texte reste "collé", ca va être plus compliqué (j'ai vu un exemple qq part (pr Win 3.11) pour afficher en "volant" la position du curseur pas loin de lui-même, faudrait que je le retrouve sur un des mes HD, on fait une combinaison logique avec PatBlt() entre le fond et ce qu'on veut écrire. Ca fait pro)

Reply

Marsh Posté le 07-08-2002 à 01:07:01    

Bon, je crois que je t'ai pas tout expliqué.
Dans le petit effet marrant dont je t'ai filé le code, il y a tout ce dont tu as besoin.
 
Si tu l'as testé il a dû répondre a ta question sur le rafraichissement .......
 
En gros, je t'ai filé la solution pour écrire a l'écran pardessus tout le reste, c'est pas ce que tu veux non ?
 
Si tu lance le prog, tu t'apercevra qu'il ne tient pas au rafraichissement, cad que si tu déplace une fenetre apres ca, l'effet disparaitra.  
 
Je crois que c'est ce que tu veux. Enfin, peut etre que je me trompe :)

Reply

Marsh Posté le 07-08-2002 à 09:38:55    

voila voila
 
c fait .. et ca marche :)
 
en prenant un parti du code d'Oliv5 ( :jap: ), divers tests et experimentations, qq heures de travail sur les timers et autre InvalidateRect() bien placés ( :D), ca marche pas trop mal...  
 
et ca donne un plugin Winamp qui affiche à l'écran le morceau en cours dans la playlist pdt 5 secondes [:fifiz]
 
reste plus que des pb esthétiques genre choix de la fonts, couleurs, positions, durée, effets (parceque Arial en 145 c'est pas top :D )
 
en tout cas merci à tous ...

Reply

Marsh Posté le 07-08-2002 à 09:38:55   

Reply

Marsh Posté le 07-08-2002 à 09:39:52    

oliv5 a écrit a écrit :

Bon, je crois que je t'ai pas tout expliqué.
Dans le petit effet marrant dont je t'ai filé le code, il y a tout ce dont tu as besoin.
 
Si tu l'as testé il a dû répondre a ta question sur le rafraichissement .......
 
En gros, je t'ai filé la solution pour écrire a l'écran pardessus tout le reste, c'est pas ce que tu veux non ?
 
Si tu lance le prog, tu t'apercevra qu'il ne tient pas au rafraichissement, cad que si tu déplace une fenetre apres ca, l'effet disparaitra.
 
Je crois que c'est ce que tu veux. Enfin, peut etre que je me trompe :)




 
c vrai... :)
 
mais en feintant l'ennemi, ca marche pas trop mal :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed