www.pudn.com > vc应用ADO读取数据库中内容包括图片.rar > EditAdd1.cpp


// EditAdd1.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "StudentAccess.h" 
#include "EditAdd1.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditAdd dialog 
 
 
CEditAdd::CEditAdd(CWnd* pParent /*=NULL*/) 
	: CDialog(CEditAdd::IDD, pParent) 
{ 
	//初始化变量 
	m_hPhotoBitmap = NULL; 
	m_pBMPBuffer = NULL; 
 
	m_nSex = 2;		//未选择的变量 
 
	//{{AFX_DATA_INIT(CEditAdd) 
	m_strName = _T(""); 
	m_nAge = 0; 
	m_strMajor = _T(""); 
	m_strHome = _T(""); 
	m_strCollege = _T(""); 
	//}}AFX_DATA_INIT 
} 
 
 
void CEditAdd::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CEditAdd) 
	DDX_Control(pDX, IDOK, m_btnOk); 
	DDX_Control(pDX, IDC_SEX, m_ComboBoxSex); 
	DDX_Text(pDX, IDC_EDITNAME, m_strName); 
	DDV_MaxChars(pDX, m_strName, 20); 
	DDX_Text(pDX, IDC_EDITAGE, m_nAge); 
	DDX_Text(pDX, IDC_MAJOR, m_strMajor); 
	DDX_Text(pDX, IDC_HOME, m_strHome); 
	DDX_Text(pDX, IDC_COLLEGE, m_strCollege); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CEditAdd, CDialog) 
	//{{AFX_MSG_MAP(CEditAdd) 
	ON_BN_CLICKED(IDC_BUTTONPIC, OnSelectphoto) 
	ON_WM_PAINT() 
	ON_CBN_SELCHANGE(IDC_SEX, OnSelchangeSex) 
	ON_EN_CHANGE(IDC_EDITNAME, OnChangeName) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditAdd message handlers 
 
///////////选择BMP文件并加载到内存///////////// 
void CEditAdd::OnSelectphoto()  
{ 
	static char BASED_CODE szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"; 
	CFileDialog dlg(TRUE,"BMP",NULL,  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); 
	if(dlg.DoModal() == IDOK) 
	{ 
		CString pathname = dlg.GetPathName(); 
		DestroyPhoto(); 
		LoadBMPFile(pathname); 
		m_hPhotoBitmap = BufferToHBITMAP(); 
		Invalidate(); 
	}	 
} 
 
/////////////清除分配的对象///////////// 
void CEditAdd::DestroyPhoto() 
{ 
	if(m_hPhotoBitmap) 
	{ 
		DeleteObject(m_hPhotoBitmap); 
		m_hPhotoBitmap = NULL; 
	} 
	if(m_pBMPBuffer) 
	{ 
		delete m_pBMPBuffer; 
		m_pBMPBuffer = NULL; 
	} 
} 
 
/////////////加载BMP文件到内存////////////// 
BOOL CEditAdd::LoadBMPFile(const char *pBMPPathname) 
{ 
	CFile file; 
	if( !file.Open( pBMPPathname, CFile::modeRead) ) 
		return FALSE; 
	m_nFileLen = file.GetLength(); 
	m_pBMPBuffer = new char[m_nFileLen + 1]; 
	if(!m_pBMPBuffer) 
		return FALSE; 
	if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen) 
		return FALSE; 
	return TRUE; 
} 
 
///////////将内存中的BMP文件内容转换到HBITMAP/////// 
HBITMAP CEditAdd::BufferToHBITMAP() 
{ 
	HBITMAP				hBmp; 
	LPSTR				hDIB,lpBuffer = m_pBMPBuffer; 
	LPVOID				lpDIBBits; 
	BITMAPFILEHEADER	bmfHeader; 
	DWORD				bmfHeaderLen; 
 
	bmfHeaderLen = sizeof(bmfHeader); 
	strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen); 
//	if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B')) return NULL; 
	if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;//我copy《Windows程序设计》上的做法。 
	hDIB = lpBuffer + bmfHeaderLen; 
	BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ; 
	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ; 
/*	int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;  
	if( bmInfo.bmiHeader.biBitCount > 8 ) 
		lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +  
			((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0)); 
	else 
		lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors); 
*///原来的代码。 
	lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;//这行功能和上面被注释掉的代码相同,容易理解。 
	CClientDC dc(this); 
	hBmp = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS); 
	return hBmp; 
} 
 
/////////////////在屏幕上显示图像/////////////////// 
void CEditAdd::DrawUserPhoto(int x, int y, CDC *pDC) 
{ 
	if(!m_hPhotoBitmap) return; 
	HBITMAP OldBitmap; 
	CDC MemDC; 
	MemDC.CreateCompatibleDC(pDC); 
	OldBitmap=(HBITMAP)MemDC.SelectObject(m_hPhotoBitmap); 
	pDC->BitBlt(x,y,100,130,&MemDC,0,0,SRCCOPY); 
	MemDC.SelectObject(OldBitmap); 
} 
 
void CEditAdd::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
	//在屏幕上显示图像 
	DrawUserPhoto(90,180,&dc); 
	// Do not call CDialog::OnPaint() for painting messages 
} 
 
BOOL CEditAdd::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	//启动对话框,先选择下拉表 
	this->m_ComboBoxSex.SetCurSel( this->m_nSex );	 
 
	//修改操作 
	if( this->m_bKind == 2 ) 
		this->m_btnOk.EnableWindow(TRUE); 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CEditAdd::OnSelchangeSex()  
{ 
	this->m_nSex = this->m_ComboBoxSex.GetCurSel(); 
 
 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:DestroyWindow 
//功能:关闭对话框时清除工作 
///////////////////////////////////////////////////////////////////////////// 
BOOL CEditAdd::DestroyWindow() 
{ 
//	DestroyPhoto();  图片变量需要传递到父对话框 
	return CDialog::DestroyWindow(); 
} 
 
////////////////////////////////////////////////////////////////////////////// 
//名称:OnChangeName 
//功能:改变按钮显隐 
///////////////////////////////////////////////////////////////////////////// 
void CEditAdd::OnChangeName()  
{ 
	// TODO: If this is a RICHEDIT control, the control will not 
	// send this notification unless you override the CDialog::OnInitDialog() 
	// function and call CRichEditCtrl().SetEventMask() 
	// with the ENM_CHANGE flag ORed into the mask. 
	 
	//插入操作 
	if( this->m_bKind == 1 ) 
	{ 
		UpdateData(TRUE);	//传递控件值到变量 
		if( this->m_strName != "" ) 
			this->m_btnOk.EnableWindow(TRUE); 
		else 
			this->m_btnOk.EnableWindow(FALSE); 
	} 
}