CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Prob API

n00ble55
n00ble55
Niveau 4
23 février 2006 à 12:54:01

BOnjour,
Je realise une classe de fenetre et je suis entrain de faire une methode pour afficher du texte a l´ ecran.Cette methode enverra un message a l´ instruction de recuperation de message comme ceci :
::SendMessage(hWindow,WM_PAINT,(WPARAM)this,0);

et qui est receptioné comme cela:

case WM_PAINT:
WindowsClass *window;
window = (reinterpret_cast <WindowsClass*>(wParam));
GetClientRect(window->hWindow, &window->WriteRec);
window->hdc = BeginPaint (window->hWindow, &window->Ps);
TextOut(window->hdc, 20, 10,window->Texte,sizeof(window->Texte)-1);
EndPaint(window->hWindow, &window->Ps);
break;

Je suis ici obligé d´ utilisé des pointeurs car la fonction ne marche pas si elle n´ est pas static.

La compilation marche mais lors de l´ execution un message vicieux :sournois: aparait en nous disans "WindowsClass a provoqué une erreur dans WINDOWSCLASS.EXE. Le programme doit fermer".
Comment faire marcher le prog?

Merci d´ avance,

Un n00b;

godrik
godrik
Niveau 30
23 février 2006 à 13:12:46

c´est difficile de répondre comme cela.
Je ne sais pas quel compilateur/environement tu utilises, mais il dispose probablement d´un débugger. Lorsque l´application sautera, tu devrais obtenir la pile d´exécution ainsi que l´instruction qui a provoqué l´erreur.

godrik
godrik
Niveau 30
23 février 2006 à 13:36:20

suis-je bete ?
L´erreur n´est pas celle que je croyait;
voici un extrait de MSDN:
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_PAINT
WPARAM wParam, // not used
LPARAM lParam // not used
);

Parameters

wParam
This parameter is not used.
lParam
This parameter is not used.

Tu n´es pas le seul a envoyer des messages WM_PAINT. Le système en envoie également. Et le système lui ne rempli pas le champ wParam comme tu le fais toi.
Tu pourrais être tenté de regarder la valeur donné par le système par défault. Mais c´est mal aussi parceque ca pourrait changer d´une version a l´autre de windows.
De plus, "For some common controls, the default WM_PAINT message processing checks the wParam parameter. If wParam is non-NULL, the control assumes that the value is an HDC and paints using that device context."

En passant, c´est mal d´envoyer un message WM_PAINT, une application n´est pas censée en envoyer. Elle doit utiliser invalidRect et laisser le système se débrouiller.

La solution a ton problème sera probablement l´utilisation d´une hashtable sur HWND.

PS au modérateur: c´est bizzare en postant le message j´ai eu un "formulaire expiré", il y a un délai de rédaction des messages ?

n00ble55
n00ble55
Niveau 4
23 février 2006 à 17:12:38

Tu peu m´ expliquer un peu plus ? Je vois pas ce que tu veux dire par Hashtable et par INvalidRect.

godrik
godrik
Niveau 30
23 février 2006 à 17:24:47

invalidrect, c´est une fonction qui permet de déclarer qu´une partie de ta fenètre n´est plus dans un état "valide" et qu´il faut donc la "redessiner".
ATTENTION il n´y a pas d´équivalence entre les invalidrect et les WM_PAINT.
en effet, a la fois dnas la file de message windows il ne peut y avoir qu´un seul WM_PAINT, l´os les agrégeant si besoin est.
Tu peux savoir lorsque tu traite ton WM_PAINT quelle partie de la fenetre il faut redessiner en consultant la structure PAINTSTRUCT (de mémoire cette derniere information).
Pour plus d´info: msdn.microsoft.com ==> InvalidRect

Une hashtable est une structure de données (comme tableau ou liste chainé) qui permet de collecter des objets associé a une clé dans le but de retrouver l´objet rapidement a partir de sa clé.
pour plus d´info: http://www.mandragor.org/tutoriels/les_structures_de_donnees/5
ou plus généralement google => hashtable ou table de hachage.

n00ble55
n00ble55
Niveau 4
23 février 2006 à 17:47:42

Merci je vois a peu pres ce qu´ est une hashtable.Mais je ne vois pas l´ interet dans mon cas.

dnob700
dnob700
Niveau 10
23 février 2006 à 18:07:24

Globalement, si ce que tu fait n´es pas répondre à l´événement Paint, il ne faut pas que tu l´utilise, même si son nom correspond à ce que tu veux faire.

Utilise un message personnalisé : Au lieu d´envoyer un WM_PAINT, tu défini :

  1. define WM_DESSINER (WM_USER+1)

et tu envoie un WM_DESSINER
Sachant que WM_USER est une constante que tu peut utiliser dans ce but : les messages suivant ne sont pas utilisé et tu peut donc utiliser WM_USER+1 ou +2 ou + ce que tu veux si tu as beaucoup de message à créer. Mais toi, sauf cas particulier tu ne devrais presque jamais envoyer un message défini par le système.

godrik
godrik
Niveau 30
23 février 2006 à 18:28:02

tu definis une hashtable de windowObject* de clé HWND/10 (par exemple). tu peux ainsi retrouver facilement ton windowObject*

dnob700
dnob700
Niveau 10
23 février 2006 à 18:39:45

en même temps comme toute les fenêtres ont un hWnd différend, et qu´il n´y a qu´un seul objet à associer à chaque hWnd, il est à la fois plus commode et plus rapide d´utiliser une map non ? plutot qu´une hashtable.

n00ble55
n00ble55
Niveau 4
23 février 2006 à 18:59:12

Ok je vois, je pense que je vais faire sa.
Au fait, j´ ai reflechie a un truc.Si je veux envoyer un message il ne faut pas que la fonction d´ envoie du message et de reception soit sur le meme thread ?

Donc j´ ai mis la boucle de recpetion de message sur un autre thread mais la fenetre ne repond plus :mort: :fucking fenêtre: (sablier,pas de reponse,obliger de terminer au control alt supr)

dnob700
dnob700
Niveau 10
23 février 2006 à 19:51:31

tu peut envoyer un message et le recevoir avec le même thread sans aucun problème.

Par conte, ta boucle de réception de message doit être dans le même thread que celui qui crée la fenêtre.

n00ble55
n00ble55
Niveau 4
23 février 2006 à 19:54:56

Je pije pas.on peut lancer le message soit avant la boucle soit apres si c ´est dans le meme thread.Pas pendant c ´est pas terrible.

dnob700
dnob700
Niveau 10
23 février 2006 à 20:36:47

qui lance le message ?
quel événement déclanche ce message ?

Un programme windows classique, va initialiser tout ce qui est nécessaire puis entrer dans sa boucle de message.
Après, il n´en sortira plus jusqu´à la fin du message.
Par contre, la boucle de message passe son temps à appeler le fonction qui recoit les message qui elle peut les traiter comme elle veut. Et généralement tout ce que fait une appli windows se fait en réponse à des messages de windows. Au moment où ce produit l´événement qui fait que tu veux poster le message WM_DESSINER c´est surement suite à un message de windows non ? dans ce cas là, tu es dans la fonction qui gèr ce mesasge qui tourne bien dans le même thread que la boucle de message. Là tu peut sans problème appeler Sendessage.

Si tu veux plus d´aide, et que ton code n´est pas trop long, tu peut le poster là :
http://rafb.net/paste/
Mais sinon (et si oui), il faut que tu explique mieux la manière dont fonctionne ton programme pour qu´on puisse t´aider.

n00ble55
n00ble55
Niveau 4
23 février 2006 à 20:51:42

non,le message est envoyé quand l´ utilisateur en manifeste l´ envie et pas windows : si vous avez envie tout a coup d´ ecrire "j´ aime les frites " et ben sa se fera : Window << "J´ aime les frites ";
(Quand je dis vous je veux dire le programmeur utilisans ma classe soit moi)

dnob700
dnob700
Niveau 10
23 février 2006 à 21:47:17

Je ne vois pas où es ton problème. Si tu ne peut pas le résoudre seul, il faut que tu poste ton code quelque part, ou alors que tu explique clairement comment il fonctionne.

n00ble55
n00ble55
Niveau 4
23 février 2006 à 22:13:59

C ´est pour retrouver les sensations de la console.
C ´est une classe qui gere une fenetre.La ou est le probleme c ´est pour le texte.Je compte surchargé l´ operateur << style cout (Quel originalité !) et ecrire du texte de cet maniere.
il faut donc que l´ envoie du message ne soit pas sur le meme thread que celui de la reception. Pour cela j´ ai mis la boucle de reception dans un thread.Vous m´ avez dit que c ´est pour ca que cela bugait il falait que l´ on créasse la fenetre dans le meme thread,ce que je vais faire.

dnob700
dnob700
Niveau 10
23 février 2006 à 22:31:09

Est ce que la création d´un objet de ta classe crée une fenêtre ?

si oui, alors il faut que tu crée un thread AVANT de créer la fenêtre et que tu crée la fenêtre depuis ce nouveau thread (tu peut t´en passer, en utilisant un unique thread pour toutes les instances de ta classe, mais c´est pas évident) Ensuite (ou, pour être exacte, en parallèle), tu peut rendre la main à l´utilisateur depuis le thread principal. Quand l´utilisateur veut imprimer du texte, il appelle l´opérateur << normallement depuis son programme, et dans la procédure operator<<, toi tu envoie directement le message, sans utiliser d´autre thread.

Là, ça devrait marcher.

n00ble55
n00ble55
Niveau 4
23 février 2006 à 22:37:32

Que veut tu dire par creer le thread avant ?S a veut dire mettre le thread en dehors de la class ?

dnob700
dnob700
Niveau 10
23 février 2006 à 22:39:40

non, mais dans le constructeur de la classe, tu crée un nouveau thread, et depuis ce thread (c´est-à-dire das la fonction de départ de ce thread), tu crée la fenêtre et la boucle de message.

n00ble55
n00ble55
Niveau 4
23 février 2006 à 22:55:08

Merci beaucoup sa marche presque bien.Je rencontre juste quelque dificulté a faire conprendre a la bete d´ afficher des DialogBox.
Pour cela je tes preparé ce doux sonet qui je l´ espere tintera a tes oreiles comme le nouvel album de lorie.

Toi avec ta bonté sainte
Dois-je ô dieu de l´ olympe
refaire un autre message
pourque hermes
dieu des messes
fasse apparaitre
cette putain d´fenetre
appellé boite de dialogue
par un viellard analogue(sa veut dire quoi analogue ?)

Ainsi que cette composition s´ apparantant plus a du Ilona.

Bref mes MEssageBox saffichent pas(jai fai une methode pour sa) d´ ou la question doi je faire un message pour sa ?

Merci d´ avance,
n00ble55,poete de bistrot

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment