读显图像文件程序(MFC)

程序功能:实现打开文件过滤、创建滚动视图类、对小图使子窗口按适应图大小、对大图支持子窗口的滚动。

另存为功能,方便图片格式的转换

下面是步骤:

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*AppInitInstance函数的语句

       // 分析标准外壳命令、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函数

              // 所以,wh的值,只能在初始化完成后才能使用, 所以定义了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()); // 保存到文件

}



你可能感兴趣的:(File,文档,mfc,vc++,图形,tiff)