win32 CreateDIBitmap 显示 BMP 文件

win32 CreateDIBitmap

win7 64位
创建 一个 MFC 对话框程序:
添加一个按钮:
按钮的 点击事件处理函数内容如下:

代码主要演示 函数的用法

void CDIBCONVDlg::OnBnClickedBtnShowBmp()
{
    // TODO: 在此添加控件通知处理程序代码

     OPENFILENAME ofn ;
     static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
     static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
                                      TEXT ("All Files (*.*)\0*.*\0\0") ;

    TCHAR   tszTempPath[_MAX_PATH];

    HWND hwnd;
    HDC hdc ;


    hwnd = AfxGetMainWnd()->m_hWnd;

    hdc =::GetDC(hwnd);

    ZeroMemory(tszTempPath, MAX_PATH);

    GetCurrentDirectory(MAX_PATH, tszTempPath);

    ofn.lStructSize       = sizeof (OPENFILENAME) ;
    ofn.hwndOwner         = NULL ;
    ofn.hInstance         = NULL ;
    ofn.lpstrFilter       = szFilter ;
    ofn.lpstrCustomFilter = NULL ;
    ofn.nMaxCustFilter    = 0 ;
    ofn.nFilterIndex      = 0 ;
    ofn.lpstrFile         = szFileName ;
    ofn.nMaxFile          = MAX_PATH ;
    ofn.lpstrFileTitle    = szTitleName ;
    ofn.nMaxFileTitle     = MAX_PATH ;
    ofn.lpstrInitialDir   = tszTempPath ;
    ofn.lpstrTitle        = NULL ;
    ofn.Flags             = 0 ;
    ofn.nFileOffset       = 0 ;
    ofn.nFileExtension    = 0 ;
    ofn.lpstrDefExt       = TEXT ("bmp") ;
    ofn.lCustData         = 0 ;
    ofn.lpfnHook          = NULL ;
    ofn.lpTemplateName    = NULL ;


    BOOL bRet = GetOpenFileName (&ofn);

    if(!bRet){

        return ;

    }


    printf("szFileName = %S\r\n",szFileName);

     _tprintf(_T("%s\r\n"),szFileName);




     BITMAP              bitmap ;
     HDC                 hdcMem ;


     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  ;

          // Read in the whole file

     dwFileSize = GetFileSize (hFile, &dwHighSize) ;

     if (dwHighSize)
     {
          CloseHandle (hFile) ;
          return  ;
     }

     pbmfh =(BITMAPFILEHEADER *) malloc (dwFileSize) ;

     if (!pbmfh)
     {
          CloseHandle (hFile) ;
          return  ;
     }

     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  ;
     }

          // 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 ;

    if (hBitmap)
    {
        GetObject (hBitmap, sizeof (BITMAP), &bitmap) ;

        hdcMem = CreateCompatibleDC (hdc) ;
        SelectObject (hdcMem, hBitmap) ;

        BitBlt (hdc,    0, 0, bitmap.bmWidth, bitmap.bmHeight, 
                hdcMem, 0, 0, SRCCOPY) ;

        DeleteDC (hdcMem) ;

        DeleteObject (hBitmap) ;
        hBitmap = NULL ;
    }


    ::ReleaseDC (hwnd, hdc) ;


}

在 OnInitDialog 中添加如下代码:

    AllocConsole(); 
    SetConsoleTitle(_T("debug console")); 
    freopen("CONOUT$","w",stdout); 

    printf("Hello\r\n");

显示效果:
这里写图片描述

工程如下:
https://download.csdn.net/download/wowocpp/10513712

备注:

这里写图片描述

HBITMAP 对应的数据,包括调色板数据和像素数据

猜你喜欢

转载自blog.csdn.net/wowocpp/article/details/80884251