Bonjour, comme le dit le titre, j'aimerais écrire dans une fenêtre à partir d'une fonction, c'est à dire, sans passer par WM_PAINT. Est-ce possible?
Si quelqu'un a une solution quelconque, n'hésitez pas! :)
Merci.
Version imprimable
Bonjour, comme le dit le titre, j'aimerais écrire dans une fenêtre à partir d'une fonction, c'est à dire, sans passer par WM_PAINT. Est-ce possible?
Si quelqu'un a une solution quelconque, n'hésitez pas! :)
Merci.
Bonjour,
La possibilité, oui, surement, mais il faudra expliquer plus en détail ce que vous souhaitez faire afin d'avoir une réponse précise.
Bonjour, en fait, je veut marquer "Nombre de résultats : " suivi de la variable(un entier) "leNombre" dans ma fenêtre. Ce code doit ce trouver dans une fonction, et donc, pas dans WM_PAINT. J'ai essayé d'utiliser :
Mais la phrase ne s'affiche pas, et leNombre est un entier alors que TextOut() demande un const char*(ne vous en faites pas, je sais comment résoudre ce problème).Code:
1
2
3
4
5
6
7
8 HDC hDC; HWND hWnd; hDC = GetWindowDC(hWnd); PAINTSTRUCT Ps; hDC=BeginPaint(hWnd,&Ps); TextOut (hDC, 255, 255,"Nombre de résultats : ", strlen("Nombre de résultats : ")); TextOut (hDC, 255, 255,leNombre, strlen(leNombre)); EndPaint(hWnd, &Ps);
Je doit mettre le code dans une fonction, car leNombre est initialisé dans cette fonction.
Je ne sais pas si ça peut marcher, mais en tout cas, il faut que tu dises à Windows que ta fenêtre doit être redessinée.
C'est possible avec la fonction Invalidate, ou plus violent UpdateWindow
Comment marche ces fonctions s'il te plait? Je ne suis pas très fort.
MSDN : UpdateWindow
Merci pour cette réponse, mais il n'y a quand-même rien qui s'affiche avec UpdateWindow() et avec Invalidate() ! :pleure:
As-tu essayé avec un ClientDC plutôt qu'avec un PaintDC (ce que tu fais actuellement) ? (regarde la doc MSDN pour les questions que tu te poses déjà sur ClientDC)
Ce que tu dois faire pour tricher ainsi, c'est invalider la zone où tu veux écrire avant de faire ton écriture forcée.
Sinon, tu gardes ton code d'écriture dans le traitement du WM_PAINT, et tu l'invoques avec un InvalidateRect()+UpdateWindow() (ou un RedrawWindow() avec les bons paramètres, ça devrait faire la même chose).
Edit: RedrawWindow avec les bons paramètres, ça doit ressembler à ceci si tu veux redessiner toute la fenêtre:
Code:RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW);
Ces deux fonctions forcent l'envoi d'un message WM_PAINT - rien d'autre.
Quelle est la valeur de ton hwnd ? Parce faire un GetWindowDC(hwnd) c'est bien sympa, mais il faut que le hwnd soit valide - sinon le HDC obtenu est NULL.
Il y a aussi le fait que BeginPaint() ne peut être appelé qu'en réponse à un message WM_PAINT (lire : si tu l'appelle en dehors du handler de WM_PAINT, ça ne marchera pas ; cf. http://msdn.microsoft.com/en-us/libr...v=vs.85).aspx). En dehors de WM_PAINT, tu n'a pas besoin de faire un BeginPaint(), tu peux directement dessiner sur le HDC dès lors que celui-ci est valide.
Accessoirement, tester les codes de retour des fonctions permet de mieux comprendre les erreurs de logique de son propre code. Je te conseille de le faire.
Et pour créer une chaîne qui va contenir tout ce que tu souhaite afficher, utilise std::stringstream (http://www.cplusplus.com/reference/s.../stringstream/) (oui, je sais, tu as une méthode pour parvenir à tes fins ; ce qui reviens probablement à refaire une conversion int -> chaine ; ce qui est déjà fait par std::stringstream).
Comment fait-on pour récupérer la valeur d'un hwnd?
Ça dépend, c'est la HWND de quoi que tu cherches? Celui de ta propre fenêtre? Celui d'un des contrôles dans la fenêtre? etc.
Bonjour, c'est l'HWND de ma fenêtre.
Ben tu l'as déjà... Il est retourné par CreateWindow() et reçu en paramètre de ta WNDPROC...
D'accord, merci :).
Quelle est donc l'instruction pour dessiner sur le HDC?Citation:
En dehors de WM_PAINT, tu n'a pas besoin de faire un BeginPaint(), tu peux directement dessiner sur le HDC dès lors que celui-ci est valide.
Euh... TextOut(), ... Toutes les fonctions qui prennent un HDC en paramètre et qui, d'après leur nom, dessine quelque chose. Le dessin, sous Windows, c'est assez large...
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 bool ma_fonction_de_dessin(HWND hwnd) { HDC hdc = GetDC(hwnd); if (!hdc) return false; // toute fonction de dessin utile... // OBLIGATOIRE : faire un release du HDC, parce que sans ça, quelqu'un va crier fort. ReleaseDC(hwnd, hdc); return true; }
Merci pour toutes vos réponses!!! Ça marche!! :D