<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Probleme mit Bildschirmschoner &#x2F; IPicture]]></title><description><![CDATA[<p>Hallo!</p>
<p>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.</p>
<p>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:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;scrnsave.h&gt;
#include &lt;atlbase.h&gt;

#include &quot;resource.h&quot;

BOOL LoadPicture(LPCTSTR pszFileName, HWND hWnd);

LONG WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

   LoadPicture(&quot;D:\\test.jpg&quot;, 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, &amp;dwBytesRead, NULL);

  if(!bRead)
   return FALSE;

  GlobalUnlock(hGlobal);
  CloseHandle(hFile);

  //IStream* aus dem speicher erzeugen
  LPSTREAM pstm = NULL;
  HRESULT  hr   = CreateStreamOnHGlobal(hGlobal, TRUE, &amp;pstm);

  //IPicture vom bild erzeugen
  //if(pPicture)
  //    pPicture-&gt;Release();

  hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID*)&amp;pPicture);
  pstm-&gt;Release();

  //breite u. höhe vom bild holen
  pPicture-&gt;get_Width(&amp;lWidth);
  pPicture-&gt;get_Height(&amp;lHeight);

  HDC hdc = CreateIC(TEXT(&quot;DISPLAY&quot;), 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, &amp;rc);

   //Bild anzeigen mittels Render
   pPicture-&gt;Render(hdc, 0, 0, iWidth, iHeight, 0, lHeight, lWidth, -lHeight, &amp;rc);

   return TRUE;
  }

  return FALSE;
}
</code></pre>
<p>Meine Fragen dazu:</p>
<ol>
<li>
<p>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)</p>
</li>
<li>
<p>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.</p>
</li>
</ol>
<p>Bin für jeden Tipp dankbar &amp; 1000 Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>MfG</p>
<p>Mirko</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/151702/probleme-mit-bildschirmschoner-ipicture</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 15:28:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/151702.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Jun 2006 18:40:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Bildschirmschoner &#x2F; IPicture on Wed, 28 Jun 2006 18:40:29 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>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.</p>
<p>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:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;scrnsave.h&gt;
#include &lt;atlbase.h&gt;

#include &quot;resource.h&quot;

BOOL LoadPicture(LPCTSTR pszFileName, HWND hWnd);

LONG WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

   LoadPicture(&quot;D:\\test.jpg&quot;, 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, &amp;dwBytesRead, NULL);

  if(!bRead)
   return FALSE;

  GlobalUnlock(hGlobal);
  CloseHandle(hFile);

  //IStream* aus dem speicher erzeugen
  LPSTREAM pstm = NULL;
  HRESULT  hr   = CreateStreamOnHGlobal(hGlobal, TRUE, &amp;pstm);

  //IPicture vom bild erzeugen
  //if(pPicture)
  //    pPicture-&gt;Release();

  hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID*)&amp;pPicture);
  pstm-&gt;Release();

  //breite u. höhe vom bild holen
  pPicture-&gt;get_Width(&amp;lWidth);
  pPicture-&gt;get_Height(&amp;lHeight);

  HDC hdc = CreateIC(TEXT(&quot;DISPLAY&quot;), 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, &amp;rc);

   //Bild anzeigen mittels Render
   pPicture-&gt;Render(hdc, 0, 0, iWidth, iHeight, 0, lHeight, lWidth, -lHeight, &amp;rc);

   return TRUE;
  }

  return FALSE;
}
</code></pre>
<p>Meine Fragen dazu:</p>
<ol>
<li>
<p>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)</p>
</li>
<li>
<p>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.</p>
</li>
</ol>
<p>Bin für jeden Tipp dankbar &amp; 1000 Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>MfG</p>
<p>Mirko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1087877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1087877</guid><dc:creator><![CDATA[f0]]></dc:creator><pubDate>Wed, 28 Jun 2006 18:40:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Bildschirmschoner &#x2F; IPicture on Thu, 29 Jun 2006 06:06:16 GMT]]></title><description><![CDATA[<p>1. Nutze Remote Debugging, dasgeht super.<br />
2. Klar kannst Du. Du kannst Dir die Resoource laden. Einen Stream daraus erzeugen und in Deine OleLoadPicture Funktion laden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1088054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1088054</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 29 Jun 2006 06:06:16 GMT</pubDate></item></channel></rss>