代码:
void CStuInfoDlg::OnButtonPhoto() { static char BASED_CODE szFilter[] = "图片文件(*.bmp)|*.bmp||"; CFileDialog dlg( TRUE,NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter); if (IDOK != dlg.DoModal()) return; m_bPhotoChange = TRUE; m_strPhotoFilePath = dlg.GetPathName(); m_hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), m_strPhotoFilePath, IMAGE_BITMAP, 0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); Invalidate(); // 强制对话框无效,调用OnPaint }
⑥为 CStuInfoDlg 类添加成员函数 DrawPhoto,用于在静态文本控件 IDC_DRAW 中绘制照片。
void CStuInfoDlg::DrawPhoto() { 3
VC 程序设计-实验指导 if(!m_hBitmap) return; CBitmap m_bmp; m_bmp.Attach(m_hBitmap); BITMAP bm; m_bmp.GetObject(sizeof(BITMAP),&;bm); float fScale;
// 定义一个BITMAP结构变量,以便获取位图参数 // 高/宽
fScale = (float)bm.bmHeight / (float)bm.bmWidth; CWnd* pWnd = GetDlgItem(IDC_DRAW); // 获得IDC_DRAW控件窗口指针 CDC* pDC = pWnd->GetDC(); // 获得窗口当前的设备环境指针 // 调整可以显示的矩形大小 CRect rcClient; int nWidth, nHeight, nX = 0, nY = 0; pWnd->GetClientRect( rcClient ); nWidth = rcClient.Width(); nHeight = (int)((float)nWidth * fScale); nX = 0; nY = ( rcClient.Height() - nHeight ) / 2; if ( nHeight > rcClient.Height() ) { nHeight = rcClient.Height(); nWidth = (int)((float)nHeight/fScale); nX = ( rcClient.Width() - nWidth )/2; nY = 0; } CDC dcMem; // 定义并创建一个内存设备环境
dcMem.CreateCompatibleDC(pDC); CBitmap *pOldbmp = dcMem.SelectObject(&;m_bmp); // 将位图选入内存设备环境中 rcClient.DeflateRect(-1, -1); pDC->Rectangle( rcClient ); pDC->StretchBlt(nX, nY, nWidth, nHeight, &;dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); // 将位图复制到实际的设备环境中 dcMem.SelectObject(pOldbmp); // 恢复原来的内存设备环境 }
⑦ 用 MFC ClassWizard 为 CStuInfoDlg 类映射 WM_PAINT 消息,并添加下列代码:
void CStuInfoDlg::OnPaint() { CPaintDC dc(this); // device context for
painting CWnd* pWnd = GetDlgItem(IDC_DRAW); pWnd->UpdateWindow(); DrawPhoto(); }
4.测试“学生基本信息”对话框 . ① 在 Ex_StudentView.cpp 文件的开始处,添加包含 CStuInfoDlg 类的头文件包含:
#include "Ex_StudentView.h" #include "StuInfoDlg.h"
② 在菜单资源的主菜单中添加顶层菜单项 “学生基本信息 (&;S), ” 在该顶层菜单项中添加子菜单 “添 加 (&;A) ID_STUINFO_ADD) 在
工作区的 ResourceView 页面展开 Accelerator, ” ( 。 双击 IDR_MAINFRAME, 打开快捷键编辑器。在空白区如下表添加:
4
VC 程序设计-实验指导
③ 用 MFC ClassWizard 为 CEx_StudentView 类添加处理菜单项 ID_STUINFO_ADD 的 COMMAND 消 息,并添加下列代码:
void CEx_StudentView::OnStuinfoAdd() { CStuInfoDlg dlg; if (dlg.DoModal() != IDOK) return; }
④ 编译运行并测试。 5.完善 OnStuinfoAdd 代码 . ① 为 CEx_StudentView 类添加成员函数 DoCopyFile,用于复制文件,其代码如下:
void CEx_StudentView::DoCopyFile(CString strFileTo, CString strFileFrom) { CFile fileFrom, fileTo; if (!fileFrom.Open( strFileFrom, CFile::modeRead)){ AfxMessageBox("源文件无法打开,复制失败!"); } fileTo.Open( strFileTo, CFile::modeCreate | CFile::modeWrite ); BYTE buffer[4096]; DWORD dwRead; do{ dwRead = fileFrom.Read(buffer, 4096); fileTo.Write(buffer, dwRead); } while (dwRead > 0); fileFrom.Close(); fileTo.Close(); }
return;
② 在 CEx_StudentView::OnStuinfoAdd 函数中添加下