#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#define COORD_X 200
#define COORD_Y 100
#define OBJ_NAME "TestTextGetSizeBitmapLabel"
#define RES_NAME "TestTextGetSizeResource"
#define COLOR_NULL 0x00FFFFFF
/+------------------------------------------------------------------+
//| Script program start function |
/+------------------------------------------------------------------+
void OnStart()
{
//--- 현재 차트 ID
long chart_id= ChartID();
string font_names[] ={"Arial", "Tahoma", "Calibri"};
uint flags_array[]={0, FONT_ITALIC, FONT_UNDERLINE, FONT_STRIKEOUT};
uint fw_array[]={FW_DONTCARE, FW_THIN, FW_EXTRALIGHT, FW_ULTRALIGHT, FW_LIGHT,
FW_NORMAL, FW_REGULAR, FW_MEDIUM, FW_SEMIBOLD, FW_DEMIBOLD,
FW_BOLD, FW_EXTRABOLD, FW_ULTRABOLD, FW_HEAVY, FW_BLACK};
//--- 가격 차트의 속성 그리기 모두 비활성화
ChartSetInteger(chart_id, CHART_SHOW, false);
//--- 그래픽 리소스의 매개변수를 선언합니다.
uint rc_width =(int)ChartGetInteger(chart_id, CHART_WIDTH_IN_PIXELS);
uint rc_height=(int)ChartGetInteger(chart_id, CHART_HEIGHT_IN_PIXELS);
uint rc_data[];
uint rc_size=rc_width*rc_height;
//--- 텍스트 출력을 위한 그래픽 리소스 생성
if(!CreateResource(chart_id, rc_data, rc_width, rc_height))
return;
//--- 글꼴 이름을 반복합니다
for(int i=0; i<(int)font_names.Size(); i++)
{
//--- 글꼴 플래그를 반복합니다
for(int j=0; j<(int)flags_array.Size(); j++)
{
//--- 배열에서 얻은 글꼴 및 스타일 플래그로 텍스트를 그립니다.
DrawText(font_names[i], flags_array[j], rc_data, rc_width, rc_height);
Sleep(800);
ArrayInitialize(rc_data, COLOR_NULL);
}
Sleep(800);
ArrayInitialize(rc_data, COLOR_NULL);
}
//--- 모든 텍스트를 다양한 글꼴 크기와 스타일로 출력한 후,
//--- 다른 글꼴 너비 플래그로 텍스트를 표시
for(int i=0; i<(int)fw_array.Size(); i++)
{
//--- 너비 플래그로 텍스트를 표시하기 위한 글꼴 크기와 이름을 설정합니다.
string font_name="Tahoma";
int size=-140;
TextSetFont(font_name, size, fw_array[i]);
//--- 그려진 텍스트 문자열을 생성하고 이를 리소스 픽셀 배열에 출력하고 리소스를 업데이트합니다.
string text=StringFormat("Text%d: Font name: \"%s%s\", size: %d (%d)", i+1, font_name, FlagWidthDescription(fw_array[i]), size, size/-10);
TextOut(text, COORD_X, COORD_Y, ANCHOR_LEFT_UPPER, rc_data, rc_width, rc_height, ColorToARGB(clrDodgerBlue), COLOR_FORMAT_ARGB_NORMALIZE);
Update(RES_NAME, rc_data, rc_width, rc_height, true);
//--- 잠시 기다립니다
Sleep(1000);
ArrayInitialize(rc_data, COLOR_NULL);
}
//--- 5초간 기다린 후 리소스를 해제하고 그래픽 객체를 삭제합니다.
Sleep(5000);
ResourceFree(RES_NAME);
ObjectDelete(chart_id, OBJ_NAME);
//--- 가격 차트의 모든 속성을 그릴 수 있게 합니다
ChartSetInteger(chart_id, CHART_SHOW, true);
ChartRedraw(chart_id);
/*
스크립트 실행의 결과로 차트에 텍스트 메시지가 표시됩니다.
텍스트에는 다양한 글꼴, 스타일 및 너비 플래그가 있습니다.
*/
}
/+------------------------------------------------------------------+
//| 서로 다른 5개의 텍스트 문자열을 표시합니다 |
//| 지정된 글꼴 및 플래그를 사용한 크기 |
/+------------------------------------------------------------------+
void DrawText(const string font_name, uint flags, uint &pixels_array[], uint res_width, uint res_height)
{
//--- 서로 다른 글꼴 크기를 가진 5개의 텍스트 문자열을 출력합니다.
for(int i=0; i<5; i++)
{
//--- 그리기 메서드를 사용하여 글꼴 크기를 계산하고 텍스트 출력용 글꼴을 설정합니다.
int size=-140+10*i;
TextSetFont(font_name, size, flags);
//--- 그려진 텍스트 문자열을 생성하고 이를 리소스 픽셀 배열에 출력하고 리소스를 업데이트합니다.
string text=StringFormat("Text%d: Font name: \"%s%s\", size: %d (%d)", i+1, font_name, FlagDescription(flags), size, size/-10);
TextOut(text, COORD_X, COORD_Y+22*i, ANCHOR_LEFT_UPPER, pixels_array, res_width, res_height, ColorToARGB(clrDodgerBlue), COLOR_FORMAT_ARGB_NORMALIZE);
Update(RES_NAME, pixels_array, res_width, res_height, true);
//--- 잠시 기다립니다
Sleep(800);
}
}
/+------------------------------------------------------------------+
//| 글꼴 스타일 플래그에 대한 설명을 반환합니다. |
/+------------------------------------------------------------------+
string FlagDescription(const uint flag)
{
switch(flag)
{
case FONT_ITALIC : return(" Italic");
case FONT_UNDERLINE : return(" Underline");
case FONT_STRIKEOUT : return(" Strikeout");
}
return("");
}
/+------------------------------------------------------------------+
//| 글꼴 너비 플래그에 대한 설명을 반환합니다 |
/+------------------------------------------------------------------+
string FlagWidthDescription(const uint flag)
{
switch(flag)
{
case FW_DONTCARE : return(" Dontcare");
case FW_THIN : return(" Thin");
case FW_EXTRALIGHT: return(" Extralight");
case FW_ULTRALIGHT: return(" Ultralight");
case FW_LIGHT : return(" Light");
case FW_NORMAL : return(" Normal");
case FW_REGULAR : return(" Regular");
case FW_MEDIUM : return(" Medium");
case FW_SEMIBOLD : return(" Semibold");
case FW_DEMIBOLD : return(" Demibold");
case FW_BOLD : return(" Bold");
case FW_EXTRABOLD : return(" Extrabold");
case FW_ULTRABOLD : return(" Ultrabold");
case FW_HEAVY : return(" Heavy");
case FW_BLACK : return(" Black");
}
return("");
}
/+------------------------------------------------------------------+
//| 전체 차트에 대한 그래픽 리소스를 만듭니다 |
/+------------------------------------------------------------------+
bool CreateResource(const long chart_id, uint &pixel_data[], const uint width, const uint height)
{
//--- 픽셀 배열의 크기를 설정합니다
ResetLastError();
uint size=width*height;
if(ArrayResize(pixel_data, size)!=size)
{
PrintFormat("%s: ArrayResize() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- 픽셀 배열을 투명한 색상으로 채우고 이를 기반으로 그래픽 리소스를 만듭니다.
ArrayInitialize(pixel_data, COLOR_NULL);
if(!ResourceCreate(RES_NAME, pixel_data, width, height, 0, 0, 0, COLOR_FORMAT_ARGB_NORMALIZE))
{
PrintFormat("%s: ResourceCreate() failed. Error code ",__FUNCTION__, GetLastError());
return(false);
}
//--- 차트의 왼쪽 상단 모서리 좌표에 그래픽 레이블 객체를 생성합니다.
if(!ObjectCreate(0, OBJ_NAME, OBJ_BITMAP_LABEL, 0, 0, 0))
{
PrintFormat("%s: ObjectCreate() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- 생성된 비트맵 객체의 너비와 높이를 그래픽 리소스의 너비와 높이와 같게 설정합니다.
//--- 객체 앵커 포인트를 중앙으로 설정합니다.
if(!ObjectSetInteger(chart_id, OBJ_NAME, OBJPROP_XSIZE, width))
{
PrintFormat("%s: ObjectSetInteger() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_id, OBJ_NAME, OBJPROP_YSIZE, height))
{
PrintFormat("%s: ObjectSetInteger() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- 이전에 비트맵 객체에 대해 생성된 그래픽 리소스를 이미지 파일로 지정합니다
//--- 이 경우 사용된 그래픽 리소스의 이름을 나타내기 위해 이름 앞에 "::"를 추가해야 합니다
if(!ObjectSetString(chart_id, OBJ_NAME, OBJPROP_BMPFILE, "::"+RES_NAME))
{
PrintFormat("%s: ObjectSetString() failed. Error code %d",__FUNCTION__, GetLastError());
return(false);
}
//--- 모든게 작동합니다
return(true);
}
/+------------------------------------------------------------------+
//| 그래픽 리소스 데이터를 업데이트 합니다 |
/+------------------------------------------------------------------+
void Update(const string res_name, const uint &pixel_data[], const uint width, const uint height, const bool redraw)
{
//--- 0차원이 전달되면 그대로 둡니다
if(width==0 || height==0)
return;
//--- 리소스 데이터를 업데이트하고 차트를 다시 그립니다
if(ResourceCreate(res_name, pixel_data, width, height, 0, 0, 0, COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
ChartRedraw();
}
|