Ich versuche alle Grafiken meiner Anwendung beim Start zu laden und in einem globalen vector abzulegen.
Nach meinem Verständnis müsste nach Aufruf der Funktion der vector meine Grafiken enthalten, während alle Variablen die innerhalb der Funktion benutzt werden nicht mehr gültig sind und auf den ersten Blick funktioniert das so.
Ich weiss aber, auch denn die Variable nicht mehr gültig ist, die Bitmaps werden am Ende der Funktion nicht automatisch gelöscht, sondern ich muss den Speicher selber wieder frei geben.
Versuche ich aber die Bitmaps nach push_back() zu löschen, etwa so:
dann funktioniert das nicht mehr, sprich ich habe nur leere Fenster.
Offensichtlich zeigt der vector auf den Speicher, in den innerhalb der Funktion die Grafik geladen wurde.
Jetzt stehe ich davor, wie die Kuh vorm Bahnhof.
Mache ich grundsätzlich was falsch, oder ist das so in Ordnung?
Code:
vector<HBITMAP>MyBitmaps;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int nCmdShow)
{
...
CreateBitmaps();
...
}
void CreateBitmaps()
{
HBITMAP MyBitmap = (HBITMAP)LoadImage(0,"image1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(!MyBitmap)
{
// error
}
MyBitmaps.push_back(MyBitmap);
MyBitmap = (HBITMAP)LoadImage(0,"image2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(!MyBitmap)
{
// error
}
MyBitmaps.push_back(MyBitmap);
}
Nach meinem Verständnis müsste nach Aufruf der Funktion der vector meine Grafiken enthalten, während alle Variablen die innerhalb der Funktion benutzt werden nicht mehr gültig sind und auf den ersten Blick funktioniert das so.
Code:
case WM_PAINT:
{
...
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem,MyBitmaps[0]);
BitBlt(...);
...
}
break;
Ich weiss aber, auch denn die Variable nicht mehr gültig ist, die Bitmaps werden am Ende der Funktion nicht automatisch gelöscht, sondern ich muss den Speicher selber wieder frei geben.
Versuche ich aber die Bitmaps nach push_back() zu löschen, etwa so:
Code:
void CreateBitmaps()
{
HBITMAP MyBitmap = (HBITMAP)LoadImage(0,"image1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(!MyBitmap)
{
// error
}
MyBitmaps.push_back(MyBitmap);
DeleteObject(MyBitmap);
MyBitmap = (HBITMAP)LoadImage(0,"image2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(!MyBitmap)
{
// error
}
MyBitmaps.push_back(MyBitmap);
DeleteObject(MyBitmap);
}
dann funktioniert das nicht mehr, sprich ich habe nur leere Fenster.
Offensichtlich zeigt der vector auf den Speicher, in den innerhalb der Funktion die Grafik geladen wurde.
Jetzt stehe ich davor, wie die Kuh vorm Bahnhof.
Mache ich grundsätzlich was falsch, oder ist das so in Ordnung?