在MFC里使用GDI+
来源:互联网 发布:无钢圈内衣知乎 编辑:程序博客网 时间:2024/05/03 23:11
正在做与这方面相关的,记录下来方便以后学习。
1. 在"stdafx.h"里加入以下:
#include <gdiplus.h>using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
2. 为CWinApp的派生类增加两个成员:
ULONG_PTR m_gdiplusToken;
GdiplusStartupInput m_gdiplusStartupInput;
3. 在该派生类的InitInstance()函数中加入
GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
4. 在该派生类的ExitInstance()函数中加入
GdiplusShutdown(m_gdiplusToken);
5. 到此,基本上已经可以用了,例如:
Graphics g(this->GetSafeHwnd(),TRUE);
Pen myPen(Color::Red,50);
myPen.SetWidth(20);
g.DrawLine(&myPen,50, 50, 145, 365);
6. 但是,假如你用以下代码却不能编译通过:
Graphics g(this->GetSafeHwnd(),TRUE);
Pen* myPen = new Pen(Color::Red,50);
g.DrawLine(myPen,50, 50, 145, 365);
提示
error C2660: “Gdiplus::GdiplusBase::operator new” : 函数不接受 3 个参数
的错误。
7. 要解决此问题,需参考微软的文章,全文如下:
PRB: Microsoft Foundation Classes DEBUG_NEW Does Not Work with GDI+
Article ID : 317799
Last Review : February 12, 2007
Revision : 2.1
This article was previously published under Q317799
SYMPTOMS
When you build a debug version of a Microsoft Foundation Classes (MFC) application that uses GDI+, you may receive an error message that resembles the following:
error C2660: 'Gdiplus::GdiplusBase::operator new' : function does not take 3 parameters
CAUSE
In debug builds, MFC defines a preprocessor macro that expands the new operator to an overloaded new operator that takes two extra parameters. The extra parameters are the source file name and code line number. MFC can use this information to report memory leaks to the programmer when in debug mode. This works for MFC classes because MFC provides overloads for new that accept the extra parameters.
However, because this expansion is done by the preprocessor, it affects all usage of the new operator. If any non-MFC classes are used in the project, their new operator is also expanded, even if no suitable overload of new is available in that class. This is what happens in GDI+, and as a result, you receive a compile-time error message.
WORKAROUND
To work around this problem, choose one of the following methods:
" Turn off the preprocessor expansion by commenting out the following lines of code in the source file:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
NOTE: This method has the disadvantage of not using features in MFC that help you track memory allocations and leaks.
" Provide GDI+ with overloads for new and delete operators by writing some code that accepts and discards the additional parameters. You can paste the following code, which demonstrates this approach, into a new header file and include the new header file instead of the Gdiplus.h file.
//// 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://blog.sina.com.cn/s/blog_4f91596001008otf.html
0 0
- 在MFC里使用GDI+
- 在MFC里使用GDI+
- 在MFC里使用GDI+
- (GDI+) 如何在 MFC 或 Win32 应用程序中使用GDI+
- 如何在MFC中使用GDI+技术
- 如何在VC6 MFC中使用GDI+
- MFC使用GDI+,在对话框中的设置
- 如何在MFC中使用GDI+技术
- TRACE在MFC里使用
- vc里使用GDI+
- vc里使用GDI+
- MFC 使用 GDI+
- C++MFC使用GDI+
- mfc GDI+ 使用 一
- MFC中使用GDI+
- 如何在VS2005中使用GDI+ - [MFC 编程笔记]
- Gdi+在MFC中的初始化
- MFC使用GDI+编程基础
- Android Notification通知栏设计指南
- ListView反弹
- PHP time() 函数
- 修改SrollView嵌套下的整个layout背景色
- mybatis xml中是sql语句报错: Error creating document instance. Cause: org.xml.sax.SAXParseException: The
- 在MFC里使用GDI+
- WINCE中SDIO接口WiFi驱动控制注册表项
- myeclipse不编译JAVA文件解决方法
- php支持mysql
- 排序6:交换排序(快速排序)
- PX DP SP
- C# 编码约定
- ArrayList源码
- 编写一个脚本,统计log文件中首个单词出现的次数