我用Windows 2000+VC6.0的平台
我现在要处理多付JPG图象,我自己定义了一个类用来生成Bitmap*对象.构造函数定义如下:
MyPhoto::MyPhoto(CString stringOpenFileName)
{
    fileName=stringOpenFileName;
if(fileName!="")
{
  Bitmap Ori_photo(ToWChar(fileName.GetBuffer(fileName.GetLength())));
  INT iWidth=Ori_photo.GetWidth();
  INT iHeight=Ori_photo.GetHeight();
//photo和 iphoto都是MyPhoto的成员变量,类型为Bitmap *
  photo=Ori_photo.Clone(0,0,iWidth,iHeight,PixelFormatDontCare);
  iphoto=photo->Clone(0,0,iWidth,iHeight,PixelFormatDontCare); }
}
可是当我处理第二张图象时,发现Ori_photo对象失效,它一直占用着内存.
请问该怎么办??
我是基于对话框的工程,是不是要发送一个消息来关闭它,我不知道怎么办!!!!
为什么我不能用
  Bitmap mybitmap=new Bitmap("filename");
构造Bitmap 对象?

解决方案 »

  1.   

    我经常使用gdi+,从来没有遇到问题,你的问题有点奇怪,估计错误在其它原因,
    Bitmap *pmybitmap = new Bitmap("unicode_filename");
    注意你的指针写法!!!上面的问题不应该存在
      

  2.   

    我一用下面这种方式定义,编译就不然通过
    Bitmap *pmybitmap = new Bitmap("unicode_filename");
    我的平台是windows2000+VC6.0
    是不是配置有问题??
      

  3.   

    我在StdAfx.h中加入如下申明:
    #ifndef ULONG_PTR
    #define ULONG_PTR unsigned long*
    #endif#include "Gdiplus.h"
    #pragma comment(lib,"GdiPlus.lib")
    using namespace Gdiplus;
    是不是还要引入其他空间名?我以前在视图/文档结构中用得很顺手的,我想问题应该出在析够函数中,可能是对话框的管理方式的差异吧!
    HELP ME!!!
      

  4.   

    我设置了一个临时工作文件:TEMPFILE(是待处理文件的副本)
    现在的问题是:第一次打开TEMPFILE后,我即使删除了处理好的对象,但并没有释放对TEMPFILE的控制权,第二个文件的副本不能生成,导致new Myphoto(TEMPFILE)时出错,请大家帮忙来看看.
      

  5.   

    关于new操作符的问题实际上是MS的BUG,解决方法如下:
    -----------------------------------------------------------
    // QGdiPlus.h: interface for the QGdiPlus class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_QGDIPLUS_H__AFE8336A_F370_4687_904E_60D117BCBE45__INCLUDED_)
    #define AFX_QGDIPLUS_H__AFE8336A_F370_4687_904E_60D117BCBE45__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000// ------------------------------------------------------------ [11/14/2003]
    // Some Macro and definitions of GdiPlus environment#define iterator _iterator#ifdef _DEBUGstatic int nGdiPlusObjects = 0;namespace Gdiplus
    {
    namespace DllExports
    {
    #include <GdiplusMem.h>
    };

    #ifndef _GDIPLUSBASE_H
    #define _GDIPLUSBASE_H
    class GdiplusBase
    {
    public:
    void (operator delete)(void* in_pVoid)
    {
    nGdiPlusObjects--;
    DllExports::GdipFree(in_pVoid);
    }

    void* (operator new)(size_t in_size)
    {
    nGdiPlusObjects++;
    return DllExports::GdipAlloc(in_size);
    }

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

    void* (operator new[])(size_t in_size)
    {
    nGdiPlusObjects++;
    return DllExports::GdipAlloc(in_size);
    }

    void * (operator new)(size_t nSize, LPCSTR /*lpszFileName*/, int /*nLine*/)
    {
    nGdiPlusObjects++;
    return DllExports::GdipAlloc(nSize);
    }

    void operator delete(void* p, LPCSTR /*lpszFileName*/, int /*nLine*/)
    {
    nGdiPlusObjects--;
    DllExports::GdipFree(p);
    }

    };
    #endif // #ifndef _GDIPLUSBASE_H
    }
    #endif // #ifdef _DEBUG
    // ------------------------------------------------------------ [11/14/2003]
    // an assistant class of GdiPlus environment#include <gdiplus.h>#ifdef _MFC_VER
    #include <afx.h>
    #endif
    #undef iterator//using namespace Gdiplus; // must know well this namespace may conflict with some stl definitions
    #pragma comment (lib, "Gdiplus.lib")class QGdiPlus  
    {
    public:
    QGdiPlus(): m_Token(0) { Gdiplus::GdiplusStartupInput input; Gdiplus::GdiplusStartup(& m_Token, & input, NULL); }
    ~QGdiPlus()
    {
    Gdiplus::GdiplusShutdown(m_Token);
    #ifdef _DEBUG
    #ifdef _MFC_VER
    if (nGdiPlusObjects > 0)
    afxDump << _T(">>> GdiPlus Memory Leaks: ") << nGdiPlusObjects << _T(" objects! <<<\n");
    else if (nGdiPlusObjects < 0)
    afxDump << _T(">>> GdiPlus Multiple Deletes: ") << -nGdiPlusObjects << _T(" objects! <<<\n");
    #endif
    #ifdef _ATL_VER
    if (nGdiPlusObjects > 0)
    ATLTRACE2(_T(">>> GdiPlus Memory Leaks: %d objects! <<<\n"), nGdiPlusObjects);
    else if (nGdiPlusObjects < 0)
    ATLTRACE2(_T(">>> GdiPlus Multiple Deletes: %d objects! <<<\n"), -nGdiPlusObjects);
    #endif
    #endif
    }
    private:
    // The token we get from GDI+
    ULONG_PTR m_Token;
    };#endif // !defined(AFX_QGDIPLUS_H__AFE8336A_F370_4687_904E_60D117BCBE45__INCLUDED_)
    ----------------------------------------
    将上述代码保存成.h文件加入Project,然后在App类中从QGdiplus派生对象作为成员变量即可完成gdi+初始化以及new问题。
      

  6.   

    谢谢CADINFO:
    让我对GDI+又回复了信心!在APP中我是这样初始化:
      GdiplusStartup(&gdiplusToken, &m_gdiplusStartupInput, NULL);
    以下为关闭:
      GdiplusShutdown(gdiplusToken);
    是分别在前面加一个Q吗?我在工程中加入QGdiplus.h后,编译出错:
    e:\wanjie\三人组集成_1215\qgdiplus.h(26) : fatal error C1083: Cannot open include file: 'GdiplusMem.h': No such file or directory
    MyPhoto.cpp
    e:\wanjie\三人组集成_1215\qgdiplus.h(26) : fatal error C1083: Cannot open include file: 'GdiplusMem.h': No such file or directory
    Error executing cl.exe.
    第26行代码为: #include <GdiplusMem.h>
    可是,我的GdiplusMem.h文件已经包含在当前目录下
    扑通,扑通!我扑通了