GDI - API Win32 - Programmation
Marsh Posté le 25-10-2010 à 14:27:44
La première chose à corriger est :
bi.bmiHeader.biSizeImage=0; |
A la place, il faut écrire :
bi.bmiHeader.biSizeImage = bi.bmiHeader.biWidth * 4 * bi.bmiHeader.biHeight * sizeof(unsigned char); |
Je n'ai pas regardé la suite en détail.
Edit : J'avais mis "* -1", car d'habitude on met un nombre négatif pour la hauteur pour partir du haut vers le bas, au lieu de l'inverse.
Marsh Posté le 25-10-2010 à 16:25:05
Haha, GDI et son API de merde. Bon, quand je fais joujou avec les bitmaps, je préfère utiliser des DIBSection, c'est moins casse gueule. En essayant de modifier ton code, je n'ai pas réussi à le faire fonctionner non plus. Mais en utilisant des DIBSection, ça fonctionne sans problème. Suffit de réécrire ton WM_PAINT de la sorte :
Code :
|
Une petite optimisation serait d'allouer le DIBSection avant la boucle d'événement, et d'initialiser le bitmap renvoyé plutôt que d'utiliser une table statique.
Marsh Posté le 25-10-2010 à 19:57:42
@olivthill
Ce champ peut rester à 0. Je cite la MSDN :
Citation : biSizeImage The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps. |
J'ai essayé, au cas où, de modifier ce champ mais cela n'améliore pas le résultat.
@tpierron
Je vais pas me prendre la tête et utiliser les DIBSection, et je vais même utiliser l'amélioration que tu me proposes. N'empêche que sur le principe mon code de départ ne me parait pas si foireux que ça.
Je dis pas que c'est simple de faire une interface graphique qui puisse adapter à tous les matériels, mais le GDI c'est une belle merde.
Merci les amis !
Marsh Posté le 26-10-2010 à 12:32:39
Pour infos, voici ma version qui marche, créée en modifiant un peu la version initiale :
Code :
|
Marsh Posté le 26-10-2010 à 13:20:57
tpierron a écrit : Haha, GDI et son API de merde. |
Elle est pas particulièrement merdique quand on passe un peu de temps dedans. Mais elle nécessite un peu d'apprentissage. Faut trouver des infos dans des bouquins un peu anciens comme ceux de Martin Heller (Advanced Win32 Programming, etc), mais je ne sais pas si on les trouve encore hors occase.
A+,
Marsh Posté le 26-10-2010 à 21:48:29
gilou a écrit : Elle est pas particulièrement merdique quand on passe un peu de temps dedans. Mais elle nécessite un peu d'apprentissage. Faut trouver des infos dans des bouquins un peu anciens comme ceux de Martin Heller (Advanced Win32 Programming, etc), mais je ne sais pas si on les trouve encore hors occase. |
Sans doute qu'une bonne doc permet de mieux comprendre le fonctionnement de cet API. Ceci dit, j'ai essayé de comprendre pourquoi le code de olivthill marche et pas le mien. En le remodifiant un peu le code suivant marche :
Code :
|
Ce qui me porte à croire qu'il faut impérativement exécuter le code 'createDIBitmap' avec le Displau device context cible, et pas avec un memory device context. Pour qui ? pour quoi ? ça... mystère.
En tous cas merci les gars!
Marsh Posté le 24-10-2010 à 12:05:03
Bonjour,
Une bonne âme pourrait elle m'aider ? Je ne comprends pas pourquoi mon code ne marche pas alors que j'ai essayé de suivre les préconisations de la MSDN et de différents forums. Un truc m'échappe...
Pour l'instant, je veux juste écrire un code simple, pour le complexifier par la suite.
Je définis en global :
J'éxécute en premier dans la winmain :
Et enfin, j'intercepte le message WM_PAINT. Je transforme tableau en hBitmap, puis je le redimensionne pour la fenêtre
J'ai passé 4 heures sur les forums et à reprendre chaque paramétrage un par un pour essayer de comprendre. J'ai essayé d'intercepter les erreurs (aucun appel à une fonction ne renvoie d'erreur). Je m'attends à avoir la zone centrale de ma fenêtre toute violette (0x00ff00ff) et je me retrouve avec une fenêtre toute noire.
Code complet :