工控编程吧
标题:
149上位机VC MFC使用GDI+拖拽打开图片
[打印本页]
作者:
qq263946146
时间:
2016-1-7 19:44
标题:
149上位机VC MFC使用GDI+拖拽打开图片
(, 下载次数: 0)
上传
点击文件名下载附件
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;
拖拽打开图片,保存图片两按钮控件关联变量
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;
float fScale = 1.0f;
int nAngle = 0;
m_Image.SetRotation(nAngle);
m_Image.SetScale(fScale,fScale);
Invalidate();
}
}
复制代码
void CGkbc8Dlg::OnSave()
{
CString strFilter;
strFilter = TEXT("位图文件|*.bmp|JPEG 图像文件|*.jpg| GIF 图像文件|*.gif|PNG 图像文件|*.png||");
CFileDialog dlg(FALSE,NULL,NULL,NULL,strFilter);
if ( IDOK != dlg.DoModal()) return;
CString strFileName;
CString strExtension;
strFileName = dlg.m_ofn.lpstrFile;
switch (dlg.m_ofn.nFilterIndex)
{
case 1:
strExtension = TEXT("bmp"); break;
case 2:
strExtension = TEXT("jpeg"); break;
case 3:
strExtension = TEXT("gif"); break;
case 4:
strExtension = TEXT("png"); break;
default:
break;
}
strFileName = strFileName + TEXT('.') + strExtension;
CString sFormat("image/");
sFormat+=strExtension;
bool hResult = m_Image.Save(strFileName,sFormat.AllocSysString());
if ( !hResult )
MessageBox(TEXT("保存图像文件失败!"));
}
复制代码
在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);
复制代码
要使窗口支持图片的拖拽,窗口得具有WS_EX_ACCEPTFILES属性,初始化时添加一句;
然后是添加消息响应函数OnDropFiles();
void CGkbc8Dlg::OnDropFiles(HDROP hDropInfo)
{
UINT nCount;
TCHAR szFilePath[MAX_PATH];
nCount = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
if(nCount)
{
DragQueryFile(hDropInfo, nCount-1, szFilePath, sizeof(szFilePath));
}
DragFinish(hDropInfo);
if( !m_Image.LoadImage(szFilePath) )
{
AfxMessageBox(TEXT("加载资源失败!"));
return;
}
CRect rcClient;
GetClientRect(&rcClient);
float fScale;//初始化变量
int nAngle;
m_ptPos.x = (rcClient.Width()-m_Image.GetWidth())/2;
m_ptPos.y = (rcClient.Height()-m_Image.GetHeight())/2;
fScale = 1.0f;
nAngle = 0;
m_Image.SetRotation(nAngle); //恢复数据
m_Image.SetScale(fScale,fScale);
Invalidate(FALSE);
CDialog::OnDropFiles(hDropInfo);
}
复制代码
我们来演示实现的整个过程
[iqiyi]http://player.video.qiyi.com/c0b304bbe6c53378d9342411df914b87/0/0/w_19rtdmiynx.swf-albumId=5149515409-tvId=5149515409-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4