Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15260462
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-31 09:16:32

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

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

下面是步骤:

VC++2005  创建MFC应用程序->多文档项目Image

在“MFC应用程序向导”最后一步的“生成的类”页,将C*View的基类从缺省的CView改成CScrollView。

 

ImageDoc.h 添加

#include                // 用到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))

[NextPage]

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));[Page]

       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

[NextPage]

,来自动调整其窗口大小

              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|可移植网络图形文件

[NextPage]

(*.png)|*.png|标记图像文件格式[TIFF]\\ 文件(*.tif)|*.tif|所有文件(*.*)|*.*||\";

       CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filters);[Page]

       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()); // 保存到文件

阅读(398) | 评论(0) | 转发(0) |
0

上一篇:mfc消息映射防真

下一篇:C++中ODBC编程实例

给主人留下些什么吧!~~