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:

    1. 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)

    2. 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


  • Mod

    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.


Anmelden zum Antworten