C++MFC使用GDI+

来源:互联网 发布:软件培训班学费 编辑:程序博客网 时间:2024/06/11 02:13
1. 在"stdafx.h"里加入以下:
#include<gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
 
2. 为CWinApp的派生类增加两个成员:
ULONG_PTRm_gdiplusToken;
GdiplusStartupInput m_gdiplusStartupInput;
 
3. 在该派生类的InitInstance()函数中加入
GdiplusStartup(&m_gdiplusToken,&m_gdiplusStartupInput, NULL);
 
4. 在该派生类的ExitInstance()函数中加入
GdiplusShutdown(m_gdiplusToken);
 
5. 到此,基本上已经可以用了,例如:
Graphicsg(this->GetSafeHwnd(),TRUE);
Pen myPen(Color::Red,50);
myPen.SetWidth(20);
g.DrawLine(&myPen,50, 50, 145, 365);
 
6. 但是,假如你用以下代码却不能编译通过:
Graphicsg(this->GetSafeHwnd(),TRUE);
Pen* myPen = newPen(Color::Red,50);
g.DrawLine(myPen,50, 50, 145, 365);
提示
errorC2660: “Gdiplus::GdiplusBase::operator new” : 函数不接受 3个参数
的错误。
 
7. 要解决此问题,需参考微软的文章,全文如下:

PRB:Microsoft Foundation Classes DEBUG_NEW Does Not Work withGDI+
ArticleID 317799
Last Review February 12,2007
Revision 2.1

 

This article was previously published underQ317799

 

SYMPTOMS
When you build a debug version of a Microsoft Foundation Classes(MFC) application that uses GDI+, you may receive an error messagethat resembles the following:
error C2660: 'Gdiplus::GdiplusBase::operatornew' : function does not take 3 parameters

 

CAUSE
In debugbuilds, MFC defines a preprocessor macro that expands the newoperator to an overloaded new operator that takes two extraparameters. The extra parameters are the source file name and codeline number. MFC can use this information to report memory leaks tothe programmer when in debug mode. This works for MFC classesbecause MFC provides overloads for new that accept the extraparameters.

However, because this expansion is done by thepreprocessor, it affects all usage of the new operator. If anynon-MFC classes are used in the project, their new operator is alsoexpanded, even if no suitable overload of new is available in thatclass. This is what happens in GDI+, and as a result, you receive acompile-time error message.

 

WORKAROUND
To workaround this problem, choose one of the followingmethods:


Turn off the preprocessor expansion bycommenting out the following lines of code in the sourcefile:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


NOTE: This method has the disadvantage of notusing features in MFC that help you track memory allocations andleaks.


Provide GDI+ with overloads for new and deleteoperators by writing some code that accepts and discards theadditional parameters. You can paste the following code, whichdemonstrates this approach, into a new header file and include thenew header file instead of the Gdiplus.h file.

 

//// Ensure that GdiPlus header files workproperly 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)
   {
    returnDllExports::GdipAlloc(in_size);
   }

 

   void(operator delete[])(void* in_pVoid)
   {
    DllExports::GdipFree(in_pVoid);
   }

 

   void*(operator new[])(size_t in_size)
   {
    returnDllExports::GdipAlloc(in_size);
   }

 

   void* (operator new)(size_t nSize, LPCSTR lpszFileName, intnLine)
   {
    returnDllExports::GdipAlloc(nSize);
   }

 

   voidoperator 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")

 
原创粉丝点击