147上位机VC MFC使用GDI+缩放图片及前后左右平移
147上位机VC MFC使用GDI+缩放图片及前后左右平移
功能展示
GDI+ 是微软对窗口DGI的升级,对图片的操作十分方便,我们当前例程通过编写简单的类,实现图片的平移及放大缩小控件,效果如图; 要点提示 通过微软的GDI+能够快速轻松实现 对图片的放大,缩小,平移操作; GDI+使用前,得下载微软的GDIPLUS支持包,可从微软的管网下载,我们这里给大家进行了打包; 然后是添加头文件再进行简单的初始化操作,在CWinApp派生类的InitInstance函数中进行此项工作是最好的;
实现功能 1.新建基于对话框的应用程序 2.使用前准备GDI+:将例程根目录Include文件夹复制到自己工程根目录。 在StdAfx.h头文件包含GDI+ 头文件及库文件//使用GDI+第一步 #define UNICODE #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include "Include/gdiplus.h" using namespace Gdiplus; #pragma comment(lib, "Include/gdiplus.lib") 在APP类的InitInstance()中进行初始化 //使用GDI+第二步 GdiplusStartupInputgdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken,&gdiplusStartupInput, NULL); 在程序退出时 进行GDI+ 环境的关闭
//使用GDI+第三步 GdiplusShutdown(gdiplusToken); //关闭gdiplus的环境 3,准备好GDI+后,便是使用GDI+ 实现我们想要的功能,我们当前例程封装了一个操作图片的类CGdiPlusImage,只有几个函数,快速实现图片的缩放,平移功能; 复制类的源文件,头文件GdiPlusImage.cpp,GdiPlusImage.h,到工程根目录 并加载到工程中; 4.添加变量private: CGdiPlusImage m_Image;//已打开的图上 CPoint m_ptPos;//图片位置 float m_fScale;//图片缩放量,并初始化 m_ptPos.x=0; m_ptPos.y=0; m_fScale = 1.0f;
5.添加几个按钮实现图片打开,放大,缩小,左移,右移,上移,下移功能,下面为函数体 - void CGkbc8Dlg::OnOpen()
- {
- CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,NULL, this);
- dlg.m_ofn.lpstrFilter=TEXT("图像文件*.jpg;*.bmp;*.png;\0*.jpg;*.bmp;*.png\0\0");
- if(dlg.DoModal() == IDOK)
- {
- if( !m_Image.LoadImage(dlg.GetPathName()) )
- {
- AfxMessageBox(TEXT("加载资源失败!"));
- return;
- }
- CRect rcClient;
- GetClientRect(&rcClient);
- m_ptPos.x = (rcClient.Width()-m_Image.GetWidth())/2;
- m_ptPos.y = (rcClient.Height()-m_Image.GetHeight())/2;
- m_fScale = 1.0f;
- m_Image.SetScale(m_fScale,m_fScale);
- Invalidate();
- }
- }
- void CGkbc8Dlg::OnZoomin()
- {
- if ( m_Image.IsNull() ) return;
- m_fScale += 0.1f;
- if( m_fScale >= 4 ) m_fScale = 4;
- m_Image.SetScale(m_fScale,m_fScale);
- Invalidate(FALSE);
- }
复制代码- void CGkbc8Dlg::OnZoomout()
- {
- if ( m_Image.IsNull() ) return;
- m_fScale -= 0.1f;
- if( m_fScale <= 0.1f ) m_fScale = 0.1f;;
- m_Image.SetScale(m_fScale,m_fScale);
- Invalidate(FALSE);
- }
- void CGkbc8Dlg::OnLeftmove()
- {
- m_ptPos.x -=10;
- Invalidate(FALSE);
- }
- void CGkbc8Dlg::OnRight()
- {
- m_ptPos.x +=10;
- Invalidate(FALSE);
- }
- void CGkbc8Dlg::OnUpmove()
- {
- m_ptPos.y -=10;
- Invalidate(FALSE);
- }
- void CGkbc8Dlg::OnDownmove()
- {
- m_ptPos.y +=10;
- Invalidate(FALSE);
- }
复制代码最后在OnPaint()中显示已经打开的图片 //双缓冲 绘图 CDC *pDC = GetDC(); CDC MemDC;MemDC.CreateCompatibleDC(pDC); CBitmap MemBp; CRect rc; GetClientRect(rc);MemBp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); MemDC.SelectObject(&MemBp);MemDC.FillSolidRect(0,0,rc.Width()-100,rc.Height(),RGB(255,255,255)); m_Image.DrawImage(&MemDC,m_ptPos.x,m_ptPos.y);pDC->BitBlt(0,0,rc.Width()-100,rc.Height(),&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBp.DeleteObject(); MemDC.DeleteDC(); ReleaseDC(pDC);
我们来演示实现的整个过程
|