Probleme mit Bildschirmschoner / IPicture
-
Hallo!
Ich würde mir gerne einen kleinen Bildschirmschoner programmieren. Er soll möglichst auf jedem Rechner laufen, ohne viele Bibliotheken installieren zu müssen. Leider habe ich bis dato nur Erfahrungen mit VC# gemacht, möchte aber nicht auf .NET zurückgreifen.
Die Grundstruktur vom Bildschirmschoner steht soweit, nur leider bekomme ich es einfach nicht hin, dass der Saver JPG Bilder anzeigen kann. Hier mein aktueller Code:
#include <windows.h> #include <scrnsave.h> #include <atlbase.h> #include "resource.h" BOOL LoadPicture(LPCTSTR pszFileName, HWND hWnd); LONG WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { LoadPicture("D:\\test.jpg", hWnd); switch(message) { case WM_CREATE: break; case WM_DESTROY: break; } return DefScreenSaverProc(hWnd,message,wParam,lParam); } BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hWnd,0); return TRUE; case IDCANCEL: EndDialog(hWnd,0); return TRUE; } break; } return FALSE; } BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { return TRUE; } BOOL LoadPicture(LPCTSTR pszFileName, HWND hWnd) { LPPICTURE pPicture; long lWidth, lHeight; int iWidth, iHeight; //datei öffnen HANDLE hFile = CreateFile(pszFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if(INVALID_HANDLE_VALUE == hFile) return FALSE; //datei größe ermitteln DWORD dwFileSize = GetFileSize(hFile, NULL); //speicher in größe der datei allokieren HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); LPVOID pvData = GlobalLock(hGlobal); //datei lesen u. im speicher behalten DWORD dwBytesRead = 0; BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL); if(!bRead) return FALSE; GlobalUnlock(hGlobal); CloseHandle(hFile); //IStream* aus dem speicher erzeugen LPSTREAM pstm = NULL; HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); //IPicture vom bild erzeugen //if(pPicture) // pPicture->Release(); hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID*)&pPicture); pstm->Release(); //breite u. höhe vom bild holen pPicture->get_Width(&lWidth); pPicture->get_Height(&lHeight); HDC hdc = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL); //in Pixel konvertieren iWidth = (lWidth * GetDeviceCaps(hdc, LOGPIXELSX)) / 2540; iHeight = (lHeight * GetDeviceCaps(hdc, LOGPIXELSY)) / 2540; if(pPicture) //wenn bild geladen { RECT rc; GetClientRect(hWnd, &rc); //Bild anzeigen mittels Render pPicture->Render(hdc, 0, 0, iWidth, iHeight, 0, lHeight, lWidth, -lHeight, &rc); return TRUE; } return FALSE; }Meine Fragen dazu:
-
Warum zeigt er das Bild nicht an? Wie kann ich sowas überhaupt debuggen? Der Bildschirm wird einfach schwarz und wenn ich die Maus bewege, dann beendet sich der Saver (ist ja auch richtig so)
-
Kann ich mit dieser Routine auch Bilder aus den Ressources laden? Würde die Bilder für den Saver später am liebsten als Ressource mit einbinden.
Bin für jeden Tipp dankbar & 1000 Dank

MfG
Mirko
-
-
1. Nutze Remote Debugging, dasgeht super.
2. Klar kannst Du. Du kannst Dir die Resoource laden. Einen Stream daraus erzeugen und in Deine OleLoadPicture Funktion laden.