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 <GdiplusMem.h>
};
#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 <gdiplus.h>
#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
轉載于:https://www.cnblogs.com/zhongbin/archive/2013/01/26/2877840.html
總結
以上是生活随笔為你收集整理的VS2010 使用GDI+创建图片水印的MFC程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSPF 多进程实验(1)
- 下一篇: 陶哲轩实分析习题9.1.1