1 首先创建一个基于对话框的MFC应用程序MFCDlgTest
2 打开资源视图,插入新的对话框,修改ID为IDD_SHOWIMGDLG,右击对话框,添加类CShowImgDlg。在ShowImgDlg.h头文件中包含<atlimage.h>头文件,并建立CImage对象
#include <atlimage.h> private: CImage image;
3 删除对话框中的无关控件,添加一个新按钮“打开图像”,修改其ID为IDC_OPEN,并添加事件处理程序,类选择刚刚创建的CShowImgDlg
4 添加按钮点击事件代码
void CMFCDlgTestDlg::OnBnClickedOpen() { // TODO: 在此添加控件通知处理程序代码 CFileDialog dlg(TRUE, _T(".jpg"), _T("*.jpg"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("位图文件(*.bmp)|*.bmp|JPEG(*.jpg)|*.jpg||")); if(dlg.DoModal() == IDOK) { if(!image.IsNull()) { image.Destroy(); } image.Load(dlg.GetPathName()); Invalidate(); } }5 重写CShowImgDlg类的OnPaint()方法,由于类向导中没有找到OnPaint()虚函数,故采用手动添加的方式。
首先在ShowImgDlg头文件中添加函数声明:
public: afx_msg void OnClickedOpen();然后在ShowImgDlg.cpp文件中添加OnPaint()函数的代码:
void CShowImgDlg::OnPaint() { if(IsIconic()) { CPaintDC dc(this); SendMessage(WM_ICONERASEBKGND, (WPARAM)dc.GetSafeHdc(), 0); 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; dc.DrawIcon(x,y,m_hIcon); } else { CDialogEx::OnPaint(); CDC *pDc = this->GetDC(); if(!image.IsNull()) { image.Draw(pDc->GetSafeHdc(), 0, 0); } this->ReleaseDC(pDc); } }仅做出上述改动时发现,在对话框中选择图片文件后,未能在对话框中打开,原因是手动添加的OnPaint()函数没有被调用,因此需要在ShowImgDlg.cpp文件的添加ON_WM_PAINT()代码,如下:
BEGIN_MESSAGE_MAP(CShowImgDlg, CDialogEx) ON_WM_PAINT() //添加的代码 ON_BN_CLICKED(IDC_OPEN, &CShowImgDlg::OnClickedOpen) END_MESSAGE_MAP()6 最后,因为我们添加的对话框不是默认的主对话框,因此需要将MFCDlgTest.cpp中CMFCDlgTestApp::InitInstance()函数的如下代码注释:
/*CMFCDlgTestDlg dlg; m_pMainWnd = &dlg;*/并添加如下代码:
CShowImgDlg dlg; m_pMainWnd = &dlg;显示效果如下: