使用内存映射显示BMP图片文件问题!高手进来下!
void CMainWindow::OnFileOpen() // 用户点击打开菜单命令时{ CFileDialog file(TRUE); if(!file.DoModal()) return; // 下面是映射BMP文件到内存的过程 // 打开要映射的文件 HANDLE hFile = ::CreateFile(file.GetFileName(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) { MessageBox("读取文件出错!"); return; } // 创建内存映射对象 HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, NULL, NULL, NULL); // 映射整个BMP文件到内存,返回这块内存的首地址 LPVOID lpBase = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); // 下面是获取BMP文件信息的过程 BITMAPFILEHEADER *pFileHeader; // bitmap file-header BITMAPINFO *pInfoHeader; // bitmap info-header // 取得file-header指针,以获得位图象素 pFileHeader = (BITMAPFILEHEADER*)lpBase; if(pFileHeader->bfType != MAKEWORD('B', 'M')) { MessageBox("本程序仅读取BMP文件!"); ::UnmapViewOfFile(lpBase); ::CloseHandle(hMap); ::CloseHandle(hFile); return; } BYTE *pBits = (BYTE*)lpBase + pFileHeader->bfOffBits; // 取得info-header指针,以获得文件的大小 pInfoHeader = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER)); m_nHeight = pInfoHeader->bmiHeader.biHeight; m_nWidth = pInfoHeader->bmiHeader.biWidth; // 下面是显示BMP文件到内存设备的过程 CClientDC dc(this); // 创建一个与指定DC兼容的未初始化的位图,选入到内存兼容DC中 HBITMAP hBitmap = ::CreateCompatibleBitmap(dc, m_nWidth, m_nHeight); ::SelectObject(m_hMemDC, hBitmap); // 把象图像据放到建立的设备中 int nRet = ::SetDIBitsToDevice(m_hMemDC, 0, // xDest 0, // yDest m_nWidth, m_nHeight, 0, // xSrc 0, // ySrc 0, // uStartScan 开始复制的扫描线和要复制的扫描线数 m_nHeight, // cScanLines pBits, // lpvBits 指向DIB中的象素数据部分 pInfoHeader, // lpbmi 指向BITMAPINFO结构 DIB_RGB_COLORS); // fuColorUse 指定了DIB中数据的类型 ::InvalidateRect(m_hWnd, NULL, TRUE); ::DeleteObject(hBitmap); ::UnmapViewOfFile(lpBase); ::CloseHandle(hMap); ::CloseHandle(hFile);}