完整的bmp和光标文件已经存贮在内存中, 请教一下如何从内存中载入BMP图像和光标?

解决方案 »

  1.   

    CDC::BitBlt  
    BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
      

  2.   

    内存中载入BMP图像
    http://shukaiyang.myweb.hinet.net/dibtips/index.html
    从内存中载入光标
    http://www.codeproject.com/bitmap/ColorCursorFromBmp.asp
      

  3.   

    http://shukaiyang.myweb.hinet.net/dibtips/index.html 打不开
      

  4.   

    这里有个函数,你改一下就可以,看ReadFile之后的部分
    HBITMAP CreateBitmapObjectFromDibFile (HDC hdc, PTSTR szFileName)
        
    {
        
          BITMAPFILEHEADER *  pbmfh ;
        
          BOOL        bSuccess ;
        
          DWORD       dwFileSize, dwHighSize, dwBytesRead ;
        
          HANDLE       hFile ;
        
          HBITMAP      hBitmap ;
                     // Open the file: read access, prohibit write access
              hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
        
        OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
        
          if   (hFile == INVALID_HANDLE_VALUE)
        
                     return NULL ;
                     // Read in the whole file
              dwFileSize = GetFileSize (hFile, &dwHighSize) ;
              if (dwHighSize)
        
          {
        
                 CloseHandle (hFile) ;
        
                 return NULL ;
        
          }
              pbmfh = malloc (dwFileSize) ;
          if (!pbmfh)
        
          {
        
                 CloseHandle (hFile) ;
        
                 return NULL ;
        
      }
              bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;
        
          CloseHandle (hFile) ;
                     // Verify the file
        
          if (!bSuccess     || (dwBytesRead != dwFileSize)    
        
                     || (pbmfh->bfType != * (WORD *) "BM")
        
                     || (pbmfh->bfSize != dwFileSize))
        
      {
        
                 free (pbmfh) ;
        
                 return NULL ;
        
      }
        
                 // Create the DDB
        
          hBitmap = CreateDIBitmap   (hdc,      
        
                             (BITMAPINFOHEADER *) (pbmfh + 1),
        
                          CBM_INIT,
        
                            (BYTE *) pbmfh + pbmfh->bfOffBits,
        
                             (BITMAPINFO *) (pbmfh + 1),
        
                            DIB_RGB_COLORS) ;
        
          free (pbmfh) ;
        
          return hBitmap ;
        
    }
      

  5.   

    用GDI+的IStreamIStream* istream;
    HGLOBAL m_hGlobal = GlobalAlloc( GPTR, bmpLen);//bmpLen=内存中bmp数组长度
    VOID* global_addr = GlobalLock( m_hGlobal );
    memcpy( global_addr, bmpAddr, bmpLen); //bmpAddr=内存中bmp数组地址
    CreateStreamOnHGlobal( m_hGlobal, true, &istream );Bitmap* bitmap = new Bitmap( istream, false );
      

  6.   

    结贴了,打算goodboyws的方法试试看。aj3423的建议也不错,不过因为不打算在程序发布的时候带上gdi+的动态库,所以暂时不考虑gdi+的函数。
      cursor的载入看来大家都没什么好办法,干脆从内存存到文件,再通过LoadImage函数载入算了:(