一种对图象进行局部放大的有效方法解读_第1页
一种对图象进行局部放大的有效方法解读_第2页
一种对图象进行局部放大的有效方法解读_第3页
一种对图象进行局部放大的有效方法解读_第4页
一种对图象进行局部放大的有效方法解读_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一种对图象进行局部放大的有效方法杨喜林 杨 杨 (烟台南山学院软件工程学院、工商管理学院 山东龙口 265706)摘 要:在Visual C+6.0中,运用CDC类的StretchBlt函数,可以实现对图象进行局部放大的目的。该方法充分发挥了Visual C+6.0在图形设计方面的强大功能和StretchBlt函数对图形操作的独特作用。程序设计优化,操作方便灵活。关键词: 类 对象 消息 映射 位图中图分类号: 文献标识码: A valid method about partly magnify image Yang xilin Yang yang(Yantai Nanshan university Yantai Area of shandong province 265706)Abstract: Using CDC type StretchBlt function in Visual C+6.0 can realize the purpose of partly enlarging towards the views. This method gives full play to Visual C+6.0s great power in the aspect of the picture designing and StretchBlt functions special effects towards the picture operation. This owns optimization design, and is easy to operate flexiblely. Keywords: class; object; news; mapping; bitmap. - 在实际工作中,对图象进行局部放大,以便更加清楚、细致的观察图象的某个部位,是经常遇到的。在Visual C+6.0中,巧妙、灵活的运用CDC类的StretchBlt函数以及有效的完成对鼠标的消息映射等,就能实现这一目的;这里所实现的对图象进行局部放大的操作是:(1)移动MOUSE鼠标,放大显示图象的不同部位。(2)左击鼠标放大倍率。(3)右击鼠标减少倍率。实现效果:见下面图1和图2所示: 图1:原图象 图2:局部放大后的图象一、StretchBlt()函数 CDC类定义设备环境对象类,其对象提供操作设备环境(如显示器或打印机等)的成员函数,以及操作与窗口客户区相关的显示描述表的成员函数。StretchBlt()就是CDC类中的一个函数,它将位图从源矩形和设备移进目的矩形,并为适应目-作者简介:杨喜林(1949年_),男,吉林省四平市人,烟台南山学院软件工程学院,教授。的矩形框,还可能压缩或放大位图。StretchBlt函数原形如下:BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);其返回值是:若位图绘制成功,则返回非0值,否则返回值为0。参数:x 目标矩形左上角的逻辑x坐标; y 目标矩形左上角的逻辑y坐标; nWidth 目标矩形的逻辑宽度; nHeight 目标矩形的逻辑高度; pSrcDC 指定源设备环境; XSrc 源矩形左上角的逻辑x坐标; YSrc 源矩形左上角的逻辑y坐标; nSrcWidth 源矩形的逻辑宽度; nSrcHeight 源矩形的逻辑高度; dwRop 指定要执行的光栅操作;说明:将位图从源矩形拷贝到目标矩形中,并按需要拉伸或压缩位图,使其适应目标矩形的大小。二、对图象进行局部放大的程序设计:(1)建立一个单文档SDI应用程序,名为:图象放大镜(2)在视图类的View.h的public中添加以下数据成员:CSize m_sizeDest;CSize m_sizeSource;CBitmap *m_pBitmap;/位图类指针CDC *m_pdcMem;/CDC类指针int oldx,oldy,s,d;bool recover;/布尔类型变量,即:真或假long mana;(3)在资源中加入你自己喜欢的位图,并设ID为:IDB_BITMAP1。Insert-Resource-点中BITMAP-New-Import-找到一个你喜欢的位图图形,加到项目中。(4)在视图类的View.cpp的构造函数中,进行初始化数据成员CMyView:CMyView()/ TODO: add construction code herem_pdcMem=new CDC;/CDC类m_pBitmap=new CBitmap;/位图类recover=true;/赋给布尔类型变量为真s=30; d=45;mana=SRCCOPY;(5)在视图类的View.cpp的析构函数中,对用完后的数据成员进行释放CMyView:CMyView()delete m_pdcMem;/释放为CDC类开辟的一片单元delete m_pBitmap;/释放为位图类开辟的一片单元注意:1、将主框架类MainFrm.h中的保护模式protected:下的CStatusBar m_wndStatusBar; 剪切到公共模式public:下 2、在视图类执行文件CMyView.cpp中,加入:#include “MainFrm.h”(6)在视图类的View.cpp的显示函数OnDraw()中编程:void CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);static bool load;if(!load)BITMAP bm;load = !load; m_pBitmap-LoadBitmap(IDB_BITMAP1); /位图类中的成员函数,/从程序的可执行文件中调入指定的位图资源,并连接位图到对象,/初始化对象,参数是:位图资源ID号m_pdcMem-CreateCompatibleDC(pDC); /CDC类成员函数,创建一个/内存设备环境,以便位图在内存中保存下来,并与指定设备(窗口设备)/环境相兼容,参数是:设备环境指针m_pdcMem-SelectObject(m_pBitmap);/将位图对象选入内存设备环境中,/参数是:指向一个要选择的CBitmap对象的指针。m_pBitmap-GetObject(sizeof(bm),&bm);/sizeof是运算符,它的目的是返/回操作数所占的内存空间大小(字节数),这里bm是数据类型,计算bm/类型数据所占的字节数,&bm是BITMAP对象bm的引用,即地址m_sizeSource.cx=bm.bmWidth;m_sizeSource.cy=bm.bmHeight;m_sizeDest=m_sizeSource;pDC-StretchBlt(0,0,m_sizeSource.cx,m_sizeSource.cy,m_pdcMem,0,0,m_sizeSource.cx,m_sizeSource.cy,mana); else pDC-StretchBlt(0,0,m_sizeSource.cx,m_sizeSource.cy, m_pdcMem,0,0,m_sizeSource.cx,m_sizeSource.cy,mana);/ TODO: add draw code for native data here(7)将鼠标移动消息WM_MOUSEMOVE映射到视图类中,并编程:view-Clswizard-在ClassName中找到WM_MOUSEMOVE点中-Add Function-Edit Codevoid CMyView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCString cord;int dd;CRect srect,drect,mrect;CMainFrame *pFrame=(CMainFrame *)AfxGetApp()-m_pMainWnd;CStatusBar *pStatus=&pFrame-m_wndStatusBar;if(pStatus)cord.Format(X=%d,Y=%d,point.x,point.y);pStatus-SetPaneText(1,cord);srect.left=point.x-s;srect.top=point.y-s;srect.right=point.x+s;srect.bottom=point.y+s;drect.left=point.x-d;drect.top=point.y-d;drect.right=point.x+d;drect.bottom=point.y+d;mrect.left=oldx-d;mrect.top=oldy-d;mrect.right=oldx+d;mrect.bottom=oldy+d;dd=2*d;CDC *pDC=GetDC();OnPrepareDC(pDC);if(recover)pDC-BitBlt(mrect.left,mrect.top,dd,dd,m_pdcMem,mrect.left,mrect.top,mana);pDC-StretchBlt(drect.left,drect.top,drect.Width(), drect.Height(),m_pdcMem,srect.left,srect.top, srect.Width(),srect.Height(),SRCCOPY);/将位图从源矩形和设备移进目的矩形,为适应目的矩形框,/可能压缩或放大位图。oldx=point.x;oldy=point.y;ReleaseDC(pDC);recover=true;CView:OnMouseMove(nFlags, point);(8)将鼠标右键按下消息WM_RBUTTONDOWN映射到视图类中,并编程view-Clswizard-在ClassName中找到WM_RBUTTONDOWN点黑-Add Function-Edit Codevoid CMyView:OnRButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(d5) CDC *pDC=GetDC(); pDC-StretchBlt(oldx-d,oldy-d,2*d,2*d,m_pdcMem,oldx-d, oldy-d,2*d,2*d,mana); d-=10; ReleaseDC(pDC); CMyView:OnMouseMove(nFlags, point); CView:OnRButtonDown(nFlags, point); (9)将鼠标左键按下消息WM_LBUTTONDOWN映射到视图类中,并编程view-Clswizard-在ClassName中找到WM_LBUTTONDOWN点中-Add Function-Edit Codevoid CMyView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultif(d150) d+=10; CMyView:OnMouseMove(nFlags, point

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论