CreateCompatibleDC me renvoie NULL dans WM_PAINT - API Win32 - Programmation
Marsh Posté le 26-07-2010 à 14:41:20
Ah, ah, ah
Dans WM_PAINT, il faut récupérer le HDC via BeginPaint, par exemple
PAINTSTRUCT ps; |
Marsh Posté le 26-07-2010 à 16:33:25
olivthill a écrit : Ah, ah, ah
|
Voici mon code :
Code :
|
Code :
|
Marsh Posté le 26-07-2010 à 16:41:42
Y a des commentaires qui me semblent erronés...
Marsh Posté le 26-07-2010 à 17:23:52
Le commentaire erroné était un peu d'humour, excusez-moi.
Merci pour le code. C'est plus clair.
Mais, il manque des infos intéressantes. Par exemple :
- D'où vient TDrawer (parce que MsgPaint n'est peut-être pas appelé lors du traitement de WM_PAINT, ou pas uniquement, ou autre) ?
- D'où vient Bitmap (parce que les dimensions sont peut-être égales à zéro) ?
- Est-ce que m_hWnd contient bien ce qui est attendu (parce que l'un des problèmes fréquents est que l'on essaye de peindre le fond, alors que le programme tourne pour la peinture d'un bouton) ?
- Est-ce que le hdc est nul juste après la ligne 7 ou bien ailleurs (parce que vous nous donnez beaucoup de lignes de codes qui suivent ce problème initial, et qui donc ne concerneraient pas ce problème) ?
C'est étrange car CreateCompatibleDC marche bien habituellement. Les cas où un nul est renvoyé est quand il n'y a pas assez de place en mémoire, où quand le DC d'origine est étrange comme celui d'une imprimante ou d'un scanner particulier.
Habituellement, c'est le bitmap associé au DC qui ne contient qu'un seul pixel noir, et cela étonne le programmeur, mais cela vient de ce que la mémoire pour les pixels du bitmap n'a pas été allouée. Je ne sais pas si c'est le cas ici.
Le problème des traces qui subsistent est peut-être similaire à celui décrit à http://www.codeguru.com/forum/showthread.php?t=495844 .
Marsh Posté le 26-07-2010 à 18:32:55
msgpaint est bien appelé lors du message WM_PAINT,
Bitmap est une class stockant un bitmap.
m_hWnd contient bien le handle de la fenetre; au moment de la création, si m_hWnd est null, le programme s'arrete ou annule la création de l'objet.
il est null juste apres la ligne 7.
Comme le DC est null, j'obtient une zone de clipping de 1*1pixel.
Comme la zone de dessin ne se redessine pas, que mon compatible DC est null, mon bitmap laisse des traces.
Je ne travaille qu'avec des objets:
J'ai un objet Windower dont toutes les fenetres héritent, sauf TDrawer qui derive (d'abord) Scroller.
Scroller dérive de Windower et de Bitmap. Scroller est capable de scroller un Bitmap.
Tu veux mon code?
Marsh Posté le 26-07-2010 à 20:05:31
Olivthill merci à toi, je ne sais pas comment, j'obtient le compatible DC. C'est peut-être du en redemarrant le pc quoi qu'il était en veille prolongé.
J'ai modifié deux truc, (WM_ERASEBKGND et WM_MOUSEMOVE) et pourtant même en les remettant, ça fonctionne quand même. ça m'enerve de faire appel à toi Olivthill ou n'importe qui, et que mon programme se met à fonctionner par magie. là, je ne comprend pas pourquoi ça marche.
merci de ton attention.
Marsh Posté le 27-07-2010 à 09:59:23
Oui, c'est un peu énervant quand on a l'impression que l'ordinateur agit selon son humeur au lieu de selon la logique. On est obligé de rester vigilant pour le cas où le problème reviendrait. Mon explication est que c'était un problème de ressources système indisponibles suite à la veille, ... ou autre chose (par exemple, j'ai remarqué que si je lance un programme à partir de l'environnement de programmation, il arrive que j'aie des blocages, au bout de plusieurs lancements, que je n'ai pas si le lancement se fait en dehors ; ou bien il arrive que ce soit un problème dû à une variable non initialisée ou mal initialisée, qui prend une valeur par défaut indésirable dans certaines circonstances très spéciales, ce qui est la raison pour laquelle, je suis très prudent sur les initialisations, et par exemple, je sépare les déclarations, des initialisations elle-mêmes). En tous cas, je suis content de voir des programmeurs qui utilisent les API, et je suis content pour toi que ça marche maintenant. Bonne continuation !
Marsh Posté le 26-07-2010 à 14:31:56
Bonjour,
Mon programme dessine dans un bitmap stocké, toutes les opérations de dessins sont stocké, de se coté là, pas de soucis. Quand je souhaite inserer un bitmap, là commence le petit problème. Je dois l'inserer, pour cela, j'appel une boite de dialogue de recherche de fichier qui me renvoie le nom du fichier. De là, j'ouvre un HANDLE sur le nom de fichier. J'ai ouvert mon fichier. Je click pour un premier point et le deuxieme point n'est pas fixé tant que je ne lache pas le bouton de la souris, j'agrandi l'image, pas de probleme, je retreci l'image probleme, l'image laisse des traces. Je decide de forcer le refraichissement de l'appli par InvalidateRect et UpdateWindow dans le traitement du message WM_MOUSEMOVE, le traitement du message de WM_PAINT s'effectue, mais le HDC fournie a partir de CreateCompatibleDC est un pointeur NULL. Quand je ne le force pas j'obtient bien un compatible DC.
Une idée?