[VC++] Code tout bête marchant sous win2000 mais pas sous win9x !

Code tout bête marchant sous win2000 mais pas sous win9x ! [VC++] - Programmation

Marsh Posté le 15-07-2001 à 12:22:14    

voilà le code
CFileFind find;
CString ModName;
CBitmap bmp;
 
if (bmp.LoadBitmap(IDB_NOPIC)==FALSE) MessageBox("Error" );  
 
c_mod.GetText(c_mod.GetCurSel(),ModName.GetBuffer(255));  
ModName.ReleaseBuffer();  
 
if (find.FindFile(ModPath+ "\\"+ModName+"\\"+ModName+ ".bmp" ))
{
 find.FindNextFile();  
 c_bit.SetBitmap((HBITMAP)LoadImage(0,find.GetFilePath(), IMAGE_BITMAP,NULL,NULL,LR_LOADFROMFILE));  
}
else
{
 c_bit.SetBitmap(bmp);
}
 
pourquoi le  c_bit.SetBitmap(bmp); ne amrche t il pas sous Win9x (rien ne s'affiche).
De plus, quel que soit l'OS, l'image chargée par cette commande disparait dès que l'appli est cachée alors qu'elle reste afficvhée normalement quand elle est chargée par l'autre commande (cf le début du if) ??
 
merci d'avance..

Reply

Marsh Posté le 15-07-2001 à 12:22:14   

Reply

Marsh Posté le 15-07-2001 à 18:31:03    

Pour l'image qui ne se réaffiche pas, il faut la redessiner dans le WndProc lorsque tu recoits le message WM_PAINT. Pour le bug, y a un truc bizarre, mais ton HDC il é ou la ??

Reply

Marsh Posté le 15-07-2001 à 18:32:55    

j'ai oublié de la dire on dirait, je suis en MFC et je veut afficher le bitmap dans un CStatic (ca marche au poil avec les images de .bmp externes mais pas avec les bitmap des ressources du projet)

Reply

Marsh Posté le 15-07-2001 à 20:03:22    

c'est tout con, fallait passer le CBitamp en global...

Reply

Marsh Posté le 15-07-2001 à 20:07:16    

Ton problème est le destructeur de la variable "bmp" déclarée localement.
Quand tu fais:
  c_bit.SetBitmap(bmp);
 
tu assignes à ton objet c_bit une bitmap qui va être détruite.
 
Alors qu'avec:
  c_bit.SetBitmap((HBITMAP)LoadImage(0,find.GetFilePath(), IMAGE_BITMAP,NULL,NULL,LR_LOADFROMFILE));
 
tu assignes un handle créé par Windows et qui n'est pas dans un objet qui va être détruit...
 
La différence vient du comptage de référence car il semble que sous NT, le Handle de bitmap passé indirectement par c_bit.SetBitmap(bmp); est dupliqué pour être stocké dans l'espace mémoire des ressources... Cette duplication n'a pas lieu sous Windows 9x qui n'en a pas besoin.
 
La solution est de ne pas stocker la bitmap IDB_NOPIC dans une variable locale bmp, mais d'utiliser l'API Windows directement pour stocker cette bitmap dans un handle et non dans un objet CBitmap.
 
1) Enlève le code inutile bmp.LoadBitmap(IDB_NOPIC);
 
2) dans le code du else, assigne directement le handle de bitmap:
c_bit.SetBitmap((HBITMAP)IDB_NOPIC);  
Les identifiants de ressources du programme sont utilisables directement comme handle...

Reply

Marsh Posté le 15-07-2001 à 22:23:58    

merci beaucoup !

Reply

Marsh Posté le 15-07-2001 à 22:45:46    

c_bit.SetBitmap((HBITMAP)IDB_NOPIC);   ne marche pas.
j'ai pas de message d'erreur, tout est ok mais au lieu d'afficher mon bitmap il affiche un paté informe noir ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed