how to modify the code to display bitmap

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 22/07/2007 at 01:52, xxxxxxxx wrote:

User Information:
Cinema 4D Version:    
Platform:      
Language(s) :   C.O.F.F.E.E  ;  C++  ;  XPRESSO  ;

---------
I want to render the object and display the progress with model.  but I have an little problem that  can't implement display the progress.  since  I am an newcome student about c4d,  how can I to modify the code section :   
AddUserArea( PREVIEW_AREA_ID, 0, m_bmp->GetBw(), m_bmp->GetBh());
AttachImage(PREVIEW_AREA_ID, m_bmp, 0);
this is my all code modifly after :
#ifndef   __RENDER__COMMON__H  
#define   __RENDER__COMMON__H
#include "c4d.h"
#include "c4d_symbols.h"
#include "c4d_general.h"
#include "c4d_baseobject.h"
class PreviewAreaBmp : public GeUserArea
{
 public: 
   AutoAlloc<BaseBitmap> m_pBmp;
   
 public:  // we only need to overload a few functions... 
  
  Bool Init(void)
  {
   BaseDocument* doc = GetActiveDocument();
   BaseContainer rdata = doc->GetActiveRenderData()->GetData();
   // initialize the bitmap 
   if( !m_pBmp || m_pBmp->Init( rdata.GetLong(RDATA_XRES), rdata.GetLong(RDATA_YRES) )!=IMAGE_OK )
   {
    return false;
   }
   return true;
  }

virtual Bool Init(LONG x, LONG y, LONG depth = 24)
  {
   // initialize the bitmap
   BaseDocument* doc = GetActiveDocument();
   BaseContainer rdata = doc->GetActiveRenderData()->GetData();
   if( !m_pBmp || m_pBmp->Init( x, y,depth ) != IMAGE_OK ) 
    return false;
           
   return true;
  }

virtual void Draw(LONG x1, LONG y1, LONG x2, LONG y2, LONG flag = 0 )
  {
   // if we have a valid bitmap, render it into the specified region
   if( m_pBmp )
   {
    DrawBitmap( m_pBmp, x1, y1, x2-x1, y2-y1, 0, 0, m_pBmp->GetBw(), m_pBmp->GetBh(), BMP_NORMALSCALED | BMP_ALLOWALPHA );
   }
   this->Redraw( TRUE);
  }
       virtual BaseBitmap* GetBitMap()
    {
     BaseBitmap* bmp = NULL;
     m_pBmp->CopyTo( bmp );
    
     return bmp;
    }
     
};
//////////////////////////////////////////////////////////////////////////////////////////////
class ModalRenderer : private GeModalDialog
{
private:
  BaseDocument* m_doc;
  BaseContainer m_rdata;
  String m_title;
   Bool m_showerrors;
   PreviewAreaBmp m_bmparea;
  Real m_p;
  LONG m_result;
  enum
  {
    SCROLL_GROUP_ID = 100000,
    PREVIEW_AREA_ID,
    DLGGROUP_ID,
    MAIN_GROUP_ID
  };
  class RenderThread : public Thread
  {
 private:
    ModalRenderer* m_dlg;
 public:
    RenderThread(ModalRenderer* dlg) : m_dlg(dlg) {}
    virtual ~RenderThread() { m_dlg = NULL; End(); Wait(FALSE); }
    virtual void Main()
    {
     if (!m_dlg) return;
     // Start render
     /*MessageDialog("SETP_ ThreadMain()!");*/
     LONG result =
     RenderDocument( m_dlg->m_doc,                    
        m_dlg->m_rdata,
        ProgressFunction,
        m_dlg,
        m_dlg->m_bmparea.m_pBmp,    
        m_dlg->m_showerrors,
        (BaseThread* )this->Get());
       
     if (m_dlg)
     {
      m_dlg->m_result = result;
     }
    }
    virtual const CHAR *GetThreadName(void)
    {
     char szThreadName[128]= {0};
     char *p = NULL;
     //GET THREAD NAME
     //RETURN
                    p = szThreadName;
     return p;
    }
 private:
    
   // Called by RenderDocument now and then
    static void ProgressFunction(Real p, void* dlg)
    {
     static_cast<ModalRenderer*>(dlg)->m_p = p;
    }
 } m_rt;
   
    friend class RenderThread;
public:
   ModalRenderer() :
      m_doc(NULL), 
      m_p(0.0),
      m_result(NOTOK),
      m_showerrors(TRUE),
      m_rt(this) { }
  
 
 virtual ~ModalRenderer()
 { 
   ShutdownThread();
 }
  // Render document 'doc' with settings 'rdata',
  // displaying a progress windows with 'title' and
  // optionally not showing error messages.
  Bool Render(BaseDocument* doc, const BaseContainer& rdata,
              const String& title = String(), Bool showerrors = TRUE)
  {
  if (!doc) return FALSE;
    
  if ( m_rt.IsRunning() )
  {   
   return FALSE;
  }
  
  m_doc = doc;
  m_rdata = rdata;
  m_title = title;
  m_showerrors = showerrors;
       
  Bool success = Open();
  
  ShutdownThread();
  return success && GetResult();
  }
//----------------------------------------------------------------------------------------------------
private:
    // Build the dialog
  virtual Bool CreateLayout()
  {
  if (!InitBitmap()) return FALSE;
   
  SetTitle(m_title);
  GroupBegin(MAIN_GROUP_ID, BFV_SCALEFIT | BFH_SCALEFIT, 1, 0, "", 0);
  {
   GroupSpace(4,4);
   ScrollGroupBegin(SCROLL_GROUP_ID, BFV_SCALEFIT | BFH_SCALEFIT,
      SCROLLGROUP_STATUSBAR | SCROLLGROUP_BORDERIN |
      SCROLLGROUP_NOBLIT);
   {
     //@@@@@@@@ at here is my modify,
    // I have been added  to class PreviewAreaBmp
   //but is fail from test@@@@@@@@@@@@*/

//AddUserArea( PREVIEW_AREA_ID, 0, m_bmp->GetBw(), m_bmp->GetBh());
   //AttachImage(PREVIEW_AREA_ID, m_bmp, 0);

AddUserArea( PREVIEW_AREA_ID, 0, m_bmparea.m_pBmp->GetBw(), m_bmparea.m_pBmp->GetBh());
     
            
    AttachUserArea( m_bmparea, PREVIEW_AREA_ID);
          
   }
   GroupEnd();
   AddDlgGroup(DLG_CANCEL);
  }
  GroupEnd();
  return TRUE;
  }
  // Init dialog and start render
  virtual Bool InitValues()
  {
  UpdatePreview();
  SetTimer(500);
  Bool success = TRUE;
  
  if (!m_rt.IsRunning())
  {
   
   success = m_rt.Start(TRUE);
  }
  return success;
  }
  // Ask if the render is running
  virtual Bool AskClose()
  {
    
  if (!m_rt.IsRunning()) return FALSE;
     return !QuestionDialog("Do you really want to abort the rendering?");
  }
  // Deal with close box and cancel button problems
  virtual LONG Message(const BaseContainer &msg, BaseContainer &result)
  {
  // Workaround for bad base class implementation
  if (msg.GetId() == BFM_ACTION &&
   msg.GetLong(BFM_ACTION_ID) == IDC_CANCEL)
  {
   return Command(IDC_CANCEL, msg);
  }
  else if (msg.GetId() == BFM_CHECKCLOSE)
  {
   return AskClose();
  }
  else
  {
   return GeModalDialog::Message(msg,result);
  }
  }
  // Check for cancel button
  virtual Bool Command(LONG id, const BaseContainer& msg)
  {
  if (id == IDC_CANCEL && !AskClose())
  {
   ShutdownThread();
   return Close(FALSE);
  }
  return FALSE;
  }
  // Run every 500 ms...
  virtual void Timer(const BaseContainer& msg)
  {
  UpdatePreview();
  UpdateStatus();
  CheckFinished();
  }

// Create preview bitmap
  Bool InitBitmap()
  {  
     m_bmparea.Init( m_rdata.GetLong(RDATA_XRES), m_rdata.GetLong(RDATA_YRES) );
     return true;
  }
  // Tell the preview to redraw itself
  void UpdatePreview()
  {
  //GetUserArea is error from compile
  /*GeUserArea* ua = GetUserArea(PREVIEW_AREA_ID);*/
    //if (ua) ua->Redraw(TRUE);
    m_bmparea.Draw( 0, 0, m_rdata.GetLong(RDATA_XRES),  m_rdata.GetLong(RDATA_YRES) );
    //m_bmparea.Redraw( TRUE );
    
 
  }
  // Set new statusline text
  void UpdateStatus()
  {
  String txt;
  if (m_p != 1.0)
  {
  txt = "Rendering: " + LongToString(m_p * 100) + "%";
  }
  else
  {
  txt = "Finished!";
  }
  BaseContainer msg(BFM_SETSTATUSBAR);
  msg.SetLong(BFM_STATUSBAR_PROGRESSON, TRUE);
  msg.SetString(BFM_STATUSBAR_TXT, txt);
  msg.SetReal(BFM_STATUSBAR_PROGRESS, m_p);
  SendMessage(SCROLL_GROUP_ID, msg);
  }
  // Wait until render thread is stopped
  void ShutdownThread()
  { 
   m_rt.End();
   m_rt.Wait(FALSE);
  }
  // Check if the render is finished
  void CheckFinished()
  {
   if (!m_rt.IsRunning())
  {
   Close(m_result == RAY_OK);
  }
  }

// Internal class with render thread
 
 
  // So that the internal class can access private variables
 
 
};
#endif
 
///////////////////////////////////////////////////////////////////////////////////////////////
void ModulRender()
{
 BaseDocument* doc = GetActiveDocument();
 BaseObject* null = doc->GetActiveObject();
  if (!null) return;
BaseContainer rdata = doc->GetActiveRenderData()->GetData();
BaseBitmap* bmp = BaseBitmap::Alloc();
bmp->Init(rdata.GetLong(RDATA_XRES),
    rdata.GetLong(RDATA_YRES));
RenderDocument(doc, rdata, NULL , NULL, bmp, TRUE , NULL);
bmp->Save( GeGetStartupPath() + "test_modul.jpg", FILTER_JPG, NULL, SAVEBIT_32b*tchANNELS);
 
ShowBitmap(bmp);
 BaseBitmap::Free( bmp );
ModalRenderer mr;
Bool success = mr.Render(doc, rdata, null->GetName(), TRUE);
 
  MessageDialog("Finish!");
}

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 22/07/2007 at 02:00, xxxxxxxx wrote:

note:  the originality data like this. from http://www.plugincafe.com/forum/display_topic_threads.asp?ForumID=4&TopicID=656&SearchPagePosition=1&search=ModalRenderer&searchMode=allwords&searchIn=Thread&forum=0&searchSort=dateDESC&ReturnPage=Search
private:
 BaseDocument* m_doc;
  BaseContainer m_rdata;
  String m_title;
  BaseBitmap* m_bmp;
  Bool m_showerrors;
 
  Real m_p;
  LONG m_result;
  enum
  {
    SCROLL_GROUP_ID = 100000,
    PREVIEW_AREA_ID,
    DLGGROUP_ID,
    MAIN_GROUP_ID
  };