看流星社区

 找回密码
 注册账号
查看: 2108|回复: 0

bmp格式解析

[复制链接]

该用户从未签到

发表于 2017-6-2 13:28:15 | 显示全部楼层 |阅读模式
写这代码时,出现的错误:
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, :oadCursorA(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 = :oadMenuA(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);
        :eleteObject(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()
};
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 16:16

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表