gdiplus 水印_VS2010 使用GDI+创建图片水印的MFC程序

首先配置好VS2010 的GDIplus的环境:

http://www.hacktea8.com/read.php?tid-1489.html

创建文件对话框的函数:

【部分源码】

//定义文件打开的方式

CFileDialog fldlg(true,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"图像文件|*.jpg|*.gif|*.jpeg|*.png|*.bmp||");

if(fldlg.DoModal()==IDOK){

CString szText=fldlg.GetPathName();

m_FileName.SetWindowTextA(szText);

if(m_pBmp!=NULL){

//delete m_pBmp; new delete 成对出现 申请/释放

m_pBmp=NULL;

}

m_pBmp=Bitmap::FromFile(szText.AllocSysString());

Color bkClr(0,0,0);

HBITMAP hBmp;

m_pBmp->GetHBITMAP(bkClr,&hBmp);

m_ImageDemo.SetBitmap(hBmp);

szText.ReleaseBuffer();

创建GDI+水印效果的函数

【部分源码】

UpdateData();

CString szText;

m_WaterText.GetWindowTextA(szText);

if(!szText.IsEmpty()&&m_pBmp!=NULL){

Graphics *pGraph=Graphics::FromImage(m_pBmp);

Brush *pBrush=new SolidBrush(Color(255,0,0));

Gdiplus::Font *pFont=new Gdiplus::Font(L"Arial",12);

PointF ptf;

ptf.X=m_OriginX;

ptf.Y=m_OriginY;

//确定字符长度

int nLen=MultiByteToWideChar(CP_ACP,0,szText,-1,NULL,0);

//在位图中输入字符串

pGraph->DrawString(szText.AllocSysString(),nLen,pFont,ptf,pBrush);

szText.ReleaseBuffer();

Color clr;

HBITMAP hBmp,hOldBmp;

m_pBmp->GetHBITMAP(clr,&hBmp);

hOldBmp=m_ImageDemo.SetBitmap(hBmp);

if(hOldBmp){

DeleteObject(hOldBmp);

}

delete pBrush;

delete pFont;

注:本人在做的时候遇到编译器兼容性问题【Debug和release 两个一个可以编译,而Debug不可以编译】

所有输出均为最新。

1> WaterPictureDlg.cpp

1>d:\dev\vcdemo\waterpicture\waterpicture\waterpicturedlg.cpp(208): error C2660: “Gdiplus::GdiplusBase::operator new”: 函数不接受 3 个参数

1>d:\dev\vcdemo\waterpicture\waterpicture\waterpicturedlg.cpp(209): error C2660: “Gdiplus::GdiplusBase::operator new”: 函数不接受 3 个参数

1>d:\dev\vcdemo\waterpicture\waterpicture\waterpicturedlg.cpp(211): warning C4244: “=”: 从“UINT”转换到“Gdiplus::REAL”,可能丢失数据

1>d:\dev\vcdemo\waterpicture\waterpicture\waterpicturedlg.cpp(212): warning C4244: “=”: 从“UINT”转换到“Gdiplus::REAL”,可能丢失数据

1>

1>生成失败。

1>

1>已用时间 00:00:00.15

========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

微软解决方法:

生成时使用 GDI+ 的 Microsoft 基础类 (MFC) 应用程序的调试版本,您可能会收到类似于以下错误消息:

错误 C2660: 新 Gdiplus::GdiplusBase::operator: 函数不带 3 个参数

原因

在调试版本中,MFC 定义预处理器扩展到的宏new运算符重载新运算符带有两个额外的参数。多余的参数是源文件名称和代码行号。MFC 可使用此信息对程序员在调试模式下时报告内存泄漏。这适用于的 MFC 类因为 MFC 提供的新接受多余的参数的重载。

但是,此扩展完成后由预处理器,因为它会影响所有使用new运算符。如果在项目中使用了任何非 MFC 类,其new运算符也会扩展,即使没有合适的新重载可用在该类中。在 GDI+ 中所发生的情况,因此,您会收到一个编译时错误消息。

替代方法

要解决此问题,请选择下列方法之一:

关闭预处理器扩展通过注释掉下面的源文件中的代码行:

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

注意: 此方法具有的缺点是不使用 MFC 中的功能,可帮助您跟踪内存分配和泄漏。

GDI+ 使用重载为提供新和删除运算符通过编写一些代码,接受并丢弃的附加参数。可以将下面的代码演示了此方法,其粘贴到新的头文件并包括新的头文件,而不是 Gdiplus.h 文件。

Ensure that GdiPlus header files work properly with MFC DEBUG_NEW and STL header files.

#define iterator _iterator

#ifdef _DEBUG

namespace Gdiplus

{

namespace DllExports

{

#include

};

#ifndef _GDIPLUSBASE_H

#define _GDIPLUSBASE_H

class GdiplusBase

{

public:

void (operator delete)(void* in_pVoid)

{

DllExports::GdipFree(in_pVoid);

}

void* (operator new)(size_t in_size)

{

return DllExports::GdipAlloc(in_size);

}

void (operator delete[])(void* in_pVoid)

{

DllExports::GdipFree(in_pVoid);

}

void* (operator new[])(size_t in_size)

{

return DllExports::GdipAlloc(in_size);

}

void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine)

{

return DllExports::GdipAlloc(nSize);

}

void operator delete(void* p, LPCSTR lpszFileName, int nLine)

{

DllExports::GdipFree(p);

}

};

#endif // #ifndef _GDIPLUSBASE_H

}

#endif // #ifdef _DEBUG

#include

#undef iterator

Ensure that Gdiplus.lib is linked.

#pragma comment(lib, "gdiplus.lib")

【http://support.microsoft.com/kb/317799 微软原文】

源码如下:

WaterPicture

原文:http://www.hacktea8.com/read.php?tid-1493-ds-1.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 MFC使用 GDI+ 将 PNG 图像显示到指定的矩形区域中,可以按照以下步骤进行操作: 1. 在头文件中包含 GDI+ 库: ``` #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus; ``` 2. 在 MFC 对话框的 OnInitDialog 函数中初始化 GDI+: ``` GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); ``` 3. 加载 PNG 图像并创建 GDI+ 的 Image 对象: ``` Image* pImage = Image::FromFile(L"test.png", FALSE); ``` 4. 获取指定矩形区域的设备上下文(DC): ``` CRect rect; GetDlgItem(IDC_STATIC_IMAGE)->GetClientRect(rect); CDC* pDC = GetDlgItem(IDC_STATIC_IMAGE)->GetDC(); ``` 5. 创建 GDI+ 的 Graphics 对象,并将其绑定到 DC 上: ``` Graphics graphics(pDC->GetSafeHdc()); ``` 6. 将 PNG 图像绘制到指定矩形区域中: ``` graphics.DrawImage(pImage, rect.left, rect.top, rect.Width(), rect.Height()); ``` 7. 释放 GDI+ 相关资源: ``` delete pImage; GdiplusShutdown(gdiplusToken); ``` 完整代码示例: ``` #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus; ... BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化 GDI+ GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 加载 PNG 图像并创建 Image 对象 Image* pImage = Image::FromFile(L"test.png", FALSE); // 获取指定矩形区域的 DC CRect rect; GetDlgItem(IDC_STATIC_IMAGE)->GetClientRect(rect); CDC* pDC = GetDlgItem(IDC_STATIC_IMAGE)->GetDC(); // 创建 Graphics 对象,并将其绑定到 DC 上 Graphics graphics(pDC->GetSafeHdc()); // 将 PNG 图像绘制到指定矩形区域中 graphics.DrawImage(pImage, rect.left, rect.top, rect.Width(), rect.Height()); // 释放资源 delete pImage; GdiplusShutdown(gdiplusToken); return TRUE; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值