本文实例讲述了C++针对bmp格式解析的方法,分享给大家供大家参考。具体方法如下:
写这代码时,容易出现如下错误:
1. 忘了on_wm_paint() 一直在界面上画不出来
2. 正确写法
BYTE* pBits = (BYTE*)lpBase + pbitmapFileHeader->bfOffBits;
写成了
BYTE* pBits = pbitmapFileHeader->bfOffBits;
这里主要是用了前面一篇中的CWnd框架。
.cpp源文件如下:
#include "ReadBMP.h" #include "resource.h" #include <afxdlgs.h > CMyApp theApp; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); return TRUE; //必须返回TRUE,否则不会进入消息循环,界面会直接退出 } //CMainWindow BEGIN_MESSAGE_MAP(CMainWindow, CWnd) ON_WM_CREATE() ON_WM_PAINT() ON_COMMAND(IDC_OPEN, OnOpen) END_MESSAGE_MAP() //构造函数 CMainWindow::CMainWindow() { LPCTSTR lpszClassName = ::AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, ::LoadCursorA(NULL, IDC_ARROW), (HBRUSH)(COLOR_3DFACE+1), theApp.LoadIcon(IDI_MAIN)); CreateEx(WS_EX_CLIENTEDGE, lpszClassName, "xxx", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL); } //析构函数 CMainWindow::~CMainWindow() { } //消息映射函数 int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) { //OutputDebugString("oncreate"); CClientDC dc(this); m_hMemDC = ::CreateCompatibleDC(dc); m_nWidth = 0; m_nHeight = 0; //设置菜单 HMENU hMenu = ::LoadMenuA(theApp.m_hInstance, (LPCSTR)IDR_MENU); ::SetMenu(m_hWnd, hMenu); return 0; } void CMainWindow::OnNcDestroy( ) { delete this; } void CMainWindow::OnDestroy() { } void CMainWindow::OnPaint() { CPaintDC dc(this); ::BitBlt(dc, 0, 0, m_nWidth, m_nHeight, m_hMemDC, 0, 0, SRCCOPY); } void CMainWindow::OnOpen() { CFileDialog dlg(TRUE); if (IDOK != dlg.DoModal()) { return; } HANDLE hFile = ::CreateFile(dlg.GetPathName(), GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { return; } HANDLE hFileMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (NULL == hFileMap) { return; } LPVOID lpBase = ::MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0); if (NULL == lpBase) { return; } //从头结构中取三个信息:1.bfOffBits位图数据在文件中的起始位置,2.m_nWidth图像的宽,3.m_nHeight图像的高 BITMAPFILEHEADER* pbitmapFileHeader; BITMAPINFO* pbitmapInfo; pbitmapFileHeader = (BITMAPFILEHEADER*)lpBase; if (pbitmapFileHeader->bfType != MAKEWORD('B','M')) { MessageBox("not bmp"); ::UnmapViewOfFile(lpBase); ::CloseHandle(hFileMap); ::CloseHandle(hFile); } //DWORD bfOffBits = pbitmapFileHeader->bfOffBits; BYTE* pBits = (BYTE*)lpBase + pbitmapFileHeader->bfOffBits; pbitmapInfo = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER)); m_nWidth = pbitmapInfo->bmiHeader.biWidth; m_nHeight = pbitmapInfo->bmiHeader.biHeight; //显示BMP文件到内存设备 //得客户区DC CClientDC dc(this); //创建与客户区DC兼容的位图 HBITMAP hBitmap = ::CreateCompatibleBitmap(dc, m_nWidth, m_nHeight); if (hBitmap == 0) { return; } //位图选入内存DC ::SelectObject(m_hMemDC, hBitmap); //图像数据放到建立的DC中 ::SetDIBitsToDevice(m_hMemDC, 0, 0, m_nWidth, m_nHeight, 0, 0, 0, m_nHeight, pBits, pbitmapInfo, DIB_RGB_COLORS); ::InvalidateRect(m_hWnd, NULL, TRUE); ::DeleteObject(hBitmap); ::UnmapViewOfFile(lpBase); ::CloseHandle(hFileMap); ::CloseHandle(hFile); }
.h头文件如下:
#include <afxwin.h> class CMyApp:public CWinApp { public: virtual BOOL InitInstance(); }; //CMainWindow class CMainWindow:public CWnd { public: CMainWindow(); ~CMainWindow(); protected: HDC m_hMemDC; //与客户区兼容的内存DC句柄 UINT m_nWidth; //BMP的宽度 UINT m_nHeight; //BMP的高度 //消息映射 afx_msg void OnNcDestroy( ); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy( ); afx_msg void OnOpen(); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() };
希望本文所述对大家的C++程序设计有所帮助。
本文向大家介绍C语言实现对bmp格式图片打码,包括了C语言实现对bmp格式图片打码的使用技巧和注意事项,需要的朋友参考一下 相信大家看到上面的标题一定觉的是上面高大上的技术,其实很简单。 前提准备:一张bmp格式的图片,如果没有的话,可以用Windows的画图软件来才裁剪。设置像素大小为(1024,768); 程序原理:将图片读入数组,然后给数组的指定位置存入随机数,最后再写入文件,这样图片就相应
本文向大家介绍C++指向函数的指针实例解析,包括了C++指向函数的指针实例解析的使用技巧和注意事项,需要的朋友参考一下 通常来说C++函数指针是指指向函数的指针,而非指向对象的指针。就像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。 定义: 赋值: fp=function; 调用 (*fp)(10,100); volatile的用法和作用: con
跨平台的INI解析器:SimpleINI,支持section,读、写、各种value,遍历等。代码有注释. [Code4App.com]
本文向大家介绍解析C++中指向对象的指针使用,包括了解析C++中指向对象的指针使用的使用技巧和注意事项,需要的朋友参考一下 C++指向对象的常指针 将指针变量声明为const型,这样指针值始终保持为其初值,不能改变。 如: 定义指向对象的常指针的一般形式为: 也可以在定义指针变量时使之初始化,如将上面第2, 3行合并为: 请注意,指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其
本文向大家介绍C#实现json格式数据解析功能的方法详解,包括了C#实现json格式数据解析功能的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现json格式数据解析功能的方法。分享给大家供大家参考,具体如下: 来写写json的解析吧 首先添加web引用 System.Web.Extensions 路径 c:\Program Files (x86)\Reference As
本文向大家介绍delphi实现将BMP格式图形转化为JPG格式图形的方法,包括了delphi实现将BMP格式图形转化为JPG格式图形的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了delphi实现将BMP格式图形转化为JPG格式图形的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Delphi程序设计有所帮助。