Код на делфи такой:
function CreateMyPicture(chart_hwnd:HWND):HWND;stdcall;
var h_wnd:HWND;
rect:TRect;
capt:string;
begin
h_wnd:=0;
SetLength(capt,7);
if (chart_hwnd>0) then
begin
h_wnd:=GetParent(chart_hwnd);
if(h_wnd>0) then
GetWindowText(h_wnd,PAnsiChar(capt),7);
h_wnd:=GetParent(h_wnd);
h_wnd:=GetParent(h_wnd);
if h_wnd>0 then
begin
Form1:=TForm1.CreateParented(h_wnd);
GetWindowRect(chart_hwnd,rect);
Form1.SetBounds(rect.Left+6,rect.Top-16,Form1.Width, Form1. Height);
Form1.Show;
Form1.Caption:=capt;
h_wnd:=Form1.Handle;
end;
end;
Result:=h_wnd;
end;
Это часть кода. Если нужно вышлю полный проект.
В mql я сделал индикатор:
#property indicator_chart_window #import "MyPictDll.dll" int CreateMyPicture(int h_wnd); void CloseMyPicture(); #import int wnd=-1; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { wnd=CreateMyPicture(WindowHandle(Symbol(),Period())); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { if(wnd>0) CloseMyPicture(); return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); return(0); } //+------------------------------------------------------------------+
Все работает.
Да забыл, экспортируемые функции должны быть stdcall.
У меня есть что то подобное на делфи. Только у меня окно привязывалось к конкретному графику. Вообщем в dll в экспртируемую функцию dll я передавал хэндл окна графика., а дальше эта функция создавала дочернее окно по отношению к графику.
Код на делфи такой:
Это часть кода. Если нужно вышлю полный проект.
Если не трудно, очень интересует эта тема.
E-mail:msp(гав)vitebsk.by
ICQ 428715765
P.S. Буду очень признателен
И индикатор, загружает dll и создает окно.
Окно должно показывать картинку лежащую по определенному пути.
В общем, я думаю, разберешся в коде.
Спасибо за проекты. Щас попробую. А ты вызываешь функции из длл только из кода индикатора или так же вызывал советника или скрипта чтобы в длл создать форму?
Кстати ты пробовал что создание формы в длл работает на последнем билде 206 от 6 июня ?
На последнем билде работает.
Вызывал только из индикатора.
На последнем билде работает.
Из эксперта все равно вываливается
Вызывал только из индикатора.
На последнем билде работает.
Из эксперта все равно вываливается
Да проверить щас не могу полноценно. Тики не идут.
А вообще можно попробовтаь создать окно в длл с помощью Win32 GUI API. Это как запасной вариант.
Вызывал только из индикатора.
На последнем билде работает.
Из эксперта все равно вываливается
Да проверить щас не могу полноценно. Тики не идут.
А вообще можно попробовтаь создать окно в длл с помощью Win32 GUI API. Это как запасной вариант.
Стукнись ко мне в Аську, плиз
Вызывал только из индикатора.
На последнем билде работает.
Из эксперта все равно вываливается
Да проверить щас не могу полноценно. Тики не идут.
А вообще можно попробовтаь создать окно в длл с помощью Win32 GUI API. Это как запасной вариант.
и приложениях, написанных с использованием WinApi. Dll-ка работала, я проверял.
Но мне нужно было в этом окне отобразить jpeg. Можно было сделать средствами GDI+, воспользоваться библиотекой Intel JPEG Library.
Но я решил не заморачитваться и использовал delphi.
Luptator , скажи а почему ты три раза вызываешь GetParent
Как я понимаю ты поднимаешься в иерархии окон на три выше ? Только вот зачем?
h_wnd:=GetParent(chart_hwnd);
if(h_wnd>0) then
GetWindowText(h_wnd,PAnsiChar(capt),7);
h_wnd:=GetParent(h_wnd);
h_wnd:=GetParent(h_wnd);
Sergey_Murzinov, спрашивай в этой теме если что интересует
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В одной из экспортируемых функций хочу создать не модальное окно-форму с помощью Делфи
interface
type
TMTDllForm = class(TForm)
private
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
public
end;
var
MTDllForm: TMTDllForm;
procedure Initialize(); stdcall;
implementation
procedure Initialize();
begin
MTDllForm := TMTDllForm.Create(nil);
MTDllForm.Show;
end;
Окно на миг появляется и исчезает при вызове в коде советника на MQL4
void init() {
Initialize();
}
Из-за чего это может быть?
У меня две догадки
1. Я не правильно создаю окно и показываю его.
2. MT терминал отслеживает все окна созданные в его адресном пространстве - например в длл и закрывает их.
Скорее всего первый случай но второй тоже не могу отрицать.
Вообщем посоветуйте как создать окно в Delphi Dll которая загружается в советнике.