Fenetre Invisible ...

lefool007 Messages postés 10 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 18 février 2004 - 8 févr. 2004 à 11:53
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 - 11 févr. 2004 à 10:57
Bonjour,

Voila mon probleme :

Je souhaite afficher un PNG n'importe ou sur mon écran (un peu comme une icone).
J'ai trouvé le code pour afficher un PNG dans une fentre en passant un hDC. jusque là tout va bien si je passe un hDC d'un DialogBox. Mais si je passe le hDC du Desktop (GetDesktopWindow), quand je déplace mon objet, celui ci laisse des traces (pas de "ReDraw" du desktop).

AU SECOURS !!!

J'ai essayé beaucoup de truc (Passer par un Static etc ...) mais je n'y arrive pas.

Quelqu'un connait-il la solution ?

Merci d'avance ...

18 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
8 févr. 2004 à 15:15
En faisant un UpdateWindow du desktop il devrait se redessiner.
0
lefool007 Messages postés 10 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 18 février 2004
9 févr. 2004 à 01:16
Bonjour, et merci pour la réponse, mais malheureusement ça ne marche pas.

Existe t-il une classe ou un exemple simple (je suis débutant) pour afficher un bitmap sur le desktop un peu comme une icone (et éventuellement de pouoir la déplacer).

Merci d'avance.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
9 févr. 2004 à 12:30
qq1 a fait qqch du genre (afficher un calebdrier sur le bureau)

http://www.cppfrance.com/code.aspx?ID=18103

sinon, en faisant un InvalidateRect() sur le bureau en spécifiant le rectangle ou se situe ton bitmap, puis en appelant UpdateWindow()
0
lefool007 Messages postés 10 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 18 février 2004
9 févr. 2004 à 14:10
Encore Merci, mais ce n'est toujours pas ce que je souhaite ...

J'ai fais de nouveaux essai ...

Création d'une classe dérivée de CStatic qui affiche par OnPaint une image.

Dans une DLG, je crée une instance de cette classe avec

this->mStat = new CStat ;
this->mStat->Create("test",WS_CHILD,CRect(0,0,60,60),this,NULL) ;

Dans ce cas, tout est OK. Quand je déplace mon CStat, le fond est bien repaint et j'ai bien un "layer" qui se déplace. Mais c'est seulement dans ma fenetre mère (La DLG en locurence ...)

Quand je crée mon instance en passant le hWnd du desktop, j'arrive toujours à déplacer mon "layer", j'arrive à ce que le desktop se redessine, mais pas l'interieur de mon layer (CStat). J'ai essyé beaucoup de chose mais ... Rien ne marche.

Merci d'avance.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
10 févr. 2004 à 13:55
Salut!
La source du calendrier sur le bureau c'est moi qui l'ait faite mais je me suis largement inspiré de celle-ci:
http://www.cppfrance.com/code.aspx?ID=16843

Je pense que tu y trouveras ton bonheur!

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
lefool007 Messages postés 10 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 18 février 2004
10 févr. 2004 à 16:05
Yop, merci ...

J'ai déja vu cette source, mais c'est du SDK et je n'y connais pas grand chose. J'ai essayé de m'en inspirer, pour créer une classe MFC, mais le fond de ma fenetre invisible n'est jamais remis à jour.
J'ai mème chargé GDI+, mais je n'y comprend rien ...
Bref, c'est la galère et je vais abandonner cette idée qui semble infaisable ...
Merci en tout cas pour vos coup de main.
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
10 févr. 2004 à 16:10
Mais non, mais non! Il ne faut pas désespérer si facilement !

Pour passer du SDK au MFC il y a deux solutions:
1) Partout où c'est marqué que la fonction n'a pas les bons paramètres, ajoute :: devant la fonction.

OU

2) Trouve les classes MFC correspondantes grace à MSDN : toutes les fonctions du SDK se retrouvent dans les classes MFC. La seule différence entre les fonctions du SDK et les fonctins MFC c'est que le SDK utilise les handles alors que MFC utilise des pointeurs sur des objets.

Bon courage

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
10 févr. 2004 à 16:28
AAAAAH ça y est j'ai compris ce que tu essayais de faire...
Tu veux créer une fenêtre contenant uniquement une image et la faire bouger, c'est ça ?

Dans ce cas c'est tout-à-fait différent! La méthode que j'utilise pour le calendrier c'est de dessiner dans la fenêtre du bureau. Toi tu veux créer une autre fenêtre!

Avec les MFC : très facile

Tu crées une fenêtre tu y ajoute un Picture tout en haut à gauche, dans les Propriétés de la Picture choisis le type Bitmap et selectionne le bitmap que tu auras préalablement ajouté aux ressources. Dans les propriétés de la fenêtre va dans l'onglet Style, Et dans la zone Border choisis None. C'est tout!

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
10 févr. 2004 à 16:29
ah oui j'oubliais... il faut aussi redimensionner la fenêtre pour qu'elle ait la taille de l'image!

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
lefool007 Messages postés 10 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 18 février 2004
10 févr. 2004 à 16:50
ARGGGG,

Si c'était aussi simple, ça ferai pas 1 semaine que je passerai mes nuits dessu !!!

J'ai essayé, mais le PB, c'est que la fenètre est PAS transparente. Si on lui dit "WS_EX_TRANSPARENT", elle se crée transparente en recopiant en fait le background sous la fenetre. Mais dès qu'on déplace cette fenetre, ce background n'est pas remis à jour ...

D'ou mon problème ...

A bientot, mais ça fait une semaine que je galère la dessus alors que ça existe, que ça doit etre super simple, mais que je suis super "une nouille" !!!

;-)
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
10 févr. 2004 à 17:00
ok...

Ce dont tu as besoin c'est les Régions... En gros ça permet de faire des fenêtres non-rectangulaires. Il y a plusieurs sources sur ce site:
http://www.cppfrance.com/code.aspx?ID=18683
et
http://www.cppfrance.com/code.aspx?ID=11153

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
lefool007 Messages postés 10 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 18 février 2004
10 févr. 2004 à 17:06
Merci pour le tuyau, mais j'ai déja essayé ...

En fait, mon image est de type PNG avec la gestion de la transparence. Si mon image comporte par exemple une ombre qui fusionne le fond, et bien cette ombre reste avec le fond initial. Ce qui ne me convient pas.

Je sais que je suis compliqué, mais il existe plusieurs applis qui gère cela. Entre autre ClocX, qui est une horloge que l'on met sur le bureau.

Bref, je patauge toujours ...

A+
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
10 févr. 2004 à 17:34
Tu ne pourras pas utiliser la fonction transparence du format PNG à moins de la programmer toi-même.
Pour ce qui est de ClocX, je ne connais pas mais je pense que ça utilise le même principe que ma source avc le calendrier

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
lefool007 Messages postés 10 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 18 février 2004
10 févr. 2004 à 18:06
Merci ,

Je suis en train d'essayer un nouveau truc ...

Je vous tiens au courant ...

Par contre, comment forcer une fenetre à se redessiner complètement ?

A bientot.
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
10 févr. 2004 à 18:48
Que veux-tu dire par complétement ? Qu'est-ce qui ne serait pas redessiné ?

Quoi qu'il en soit tu peux utiliser RedrawWindow

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 févr. 2004 à 20:55
va voir là y'a un truc qui pourrait t'interreser (des pingouins qui se baladent sur le bureau) en plus c'est MFC.
http://winpenguins.sourceforge.net/
0
lefool007 Messages postés 10 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 18 février 2004
11 févr. 2004 à 00:25
Merci tout le monde, mais j'ai décidé de faire autrement. En effet, il est difficile d'avoir le concept d'un layer invisible avec qqchose dessus.

Finalement, j'ai dérivé un dialogbox, repeint le fond du dialog avec ce qu'il y a en dessous, rajouté par dessus mon image avec la transparence.

Pour les mouvements, j'ai surchargé OnMove(), pour la réinit du fond, j'ai défini un timer.

C'est pas hyper hyper jolie (ça clignote un peu), mais ça fonctionne pour l'instant.

Je vais quand mème aller jetter un coup d'oeil sur le pingouin voir un peu ;-)

A bientot.
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
11 févr. 2004 à 10:57
Pour le clignotement il faut utiliser la technique du double-buffering. Elle est expliquée dans ma source du calendrier

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
Rejoignez-nous