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);
}
}