程序功能:实现打开文件过滤、创建滚动视图类、对小图使子窗口按适应图大小、对大图支持子窗口的滚动。
另存为功能,方便图片格式的转换
下面是步骤:
VC++2005 创建MFC应用程序->多文档项目Image
在“MFC应用程序向导”最后一步的“生成的类”页,将C*View的基类从缺省的CView改成CScrollView。
ImageDoc.h 添加
#include <atlimage.h> // 用到CImage类
文档类添加img对象
CImage img;
在CImageDoc::Serialize添加下面代码,装入图像文件
if (!img.IsNull()) img.Destroy();
HRESULT hr = img.Load(ar.GetFile()->GetFilePath());
ASSERT(SUCCEEDED(hr));
为了MDI程序在开始运行时不自动创建一个新文档及其对应子窗口,可在应用程序类C*App的InitInstance函数的语句
// 分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
与
// 调度在命令行中指定的命令。如果
// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
if (!ProcessShellCommand(cmdInfo))
return FALSE;
之间,加上语句:
// 不让在启动时创建子框架窗口
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
视图类添加
int m_iWidth , m_iHeight; // 图像宽度, 高度
bool m_bInit;
视图类OnDraw 添加如下代码
if (!pDoc->img.IsNull())
pDoc->img.BitBlt(pDC->m_hDC, 0, 0); // 显示图像
在OnInitialUpdate函数中或其他需要的地方调用CScrollView类的成员函数SetScrollSizes来设置滚动的范围和参数
OnInitialUpdate添加如下代码
CImageDoc* pDoc = GetDocument();
// 对滚动视图类,必须设置滚动的尺寸
if(pDoc->img.IsNull()) SetScrollSizes(MM_TEXT, CSize(100, 100));
else
{
m_iWidth = pDoc->img.GetWidth(); m_iHeight = pDoc->img.GetHeight();
RECT crect;
GetClientRect(&crect);
SetScrollSizes( MM_TEXT, CSize(m_iWidth, m_iHeight), CSize(crect.right, crect.bottom), CSize(10, 10));
ResizeParentToFit( ); // 按SetScrollSizes的参数sizeTotal,来自动调整其窗口大小
m_bInit = true;
}
在用户改变窗口大小时,调整滚动的页面和行的大小
添加OnSize消息响应函数, 加入代码:
// TODO: 在此处添加消息处理程序代码
CImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc->img.IsNull())
{
// 因为创建视图类时会先调用OnSize函数后,再调用OnInitialUpdate函数
// 所以,w和h的值,只能在初始化完成后才能使用, 所以定义了m_bInit变量
if (m_bInit) SetScrollSizes(MM_TEXT, CSize(m_iWidth, m_iHeight), CSize(cx, cy), CSize(10, 10));
}
添加文件过滤器
Image.cpp 注释掉原来的ID_FILE_OPEN消息响应函数 //ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen)
添加自己的ID_FILE_OPEN消息响应函数
void CImageApp::OnFileOpen()
{
wchar_t filters[] = L"图像文件(*.bmp;*.gif;*.jpg;*.png;*.tif)|*.bmp;*.gif;*.jpg;/ *.png;*.tif|位图文件(*.bmp)|*.bmp|图形交换格式文件(*.gif)|*.gif|联合图象专家组/ [JPEG]文件(*.jpg)|*.jpg|可移植网络图形文件(*.png)|*.png|标记图像文件格式[TIFF]/ 文件(*.tif)|*.tif|所有文件(*.*)|*.*||";
CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filters);
if (fileDlg.DoModal() == IDOK) OpenDocumentFile(fileDlg.GetPathName());
}
在视图类添加另存为(ID_FILE_SAVE_AS)消息响应函数
void CImageView::OnFileSaveAs()
{
CImageDoc* pDoc = GetDocument();
wchar_t filters[] = L"(*.bmp)|*.bmp|(*.gif)|*.gif|/
(*.jpg)|*.jpg|(*.png)|*.png|/
(*.tif)|*.tif|所有文件(*.*)|*.*||";
CFileDialog fileDlg(TRUE, L"jpg", L"zhuzhu.jpg", OFN_HIDEREADONLY, filters);
if (fileDlg.DoModal() == IDOK)
pDoc->img.Save(fileDlg.GetPathName()); // 保存到文件
}