Microsoft KB Archive/104570: Difference between revisions

From BetaArchive Wiki
m (1 revision imported: importing part 1)
m (Text replacement - "&" to "&")
 
(2 intermediate revisions by the same user not shown)
Line 56: Line 56:
     dwSize  = GlobalSize(hIcon);
     dwSize  = GlobalSize(hIcon);
     lpGMem  = GlobalLock(hIcon);
     lpGMem  = GlobalLock(hIcon);
     fh = OpenFile ("myicon.bin", &of, OF_WRITE | OF_CREATE);
     fh = OpenFile ("myicon.bin", &of, OF_WRITE | OF_CREATE);


     if (fh == -1)  // If NOT opened successfully.
     if (fh == -1)  // If NOT opened successfully.
     {
     {
     MessageBox(NULL, "Unable to create file", NULL, MB_OK );
     MessageBox(NULL, "Unable to create file", NULL, MB_OK );
     return FALSE;
     return FALSE;
     }
     }
Line 67: Line 67:
     _lclose(fh);
     _lclose(fh);


     if (uiSize == -1 || uiSize < (UINT)dwSize)
     if (uiSize == -1 || uiSize < (UINT)dwSize)
     {
     {
       MessageBox(NULL, &quot;Unable to read file&quot;, NULL, MB_OK );
       MessageBox(NULL, "Unable to read file", NULL, MB_OK );
       return FALSE;
       return FALSE;
     }
     }
Line 101: Line 101:


   nBytesRead = 0;
   nBytesRead = 0;
   if ( OpenFile((LPSTR)&quot;myicon.bin&quot;,(LPOFSTRUCT)&amp;ofFileInfo,OF_EXIST) != -1
   if ( OpenFile((LPSTR)"myicon.bin",(LPOFSTRUCT)&ofFileInfo,OF_EXIST) != -1
)
)
   {
   {
     // Open the file. Its existence has already been checked.
     // Open the file. Its existence has already been checked.
     fh = _lopen(&quot;myicon.bin&quot;, OF_READ);
     fh = _lopen("myicon.bin", OF_READ);
     if (fh == -1)  // if NOT opened successfully
     if (fh == -1)  // if NOT opened successfully
       return FALSE;
       return FALSE;


     // File the file structure to get the file size.
     // File the file structure to get the file size.
     iResult = _fstat(fh, &amp;buf);
     iResult = _fstat(fh, &buf);
     if ( !iResult)
     if ( !iResult)
     {
     {
Line 134: Line 134:
     _lclose(fh);
     _lclose(fh);


     if (nBytesRead == -1 || nBytesRead &lt; buf.st_size)
     if (nBytesRead == -1 || nBytesRead < buf.st_size)
     {
     {
       MessageBox(NULL, &quot;Unable to read file&quot;, NULL, MB_OK );
       MessageBox(NULL, "Unable to read file", NULL, MB_OK );
       return FALSE;
       return FALSE;
     }
     }
Line 146: Line 146:
   else
   else
   {
   {
     MessageBox( NULL, &quot;File not found&quot;, NULL, MB_OK );
     MessageBox( NULL, "File not found", NULL, MB_OK );
     return FALSE;
     return FALSE;
   }
   }

Latest revision as of 12:24, 21 July 2020

Reading and Writing Icons from ExtractIcon

Q104570



The information in this article applies to:


  • Microsoft Windows Software Development Kit (SDK) 3.1





SUMMARY

This article is specifically about device dependent icons. The ExtractIcon() function does not save the contents of the icon to a file. The programmer needs to implement this in his or her application. Below are code samples that allow you to read and write the data to a file so that DrawIcon() can be used.



MORE INFORMATION

The following is a summary of the steps needed to save the hIcon to a file:


  1. Get the desired handle to the icon by using ExtractIcon().
  2. Find the size of the global memory by using GlobalSize().
  3. Lock the handle of the icon using GlobalLock().
  4. Open a new file by using OpenFile().
  5. Write the contents out to the file by using _lwrite().
  6. Close the file.
// -----------------------------------------------
//   Parameters: hIcon - passed in
//   Returns:    TRUE on success, FALSE on failure
// -----------------------------------------------
int NEAR _pascal SaveMyIcon( HICON hIcon)
{
  int       fh, i, iResult;
  UINT      uiSize;
  DWORD     dwSize;
  OFSTRUCT  of;

    if (!hIcon)
      return FALSE;

    dwSize  = GlobalSize(hIcon);
    lpGMem  = GlobalLock(hIcon);
    fh = OpenFile ("myicon.bin", &of, OF_WRITE | OF_CREATE);

    if (fh == -1)  // If NOT opened successfully.
    {
     MessageBox(NULL, "Unable to create file", NULL, MB_OK );
     return FALSE;
    }

    uiSize = _lwrite(fh, (LPSTR)lpGMem, (UINT)dwSize);
    _lclose(fh);

    if (uiSize == -1 || uiSize < (UINT)dwSize)
    {
       MessageBox(NULL, "Unable to read file", NULL, MB_OK );
       return FALSE;
    }
    else // Everything worked, return hGMem.
    {
      return (HICON)hGMem;
    }
} 

The following is a summary of the steps needed to read the hIcon from a file:


  1. Open the file with OpenFile.
  2. Get the size of the file with _fstat.
  3. Make a chunk of memory, hMem, for the file by using GlobalAlloc.
  4. Lock the memory by using GlobalLock.
  5. Read the file into memory by using _lread.
  6. Close the file by using _lclose.
  7. Unlock the memory by using GlobalUnlock.
  8. Pass the hMem to DrawIcon.
// --------------------------------------
// Read in the binary icon data from disk
// --------------------------------------
HICON NEAR _pascal LoadMyIcon()
{
  int       iResult, fh;
  UINT      nBytesRead;
  struct    _stat   buf;
  OFSTRUCT  ofFileInfo;

  nBytesRead = 0;
  if ( OpenFile((LPSTR)"myicon.bin",(LPOFSTRUCT)&ofFileInfo,OF_EXIST) != -1
)
  {
    // Open the file. Its existence has already been checked.
    fh = _lopen("myicon.bin", OF_READ);
    if (fh == -1)  // if NOT opened successfully
      return FALSE;

    // File the file structure to get the file size.
    iResult = _fstat(fh, &buf);
    if ( !iResult)
    {
      hGMem = GlobalAlloc(GHND, (DWORD)buf.st_size);
      if (0==hGMem)
      {
        _lclose(fh);
        return(FALSE);
      }

      // Lock the memory.
      if (!(lpGMem = GlobalLock(hGMem)))
      {
        GlobalFree(hGMem);
        _lclose(fh);
        return(FALSE);
      }

      // Seek to the beginning of the file.
      _llseek(fh, 0, 0);
      nBytesRead = _lread(fh, (LPSTR)lpGMem, buf.st_size );
    }
    _lclose(fh);

    if (nBytesRead == -1 || nBytesRead < buf.st_size)
    {
      MessageBox(NULL, "Unable to read file", NULL, MB_OK );
      return FALSE;
    }
    else // Everything worked, return hGMem.
    {
      return (HICON)hGMem;
    }
  }
  else
  {
    MessageBox( NULL, "File not found", NULL, MB_OK );
    return FALSE;
  }
} 

WARNING: This will work correctly until the user changes his or her display-driver type to a different resolution, or from mono to color, or from color to mono.

Additional query words: no32bit 3.10

Keywords : kb16bitonly
Issue type :
Technology : kbAudDeveloper kbWin3xSearch kbSDKSearch kbWinSDKSearch kbWinSDK310


Last Reviewed: November 7, 1999
© 2001 Microsoft Corporation. All rights reserved. Terms of Use.