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 对应的数据,包括调色板数据和像素数据