在对话框中选择图片(VC7.1)
默认导入的图片ID: IDB_BITMAP1
PICTURE空件ID: IDC_BNBMP
EDIT控件ID: IDC_PHOTO 添加OnEnChangePhoto()消息处理(可将这个属性设为隐藏)
BUTTON控件ID: IDC_SELECT 处理消息:OnBnClickedSeclect()
定义两个变量:CDIB m_Dib, CString m_strFileName;
BOOL CSelectDlg::OnInitDialog() { ………………….; // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 SetDlgItemText(IDC_PHOTO,"1.bmp"); return TRUE; // 除非设置了控件的焦点,否则返回 TRUE } void CSelectDlg::OnBnClickedSelect() { // TODO: 在此添加控件通知处理程序代码 static char szFilter[]="BMP 文件(*.bmp)|*.bmp|"; CFileDialog dlg(TRUE,"bmp",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter); if(dlg.DoModal()==IDOK) { m_strFileName =dlg.GetFileName(); SetDlgItemText(IDC_PHOTO,m_strFileName); } }
void CSelectDlg::OnEnChangePhoto() { // TODO: 如果该控件是 RICHEDIT 控件,则它将不会 // 发送该通知,除非重写 CDialog::OnInitDialog() // 函数并调用 CRichEditCtrl().SetEventMask(), // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码 GetDlgItemText(IDC_PHOTO,m_strFileName); if(m_strFileName.IsEmpty()) { //m_Dib.LoadFromFile("1.bmp"); CWnd *pWnd=GetDlgItem(IDC_BNBMP); CDC *pDC=pWnd->GetDC(); CRect rect; pWnd->GetClientRect(&rect); m_Dib.ShowDIB(pDC,0,0,rect.Width(),rect.Height()); return; } if(!m_Dib.LoadFromFile(m_strFileName)) return; CWnd *pWnd=GetDlgItem(IDC_BNBMP); CDC *pDC=pWnd->GetDC(); CRect rect; pWnd->GetClientRect(&rect); m_Dib.ShowDIB(pDC,0,0,rect.Width(),rect.Height()); }
// Dib.h #pragma once
class CDIB : public CObject { public: CDIB(); ~CDIB(); BITMAPINFO* m_pBMI;//BITMAPINFO结构指针 BYTE* m_pDIBData;//DIB图像数据指针 BOOL LoadFromFile(LPCTSTR lpszFileName);//装入位图文件 //显示位图 void ShowDIB(CDC* pDC,int nLeft,int nTop,int nWidth,int nHeight); };
// DIB.cpp : CDIB类实现文件 #include "stdafx.h" #include "DIB.h"
CDIB::CDIB() { m_pBMI=NULL; m_pDIBData=NULL; }
CDIB::~CDIB() { if(m_pBMI!=NULL) delete m_pBMI; if(m_pDIBData!=NULL) delete m_pDIBData; } // CDIB 成员函数 BOOL CDIB::LoadFromFile(LPCTSTR lpszFileName) { CFile file; if(!file.Open(lpszFileName,CFile::modeRead | CFile::typeBinary)) { return FALSE; } BITMAPFILEHEADER bfh; if(file.Read(&bfh,sizeof(bfh))!=sizeof(bfh)) { AfxMessageBox("读位图文件头出现错误!"); return FALSE; } if(bfh.bfType!=0x4d42) { AfxMessageBox("不是位图文件!"); return FALSE; } BITMAPINFOHEADER bih; if(file.Read(&bih,sizeof(bih))!=sizeof(bih)) { AfxMessageBox("读取位图信息出现错误!"); return FALSE; } if(bih.biBitCount!=24) { AfxMessageBox("不是真24色位图,程序暂不支持!"); return FALSE; } m_pBMI=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)]; if(!m_pBMI) { AfxMessageBox("内存分配错误!"); return FALSE; } memcpy(m_pBMI,&bih,sizeof(BITMAPINFOHEADER)); DWORD dataBytes=bfh.bfSize-bfh.bfOffBits; m_pDIBData=(BYTE*)new char[dataBytes]; if(!m_pDIBData) { AfxMessageBox("内存分配错误!"); delete m_pBMI; return FALSE; } if(file.Read(m_pDIBData,dataBytes)!=dataBytes) { AfxMessageBox("读位图数据错误!"); delete m_pBMI; delete m_pDIBData; return FALSE; } file.Close(); return TRUE; } void CDIB::ShowDIB(CDC *pDC,int nLeft,int nTop,int nWidth,int nHeight) { pDC->SetStretchBltMode(COLORONCOLOR); StretchDIBits(pDC->GetSafeHdc(), nLeft, nTop, nWidth, nHeight, 0, 0, m_pBMI->bmiHeader.biWidth, m_pBMI->bmiHeader.biHeight, m_pDIBData, m_pBMI, DIB_RGB_COLORS, SRCCOPY); }