Доступ к свойствам графика из скрипта...

 

Здравствуйте.


Мне хотелось бы сбросом скрипта (drag-n-drop) на график поменять некие свойства графика, обычно вызываемые по F8. В частности поставить и убрать галочку "Фиксировать масштаб".

Пытался найти в справке - ничего не нашел(( Возможно плохо искал... Гугл грит, что из скриптов нет возможности менять свойства графика вообще, НО! Я нашел скрипт (платный, в составе платной сборки) который при сбрасывании его на график - меняет цветовую схему с любой на Ч/Б. Значит это все таки возможно? Подскажите пожалуйста, как это сделать?


Спасибо.

 
нужно или WM_COMMAND отловить или эмуляцией клавиш
 
bank >>:
нужно или WM_COMMAND отловить или эмуляцией клавиш

А можно чуточку подробнее? Желательно с примером.... Я MQL только недавно начал изучать... и в основном по встроенной справке...


упоминания о WM_COMMAND в справке нету((

 
Fewbie >>:

А можно чуточку подробнее? Желательно с примером.... Я MQL только недавно начал изучать... и в основном по встроенной справке...


упоминания о WM_COMMAND в справке нету((


Тогда забудьте.

 
Fewbie >>:


упоминания о WM_COMMAND в справке нету((



это недокументированные команды

тогда сначала мкл изучать потом поиском по форуму смотреть

 
Fewbie >>:

А можно чуточку подробнее? Желательно с примером.... Я MQL только недавно начал изучать... и в основном по встроенной справке...


упоминания о WM_COMMAND в справке нету((


Можно примеры посмотреть здесь и здесь.

 
Talex >>:

Можно примеры посмотреть здесь и здесь.

Cупер! Большое спасибо! То что надо!


P.S. Правда у меня не работает((


Взял код из вышеприведеных ссылок.


#include <WinUser32.mqh>

//+------------------------------------------------------------------+
void start() {
int hwnd=WindowHandle(Symbol(),Period()),
htemp,hok,idcheck,max,min;
string name="12345";
//----
hwnd=GetAncestor(hwnd,2); // нашли главное окно
if (hwnd!=0) {
PostMessageA(hwnd,WM_COMMAND,33157,0); // открыли окно "Свойства" текущего графика
}
else {
Alert("Error :",GetLastError());
return;
}
hwnd=GetLastActivePopup(hwnd); // нашли хэндл окна "Свойства" текущего графика
htemp=GetWindow(hwnd,GW_CHILD); // нашли 1-ое дочернее окно
GetWindowTextA(htemp,name,6); // вытащили название окна

Alert("**************111************************");
Alert("hwnd :",hwnd);
Alert("htemp :",htemp);
Alert("hok :",hok);
Alert("idcheck :",idcheck);
Alert("name :",name);
Alert("**************222************************");

if(name!="Общие") { // сверили с тем, что нам надо
hok=GetDlgItem(hwnd,0x1); // нашли кнопку "OK"
SendMessageA(hok,BM_CLICK,0,0); // нажали кнопку "OK"

return;
}
idcheck=IsDlgButtonChecked(htemp,0x4EB); // получаем информацию о "положении" чекбокса


switch (idcheck)

{

case 0:

CheckDlgButton(htemp,0x4EB,1); // если выключен, то включаем

break;

case 1:

CheckDlgButton(htemp,0x4EB,0); // если включен, то выключаем

break;

}


//max=GetDlgItem(htemp,0x4E7); // нашли хэндл поля ввода максимума
//SendMessageA(max,WM_CLEAR,0,0); // послали сообщение очистить поле
//SetWindowTextA(max,"ВАШ_МАКСИМУМ"); // послали сообщение заполнить поле
//min=GetDlgItem(htemp,0x4E8); // нашли хэндл поля ввода максимума
//SendMessageA(min,WM_CLEAR,0,0); // послали сообщение очистить поле
//SetWindowTextA(min,"ВАШ_МИНИМУМ"); // послали сообщение заполнить поле
//hok=GetDlgItem(hwnd,0x1); // нашли кнопку "OK"
//SendMessageA(hok,BM_CLICK,0,0); // нажали кнопку "OK"
return;
}
//+------------------------------------------------------------------+

WinUser32.mqh взял из первой ссылки


При активации скрипт просто открывает окно свойств и больше ничего не делает...


полсе этого:

hwnd=GetLastActivePopup(hwnd); // нашли хэндл окна "Свойства" текущего графика
htemp=GetWindow(hwnd,GW_CHILD); // нашли 1-ое дочернее окно
GetWindowTextA(htemp,name,6); // вытащили название окна


переменная name принимает значение "Для с"


код

if (name!="Общие") { // сверили с тем, что нам надо
hok=GetDlgItem(hwnd,0x1); // нашли кнопку "OK"
SendMessageA(hok,BM_CLICK,0,0); // нажали кнопку "OK"
}

не срабатывает, кнопка "ОК" не нажимается...

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

в журнале:

2009.11.16 00:29:49 Script ScaleOnOff AUDUSD,H1: removed
2009.11.16 00:29:49 Script ScaleOnOff AUDUSD,H1: loaded successfully


Что я не правильно делаю?

 
Ау? народ? ну помогите плиз...
 
#include <WinUser32.mqh>

//+------------------------------------------------------------------+
void start() {
   int hwnd=WindowHandle(Symbol(),Period()),
       htemp,hok,idcheck,max,min;
   string name="12345";
//----
   hwnd=GetAncestor(hwnd,2);                     // нашли главное окно
   if (hwnd!=0) {   
      PostMessageA(hwnd,WM_COMMAND,33157,0);     // открыли окно "Свойства" текущего графика
   }  
   else {
      Print("Error :",GetLastError());
      return;
   }
   hwnd=GetLastActivePopup(hwnd);                // нашли хэндл окна "Свойства" текущего графика
   htemp=GetWindow(hwnd,GW_CHILD);               // нашли 1-ое дочернее окно
   GetWindowTextA(htemp,name,6);                 // вытащили название окна
   if(name!="Общие") {                           // сверили с тем, что нам надо
      hok=GetDlgItem(hwnd,0x1);                  // нашли кнопку "OK"
      SendMessageA(hok,BM_CLICK,0,0);            // нажали кнопку "OK"
   }
   idcheck=IsDlgButtonChecked(htemp,0x4EB);      // получаем информацию о "положении" чекбокса
   if(idcheck==0) CheckDlgButton(htemp,0x4EB,1); // если выключен, то включаем
   if(idcheck==1) {
      CheckDlgButton(htemp,0x4EB,0);             // если включен, то выключаем
      hok=GetDlgItem(hwnd,0x1);                  // нашли кнопку "OK"
      SendMessageA(hok,BM_CLICK,0,0);            // нажали кнопку "OK"
   }
   max=GetDlgItem(htemp,0x4E7);                  // нашли хэндл поля ввода максимума
   SendMessageA(max,WM_CLEAR,0,0);               // послали сообщение очистить поле
   SetWindowTextA(max,"1.52");                   // послали сообщение заполнить поле
   min=GetDlgItem(htemp,0x4E8);                  // нашли хэндл поля ввода максимума
   SendMessageA(min,WM_CLEAR,0,0);               // послали сообщение очистить поле
   SetWindowTextA(min,"1.47");                   // послали сообщение заполнить поле
   hok=GetDlgItem(hwnd,0x1);                     // нашли кнопку "OK"
   SendMessageA(hok,BM_CLICK,0,0);               // нажали кнопку "OK"
   return;
}


Скрипт практически не отличается от выложенного по ссылке. Скрипт рабочий, проверен на EURUSD.

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