Панель диалога + CCanvas. Динамически менять размер.

 

Вот такая проблема: канвас создаётся, добавляется к панели диалога. Но вот впоследствии менять размер канваса не выходит. 

Канвас создаю так:

  • сначала создание канваса методом Create
  • затем создание объекта класса CBmpButton
  • и устанавливаю для объекта класс CBmpButton канвас в качестве изображения (метод BmpOnName)
Изменять размеры канваса пытаюсь при помощи метода Resize, но после первого же применения метода свойства канваса (ширина и высота) становятся нулевыми. Это, собственно, и есть проблема.

 
а что дебаг говорит?

может он на

//--- error - destroy object
   Destroy();


вываливает из resize?
 
o_O:
а что дебаг говорит?

Говорит о том, что если канвас создан при помощи Create - то внутренний объект (в классе CCanvas) m_objname==NULL. Но, если создаём канвас при помощи CreateBitmapLabel или при помощи CreateBitmap, то объект m_objname будет заполнен и метод Resize отработает без ошибки.

//+------------------------------------------------------------------+
//| Resize                                                           |
//+------------------------------------------------------------------+
bool CCanvas::Resize(const int width,const int height)
  {
//--- check
   if(m_rcname!=NULL && width>0 && height>0)
      if(ArrayResize(m_pixels,width*height)>0)
        {
         m_width =width;
         m_height=height;
         //--- initialize data with zeros
         ArrayInitialize(m_pixels,0);
         //--- create dynamic resource
         if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format))
           {
            //--- bind object with resource
            if(m_objname!=NULL && ObjectSetString(m_chart_id,m_objname,OBJPROP_BMPFILE,m_rcname))
               return(true);
           }
        }
//--- error - destroy object
   Destroy();
   return(false);
  }

 

В итоге получается:

  • или можем создать канвас при помощи Create - но тогда m_objname==NULL и метод Resize вернёт false
  • или создаём канвас при помощи CreateBitmapLabel или CreateBitmap - но тогда не понятно как этот канвас добавить в панель диалогов...
 
Vladimir Karputov:

В итоге получается:

  • или можем создать канвас при помощи Create - но тогда m_objname==NULL и метод Resize вернёт false
  • или создаём канвас при помощи CreateBitmapLabel или CreateBitmap - но тогда не понятно как этот канвас добавить в панель диалогов...
именно.

в ветке тестирования CGraphic я уже упоминал этот недостаток проектироваки канваса.

Поэтому придётся канвас отнаследовать и самому сделать правильную create.
 
o_O:
именно.

в ветке тестирования CGraphic я уже упоминал этот недостаток проектироваки канваса.

Поэтому придётся канвас отнаследовать и самому сделать правильную create.
Тогда уж и Create и Resize  переделать.
 
Vladimir Karputov:
Тогда уж и Create и Resize  переделать.
или еще вариант - не трогать Resize.

просто помнить про это поведение и всегда делать Create для нового размера
 

Build 1550. В класс CCanvas внесены изменения.

//+------------------------------------------------------------------+
//| Resize                                                           |
//+------------------------------------------------------------------+
bool CCanvas::Resize(const int width,const int height)
  {
//--- check
   if(m_rcname!=NULL && width>0 && height>0)
      if(ArrayResize(m_pixels,width*height)>0)
        {
         m_width =width;
         m_height=height;
         //--- initialize data with zeros
         ArrayInitialize(m_pixels,0);
         //--- create dynamic resource
         if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format))
           {
            //--- bind object with resource
            if(m_objname!=NULL && ObjectSetString(m_chart_id,m_objname,OBJPROP_BMPFILE,m_rcname))
               return(true);
           }
        }
//--- error
   return(false);
  }

‌а было так:

//+------------------------------------------------------------------+
//| Resize                                                           |
//+------------------------------------------------------------------+
bool CCanvas::Resize(const int width,const int height)
  {
//--- check
   if(m_rcname!=NULL && width>0 && height>0)
      if(ArrayResize(m_pixels,width*height)>0)
        {
         m_width =width;
         m_height=height;
         //--- initialize data with zeros
         ArrayInitialize(m_pixels,0);
         //--- create dynamic resource
         if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format))
           {
            //--- bind object with resource
            if(m_objname!=NULL && ObjectSetString(m_chart_id,m_objname,OBJPROP_BMPFILE,m_rcname))
               return(true);
           }
        }
//--- error - destroy object
   Destroy();

   return(false);
  }

‌Теперь пример из первого поста работает - позволяет менять размер канваса на панели диалога:

Test Resize Panel

Причина обращения: