Как получить HDC

 
Как получить handle to device context? Есть ли ф-ция, позволяющая получить хэндл для графического устройства (битмэпа), подобно тому как мы получаем хэндл окна через WindowHandle().
 
А Вы пробовали API GetDC ?

Вот скрипт который вроде напрямую рисует линию в окне.
//+------------------------------------------------------------------+
//|                                                          HDC.mq4 |
//|                                                           Jhonny |
//|                                         mailto: jhonnyfx@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Jhonny"
#property link      "mailto: jhonnyfx@mail.ru"

#import "user32.dll"
int GetDC(int HWND);
int ReleaseDC(int hWnd,int hDC );

#import "gdi32.dll"
bool LineTo(int hdc,	int nXEnd, int nYEnd );
   
   
int start()
  {

	int ScreenDC;

	ScreenDC= GetDC(WindowHandle(Symbol(),Period()));
	LineTo(ScreenDC, 100, 200);
	ReleaseDC(0, ScreenDC); 
   return(0);
  }
 
Джонни, спасибо за помощь, все работает.
 
Джонни, уважаемый, посмотри, пожалуйста, почему у меня линию рисует, а текста не видно?

#import "gdi32.dll"
bool LineTo(int hdc, int x, int y);
bool TextOut(int hdc, int x, int y, string S, int n);

int start() {
int DC, x, y; string S;

DC= GetDC(WindowHandle(Symbol(),Period()));

x= 100; y= 100;
LineTo(DC, x, y);
S= "Ох и попечатаем!";
TextOut(DC, x, y, S, StringLen(S) );
ReleaseDC(0, DC);
 
Похоже не получится решить проблемму, дело в том что функция
BOOL TextOut(

    HDC hdc,	// handle of device context 
    int nXStart,	// x-coordinate of starting position  
    int nYStart,	// y-coordinate of starting position  
    LPCTSTR lpString,	// address of string 
    int cbString 	// number of characters in string 
   );



Имеет параметр LPCTSTR lpString, // address of string
а это не строка а ссылка на нее, с одной стороны в MQL4 есть возможность оперировать с ссылками, но для библиотечных функций такая возможность не предусмотрена, по крайней мере так написано в справке

Существует возможность передавать параметры по ссылке. В этом случае модификация таких параметров отразится на соответствующих переменных в вызываемой функции, переданных по ссылке. Нельзя передавать по ссылке элементы массивов. Параметры по ссылке можно передавать только в пределах одного модуля, для библиотечных функций такая возможность не предусмотрена. Для того чтобы указать, что параметр передается по ссылке, после типа данных необходимо поставить модификатор &.


Если не найдется другой айпи функции(а похоже все они требуют ссылку на строку) способной решить вашу проблему, придется вам самим длл делать, и свои функции писать, тем более и так вы импортируете функции так что еще одна длл погоды не сделает.




 
В данном случае для вывода (там где // address of string ) правильно определять параметр string. Передаётся именно ссылка. Посмотрите в ExpertSample.dll пример функции, принимающей строку.

Тут, похоже, другая ошибка. Надо объявлять функцию TextOutA, которая принимает простую строку (в отличие от TextOutW, которая принимает уникодную строку)
 
Всетаки есть значит апи функция принимающая строку, просто в моем описании апи небыло описания расширенных функций только TextOut.
Вот скрип все рисует.

//+------------------------------------------------------------------+
//|                                                          HDC.mq4 |
//|                                                           Jhonny |
//|                                         mailto: jhonnyfx@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Jhonny"
#property link      "mailto: jhonnyfx@mail.ru"

#import "user32.dll"
int GetDC(int HWND);
int ReleaseDC(int hWnd,int hDC );

#import "gdi32.dll"
bool LineTo(int hdc,	int nXEnd, int nYEnd );
bool TextOutA( int hdc, int nXStart,int nYStart,string lpString, int cbString );
   
   
int start()
  {

	int ScreenDC;

	ScreenDC= GetDC(WindowHandle(Symbol(),Period()));

            string Text="TestString";
	TextOutA(ScreenDC, 100, 200,Text,StringLen(Text));
	ReleaseDC(0, ScreenDC); 
   return(0);	

  }


 
Да, я заметил, что в логе выскакивает ошибка,
USDJPYm,H4: cannot call function 'TextOut' from dll 'gdi32.dll' (error 127)

но разбираться не пришлось - проснулся а тут ваши ответы.
Спасибо.
Причина обращения: