Zugriff auf Resource - mal gehts , mal nicht -
-
Hallo Miteinander,
Mich würde interessieren, warum ich in case:WM_CREATE auf meine korrekt eingbundenen Resourcen Zugreifen kann, in case:WM_KEYDOWN dagegen nicht.
Wäre schön, wenn jemand eine Idee dazu hat, ich bin ziehmlich vrezweifelt daran. Danke schonmal,Biff
LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC DeviceHandle, hdcMem;
PAINTSTRUCT paintstru;
static HBITMAP hBitmap;
static BITMAP bitmap;
HINSTANCE hInstance;
static int x=0;switch (message) /* handle the messages */
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;hBitmap=LoadBitmap(hInstance, "FRAMEC"); //
Hier funktioniert es Prima
GetObject (hBitmap, sizeof(BITMAP), &bitmap) ;
PlaySound("HPB", NULL, SND_RESOURCE | SND_ASYNC | SND_LOOP) ;
return 0;case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
DeleteDC (hdcMem) ;
DeleteObject(hBitmap) ;
break;case WM_PAINT:
DeviceHandle=BeginPaint(hwnd, &paintstru) ;
hdcMem=CreateCompatibleDC(DeviceHandle);
SelectObject(hdcMem, hBitmap) ;
BitBlt(DeviceHandle, 50, 90, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY) ;
EndPaint(hwnd, &paintstru);
return 0;case WM_KEYDOWN:
switch (wParam)
{
case VK_SPACE:
switch (x)
{
case 0:
hBitmap =(HBITMAP)LoadImage(hInstance, "frame02.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//hBitmap = LoadBitmap(hInstance, "FRAMEB"); //Hier nicht !
break;
case 1:
hBitmap =(HBITMAP)LoadImage(hInstance, "frame01.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//hBitmap = LoadBitmap(hInstance, "FRAMEA"); //Hier nicht !
break;
case 2:
hBitmap =(HBITMAP)LoadImage(hInstance, "frame02.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//hBitmap = LoadBitmap(hInstance, "FRAMEB"); //Hier nicht !
break;
case 3:
hBitmap =(HBITMAP)LoadImage(hInstance, "frame03.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//hBitmap = LoadBitmap(hInstance, "FRAMEC");
break;
};
InvalidateRect(hwnd,NULL,FALSE);
x++;
if (x==4)
x=0;
return 0;
}default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);}
return 0;
}
-
Welchen Wert hat hInstance bei case VK_SPACE?
Entweder Du holst Dir jedesmal erneut den hInstance oder aber deklarierst die Variable hInstance als static...
-
also ich sehe mindestens eine Stelle, wo ein Device Handle nicht wieder freigegeben wird, was dann dazu führt daß Du irgendwann keinen mehr bekommst.
In WM_PAINT müßte es so aussehen:DeviceHandle=BeginPaint(hwnd, &paintstru) ; hdcMem=CreateCompatibleDC(DeviceHandle); SelectObject(hdcMem, hBitmap) ; BitBlt(DeviceHandle, 50, 90, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY) ; DeleteDC (hdcMem); EndPaint(hwnd, &paintstru);
Bei WM_DESTROY kann die Anweisung DeleteDC dann natürlich entfallen.
-
cool: DANKE !
Jep, einfach hInstance als static erklärt und gut wars. Hmm, wundert mich nur noch warum LoadImage() mit einem ungültigen(?) hInstance funktioniert und LoadBitmap() nicht. Trotzdem fettes Dankeschön,...
-
Da du bei LoadImage eine externe Datei lädst sollte / muss? hInst NULL sein
-
Wieso ungültig?
In WM_CREATE wird hInstance mit einem Wert versehen.
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
Dann verläßt dein Programm die WndProc und hInstance wird, weil nicht als static deklariert, ZERBRÖSELT!
Dann bekommst Du deine VK_SPACE Message und versuchst, mit der zerbröselten (ohne Wert) hInstance was zu machen.. ganz klar das das schiefgeht!
Deshalb als static deklarieren, dann behalten die Variablen ihren Wert, auch wenn das Programm aus der Funktion springt...