Вызов меню свойств индикатора.

 
Кто-нибудь знает, как вызвать средствами API свойства конкретного индикатора или эксперта?
 
PostMessageA(WindowHandle(Symbol(), Period()), WM_COMMAND, 33048,0);  // вызов свойств эксперта
 

Спасибо!

А индикатора? :-)

 

Список индикаторов представляет собой TreeView элемент (иерархическое дерево). Доступ к узлам с помощью WinAPI возможен.

Однако из-за отсутствия поддержки структур в MQL4 получить информацию об узле дерева (н-р, текст) невозможно. Соответственно

нет возможности определить какой индикатор закреплен за каждым узлом.


Задача реализуема, если точно известно, в какой позиции списка (с учетом названия подокон) находится интересуемый индикатор.


P.S. Вызов окна "Список индикаторов"

PostMessageA(WindowHandle(Symbol(),Period()),WM_COMMAND,35419,0);
 
Ilnur писал (а) >>

Список индикаторов представляет собой TreeView элемент (иерархическое дерево). Доступ к узлам с помощью WinAPI возможен.

Однако из-за отсутствия поддержки структур в MQL4 получить информацию об узле дерева (н-р, текст) невозможно. Соответственно

нет возможности определить какой индикатор закреплен за каждым узлом.


Задача реализуема, если точно известно, в какой позиции списка (с учетом названия подокон) находится интересуемый индикатор.


P.S. Вызов окна "Список индикаторов"


Спасибо! Вы очень любезны!

Есть три вопроса:

1. Как это сделать, если всё известно?

2. Может выложите или на почту все коды пришлёте? :-) Весьма ценная информация!

3. Научите, как их самому получать без катастрофических последствий?

 
Zhunko писал (а) >>

Спасибо! Вы очень любезны!

Есть три вопроса:

1. Как это сделать, если всё известно?

2. Может выложите или на почту все коды пришлёте? :-) Весьма ценная информация!

 
// Вызов окна свойств конкретного индикатора.
 
#property show_inputs
 
#include <WinUser32.mqh>
 
extern int iPosition = 1; //номер позиции индикатора в списке (с учетом названия подокон)
 
#import "user32.dll"
    int GetParent(int hWnd);
    int GetLastActivePopup(int hWnd);
    int GetDlgItem(int hDlg, int nIDDlgItem);
#import
 
#define VK_HOME 0x24
#define VK_DOWN 0x28
 
#define TVM_GETCOUNT 0x1105
 
// Возвращает дескриптор основного окна терминала
int GetOwnedWindow()
{
    int hWnd = WindowHandle(Symbol(),Period());
    int hOwnedWnd = 0;
 
    while(!IsStopped())
    {
        hWnd = GetParent(hWnd);
        if(hWnd==0) break;
        hOwnedWnd = hWnd;
    }
 
    return(hOwnedWnd);
}
 
// Вызывает окно "Список индикаторов" и возвращает его дескриптор 
int GetListDialog(int hOwnedWnd)
{
    int hDlgWnd;
 
    PostMessageA(hOwnedWnd,WM_COMMAND,35419,0); //вызываем окно "Список индикаторов"
    Sleep(200);
    hDlgWnd = GetLastActivePopup(hOwnedWnd); //определяем дескриптор
 
    return(hDlgWnd);
}
 
//+------------------------------------------------------------------+
//| Основная функция скрипта                                              |
//+------------------------------------------------------------------+
int start()
{
    int hParent, hDlg, hTree;
    int nTreeCount;
 
    hParent = GetOwnedWindow(); //получаем дескриптор основного окна терминала
 
    if(hParent!=0)
    {
        hDlg = GetListDialog(hParent); //вызываем окно "Список индикаторов"
        hTree = GetDlgItem(hDlg,0x48C); //находим список индикаторов
    
        nTreeCount = SendMessageA(hTree,TVM_GETCOUNT,0,0); //определяем длину списка
    
        PostMessageA(hTree,WM_KEYDOWN,VK_HOME,0); //верхняя строка списка
        for(int i=1; i<nTreeCount; i++) //перебираем весь список
        {
            PostMessageA(hTree,WM_KEYDOWN,VK_DOWN,0); //смещаемся на следующую позицию списка
            if(iPosition==i) //достигли позиции интересуемого индикатора
            {
                PostMessageA(hDlg,WM_COMMAND,0x48B,GetDlgItem(hDlg,0x48B)); //вызываем окно свойств
                break; //прерываем цикл
            }
        }
    }
 
    return(0);
}

3. Научите, как их самому получать без катастрофических последствий?

Что конкретно Вас интересует?

 

Большое СПАСИБО за пример использования фукций из "user32.dll"!!!

Имел ввиду, как получить коды команд API МТ4?

PostMessageA(handle,WM_COMMAND,?????,0);
Там, где знаки вопросов.
 
Zhunko писал (а) >>

Большое СПАСИБО за пример использования фукций из "user32.dll"!!!

Имел ввиду, как получить коды команд API МТ4?

Там, где знаки вопросов.

Наверно нужно поискать немного:

'research по теме кодов к PostMessageA'

 
Itso писал (а) >>

Наверно нужно поискать немного:

'research по теме кодов к PostMessageA'

Это у меня в коллекции есть. Могли бы заметить мою благодарность автору в той теме.

Ilnur выкладывает команды, которых нет в том списке.

 

Со скриптом разобрался.

Интересно, что подокно в списке индикаторов тоже является элементом списка.

Ilnur, я понял, что способа работать с именем индикатора в этом списке нет?

Однозначно нет или, что-нибудь можно придумать?

 

Ещё один вопрос.

Как переинициализировать все индикаторы окна за один раз?

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