QQ登录

只需一步,快速开始

149上位机VC MFC使用GDI+拖拽打开图片

[ 复制链接 ]

149上位机VC MFC使用GDI+拖拽打开图片

149上位机VC MFC使用GDI+拖拽打开图片

149上位机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,只有几个函数,快速实现图片拖拽打开保存:首先是将此类加入自已的工程当中;
添加变量CGdiPlusImagem_Image; CPoint m_ptPos;

拖拽打开图片,保存图片两按钮控件关联变量
  1. void CGkbc8Dlg::OnOpen()
  2. {
  3.         CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,NULL, this);  
  4.         dlg.m_ofn.lpstrFilter=TEXT("图像文件*.jpg;*.bmp;*.png;\0*.jpg;*.bmp;*.png\0\0");
  5.         if(dlg.DoModal() == IDOK)  
  6.         {  
  7.                 if( !m_Image.LoadImage(dlg.GetPathName()) )
  8.                 {
  9.                         AfxMessageBox(TEXT("加载资源失败!"));
  10.                         return;
  11.                 }
  12.                 CRect rcClient;
  13.                 GetClientRect(&rcClient);
  14.         
  15.                 m_ptPos.x = (rcClient.Width()-m_Image.GetWidth())/2;
  16.                 m_ptPos.y = (rcClient.Height()-m_Image.GetHeight())/2;
  17.                 float fScale = 1.0f;
  18.                 int nAngle = 0;
  19.                 m_Image.SetRotation(nAngle);
  20.                 m_Image.SetScale(fScale,fScale);
  21.         
  22.                 Invalidate();
  23.         }
  24.         
  25. }
复制代码
  1. void CGkbc8Dlg::OnSave()
  2. {
  3.         CString strFilter;
  4.         strFilter = TEXT("位图文件|*.bmp|JPEG 图像文件|*.jpg| GIF 图像文件|*.gif|PNG 图像文件|*.png||");
  5.         
  6.         CFileDialog dlg(FALSE,NULL,NULL,NULL,strFilter);
  7.         if ( IDOK != dlg.DoModal()) return;

  8.         CString strFileName;
  9.         CString strExtension;

  10.         strFileName = dlg.m_ofn.lpstrFile;

  11.         switch (dlg.m_ofn.nFilterIndex)
  12.         {
  13.         case 1:
  14.                 strExtension = TEXT("bmp"); break;
  15.         case 2:
  16.                 strExtension = TEXT("jpeg"); break;
  17.         case 3:
  18.                 strExtension = TEXT("gif"); break;
  19.         case 4:
  20.                 strExtension = TEXT("png"); break;
  21.         default:
  22.                 break;
  23.         }
  24.         strFileName = strFileName + TEXT('.') + strExtension;

  25.         CString sFormat("image/");
  26.         sFormat+=strExtension;
  27.         bool hResult = m_Image.Save(strFileName,sFormat.AllocSysString());
  28.         if ( !hResult )
  29.                 MessageBox(TEXT("保存图像文件失败!"));
  30. }
复制代码
  1. 在OnPaint() 中显示已经打开的图片
  2.                 //双缓冲 绘图
  3. CDC *pDC = GetDC(); CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap MemBp; CRect rc;
  4. GetClientRect(rc); MemBp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
  5. MemDC.SelectObject(&MemBp); MemDC.FillSolidRect(0,0,rc.Width()-100,rc.Height(),RGB(255,255,255));
  6. m_Image.DrawImage(&MemDC,m_ptPos.x,m_ptPos.y); pDC->BitBlt(0,0,rc.Width()-100,rc.Height(),&MemDC,0,0,SRCCOPY);
  7. //绘图完成后的清理
  8. MemBp.DeleteObject();  MemDC.DeleteDC(); ReleaseDC(pDC);
复制代码
要使窗口支持图片的拖拽,窗口得具有WS_EX_ACCEPTFILES属性,初始化时添加一句;

然后是添加消息响应函数OnDropFiles();
  1. void CGkbc8Dlg::OnDropFiles(HDROP hDropInfo)
  2. {
  3.         UINT nCount;  
  4.     TCHAR szFilePath[MAX_PATH];  
  5.     nCount = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);  
  6.     if(nCount)  
  7.     {         
  8.         DragQueryFile(hDropInfo, nCount-1, szFilePath, sizeof(szFilePath));  
  9.     }  
  10.     DragFinish(hDropInfo);  
  11.     if( !m_Image.LoadImage(szFilePath) )  
  12.     {  
  13.         AfxMessageBox(TEXT("加载资源失败!"));  
  14.         return;  
  15.     }   
  16.     CRect rcClient;  
  17.     GetClientRect(&rcClient);  
  18.         float  fScale;//初始化变量  
  19.         int    nAngle;
  20.     m_ptPos.x = (rcClient.Width()-m_Image.GetWidth())/2;
  21.         m_ptPos.y = (rcClient.Height()-m_Image.GetHeight())/2;  
  22.     fScale = 1.0f;  
  23.     nAngle = 0;  
  24.     m_Image.SetRotation(nAngle); //恢复数据  
  25.     m_Image.SetScale(fScale,fScale);  
  26.     Invalidate(FALSE);  
  27.         CDialog::OnDropFiles(hDropInfo);
  28. }
复制代码

我们来演示实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:149.上位机VC MFC使用GDI 拖拽打开图片.rar 
文件大小:1.02 MB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索