⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmpdlg.cpp

📁 the code for file get.it is a good example for the beginner.
💻 CPP
字号:
// bmpDlg.cpp : implementation file
//

#include "stdafx.h"
#include "bmp.h"
#include "bmpDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBmpDlg dialog

CBmpDlg::CBmpDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CBmpDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CBmpDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CBmpDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBmpDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CBmpDlg, CDialog)
	//{{AFX_MSG_MAP(CBmpDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_BITMAP, OnButtonBitmap)
	ON_BN_CLICKED(IDC_BUTTON_SAVE, OnButtonSave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBmpDlg message handlers

BOOL CBmpDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_pBmp = NULL;
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CBmpDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CBmpDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CBmpDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
BOOL CBmpDlg::LoadBitmapFile(CString strFileName,CBitmap& bmp)
{
	CFile file;
	if( !file.Open(strFileName, CFile::modeRead) )
		return FALSE;

	BITMAPFILEHEADER bmfHeader;
	long nFileLen;

	nFileLen = file.GetLength();

	if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
		return FALSE;

	if (bmfHeader.bfType != ((WORD)('M' <<8) | 'B'))
		return FALSE;

	HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);
	if (hDIB == 0)
		return FALSE;

	if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=
		nFileLen - sizeof(BITMAPFILEHEADER) )
	{
		::GlobalFree(hDIB);
		return FALSE;
	}

	BITMAPINFO &bmInfo = *(LPBITMAPINFO) ::GlobalLock(hDIB) ;
	BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER	*)hDIB;

	int nHeaderSize=sizeof(BITMAPINFOHEADER);	
	BYTE *pBmpPixelBuffer=(BYTE *)&bmInfo+bmfHeader.bfOffBits - sizeof(BITMAPFILEHEADER);

	CDC dc;
	dc.CreateDC("DISPLAY",NULL,NULL,NULL);
	HBITMAP hBitmap;
	hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,CBM_INIT,(VOID *)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
	bmp.Attach (hBitmap);
	
	::GlobalUnlock (hDIB);
	::GlobalFree(hDIB);
	return TRUE;
}
BOOL CBmpDlg::SaveBitmapFile(CString strFileName,CBitmap& bmp)
{
	BITMAP bm;
	bmp.GetBitmap (&bm);
	
	int nWidth = bm.bmWidth;
	int nHeight = bm.bmHeight;
	
	int nLineBits = bm.bmWidthBytes;
	if ((nLineBits % 8) != 0)
		nLineBits += 8 - nLineBits%8;

	int nBitCounts = nLineBits * bm.bmHeight ;

	int nBits = bm.bmBitsPixel;
	int nBitmapInfoSize = 0;

	if (nBits <= 8)
	{
		int nColors = 1 << nBits;
		int nPalUnitSize = sizeof(RGBQUAD);
		nBitmapInfoSize = sizeof(BITMAPINFOHEADER) + nPalUnitSize * nColors;	
	}
	else
		nBitmapInfoSize = sizeof(BITMAPINFOHEADER);

	BITMAPINFO*	pbmpinfo = NULL;

	pbmpinfo =(BITMAPINFO *)(new BYTE[nBitmapInfoSize]);
	ZeroMemory((void *)pbmpinfo,nBitmapInfoSize);
	
	BITMAPINFOHEADER* pInfoHead = (BITMAPINFOHEADER *)pbmpinfo;
	ZeroMemory((void *)pInfoHead,sizeof(BITMAPINFOHEADER));

	pInfoHead->biSize = sizeof(BITMAPINFOHEADER);
	pInfoHead->biBitCount = nBits;
	pInfoHead->biPlanes = 1;
	pInfoHead->biSizeImage = nBitCounts;
	pInfoHead->biCompression = BI_RGB;
	pInfoHead->biWidth = nWidth;
	pInfoHead->biHeight = nHeight;

	CDC dc;
	dc.CreateDC("DISPLAY",NULL,NULL,NULL);

	int nLx = dc.GetDeviceCaps (LOGPIXELSX);
	int nLy = dc.GetDeviceCaps (LOGPIXELSY);

	double dbInchPerMeter = 39.375;

	int nPMx = (int)((double)nLx * dbInchPerMeter);
	int nPMy = (int)((double)nLy * dbInchPerMeter);

	pInfoHead->biXPelsPerMeter = nPMx;//3780;
	pInfoHead->biYPelsPerMeter = nPMy;//3780;
	
	if (nBits <= 8)
	{
		int nColors = 1 << nBits;
		GetDIBColorTable(dc.m_hDC,0,nColors,pbmpinfo->bmiColors);
	}

	BYTE* pBits = NULL;
	
	HGLOBAL hGlobal = ::GlobalAlloc(GMEM_FIXED, nBitCounts);
	pBits = (BYTE *)::GlobalLock(hGlobal);
	ZeroMemory((void *)pBits,nBitCounts);
	
	GetDIBits(dc.m_hDC,(HBITMAP)bmp,0,nHeight,pBits,pbmpinfo,DIB_RGB_COLORS);

	BITMAPFILEHEADER	bmfHeader;
	int nFileHeadSize = sizeof(BITMAPFILEHEADER);
	
	ZeroMemory((void *)&bmfHeader,sizeof(BITMAPFILEHEADER));
	bmfHeader.bfType = 19778;//'BM'    ((WORD) ('M' << 8) | 'B'); 
	bmfHeader.bfSize = nFileHeadSize + nBitmapInfoSize + nBitCounts;
	bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + nBitmapInfoSize;

	CFile file;
	if(!file.Open (strFileName,CFile::modeCreate | CFile::modeWrite))
	{
		AfxMessageBox("Write File Error!");
		return FALSE;
	}

	file.Write (&bmfHeader,sizeof(BITMAPFILEHEADER));
	file.Write (pbmpinfo,nBitmapInfoSize);

	file.WriteHuge (pBits, nBitCounts);
	file.Close ();

	::GlobalUnlock (hGlobal);
	::GlobalFree (hGlobal);
	delete[] pbmpinfo;

	return TRUE;
}
void CBmpDlg::DrawBmp (CBitmap& bmp)
{
	CDC* pDC = GetDC();
	CDC memDC;
	memDC.CreateCompatibleDC (NULL);
	CBitmap* pOldBmp = memDC.SelectObject (&bmp);

	BITMAP bm;
	bmp.GetBitmap (&bm);
	int nWidth = bm.bmWidth;
	int nHeight = bm.bmHeight;

	pDC->BitBlt (0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);
	
	memDC.SelectObject (pOldBmp);
}
void CBmpDlg::OnButtonBitmap() 
{
	// TODO: Add your control notification handler code here
	CFileDialog dlg(true,"*.bmp",NULL,NULL,"*.bmp|*.bmp||");
	if (dlg.DoModal()==IDOK)
	{
		if (m_pBmp != NULL)
		{
			m_pBmp->DeleteObject();
			delete m_pBmp;
			m_pBmp = NULL;
		}
		
		m_pBmp = new CBitmap;

		if (LoadBitmapFile(dlg.GetPathName(),*m_pBmp))
		{
			DrawBmp(*m_pBmp);
			
		}
	}	
}

void CBmpDlg::OnButtonSave() 
{
	// TODO: Add your control notification handler code here
	if (m_pBmp == NULL)
		return;

	CFileDialog dlg(false,"*.bmp",NULL,NULL,"*.bmp|*.bmp||");
	if (dlg.DoModal()==IDOK)
	{
		SaveBitmapFile(dlg.GetPathName(),*m_pBmp);	
	}
}

BOOL CBmpDlg::DestroyWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	if (m_pBmp != NULL)
	{
		m_pBmp->DeleteObject();
		delete m_pBmp;
		m_pBmp = NULL;
	}

	return CDialog::DestroyWindow();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -