Comment faire pour simuler un OnScreenDisplay ? [VC++] - Programmation
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.
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 ?
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.
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
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 ) 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)
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
Marsh Posté le 07-08-2002 à 09:38:55
voila voila
c fait .. et ca marche
en prenant un parti du code d'Oliv5 ( ), divers tests et experimentations, qq heures de travail sur les timers et autre InvalidateRect() bien placés ( ), 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
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 )
en tout cas merci à tous ...
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
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