В Классы для создания панелей и диалогов нужно добавить класс для создания меню? - страница 5

 

Накидал примерную схему класса Cmenu. 

menu bar - список верхнего уровня.  menu bar будет отображаться всегда в приложении. menu bar аналог:menu bar . menu bar производный от класса CArrayObj.

 

menu item - пункт меню. Может быть быть просто пунктом меню или выпадающим меню.

 

PopUpMenu - выпадающее меню. Может содержать несколько menu item. PopUpMenu производный от класса /*edited*/ CWndObj (/*original*/ CArrayObj)

Схема меню 1 

 
Пока так. 
 

При работе с ресурсами

Создание ресурса на основе файла

bool  ResourceCreate(
   const string      resource_name,       // имя ресурса
   const string      path                 // относительный путь к файлу
   );

и

Удаляет динамически созданный ресурс (освобождает занятую ресурсом память). 

bool  ResourceFree(
   const string  resource_name      // имя ресурса
   );

замечена некорректная работа объектов созданных на основе класса CPicture. При удалении динамически созданного ресурса объект на основе класса теряет картинку и отображает только рамку рисунка (оконтовку).

Хотя в справке обозначено:

Функция ResourceFree() позволяет разработчику mql5-программы управлять потреблением памяти при активной работе с ресурсами. Графические объекты, привязанные к удаляемому из памяти ресурсу, будут отображаться правильно и после его удаления.

Может кто уже с таким сталкивался? Пример будет позже.

 

Прикрепил эксперта. Схема работы:

  1. Объекту picture на базе класса CPicture назначается картинка dollar.bmp.
  2. Создаётся ресурс res_bmp из картинки объекта picture.
  3. Ресурс res_bmp записывается в массив данных.
  4. Массив данных обрабатывается.
  5. Из обработанного массива создается ресурс res_bmp_invert.
  6. Ресурс res_bmp_invert назначается в качестве картинки объекту picture.
  7. Удаляем созданные ресурсы и картинка из объекта picture ИСЕЗАЕТ!

    Хотя в справке обозначено:

    Функция ResourceFree() позволяет разработчику mql5-программы управлять потреблением памяти при активной работе с ресурсами. Графические объекты, привязанные к удаляемому из памяти ресурсу, будут отображаться правильно и после его удаления.


Файлы:
 

Оказывается неправильная работа с ресурсом, который был удален, наблюдается только в классе CPicture. Класс CBmpButton с удаленным ресурсом работает корректно.

Для демонстрации изменил эксперта: теперь в эксперте создаётся один объект на базе класса CPicture (рисунок для него dollar.bmp) и второй объект на базе класса CBmpButton (рисунок для него euro.bmp).

Файлы:
 

Уточняю схему для меню.

CmenuBar -  список меню верхнего уровня. CMenuPopUp выпадающее меню. CMenuItem пункт меню. Разделитель - реализации пока нет.

Декларация

class CMenu: public CWndObj

Заголовок

#include <Menu\Menu.mqh>

Для примера схема на основании меню Вид терминала MetaTrader5. Обновлённая схема:

Схема меню 2 

 
barabashkakvn:

Уточняю схему для меню.

CmenuBar -  список меню верхнего уровня. CMenuPopUp выпадающее меню. CMenuItem пункт меню. Разделитель - реализации пока нет.

Декларация

Заголовок

Для примера схема на основании меню Вид терминала MetaTrader5. Обновлённая схема:

 

Дык, а какже колбэки?

Ну отрисовать-то можно, но функционал как-то надо весить? 

Я, например, в МТ4 встраиваю менюху и в попапы... где-то так:

Menu integration 

DDL Properties 

Все в Winapi, коллбэки там же... 

 
elugovoy:

Дык, а какже колбэки?

Ну отрисовать-то можно, но функционал как-то надо весить? 

Через кастомные события.

В реализации на mql есть свои преимущества - код подойдет для маркета. 

 
komposter:

Через кастомные события.

...

Точно. Для каждого пункта меню CMenuItem будет генерироваться пользовательское событие. На основе примера MQL5\Experts\Examples\Controls\ControlsDialog.mqh:

//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
...
ON_EVENT(ON_CLICK,m_menu_item1,OnClickMenuItem1)
ON_EVENT(ON_CLICK,m_menu_item2,OnClickMenuItem2)
ON_EVENT(ON_CLICK,m_menu_item3,OnClickMenuItem3)
...
EVENT_MAP_END(CAppDialog)
 
barabashkakvn:

Точно. Для каждого пункта меню CMenuItem будет генерироваться пользовательское событие. На основе примера MQL5\Experts\Examples\Controls\ControlsDialog.mqh:

Круто будет! Поддерживаю задумку