关于标签字符的所有这些废话是什么? - 页 5

 

我试着按照这里的建议,用单色字体制作一个带有标签的表格--它并不悦目。特别是小数点的数字被横向涂抹,非常难看。 所以我们只能选择普通字体的标签,每个单元格都有单独的标签。 这将涉及相当多的对象,正如我以前写过的。

Jartmailru,你知道在EA代码中直接创建一个输出窗口,而不使用DLL是否现实?所有的WinApi功能都可以使用。 唯一的障碍可能只是在同时传递一个包含变量和指针的结构时。

 

在单一范围内的标签

 
不要被愚弄 - 使用现成的组件 :https://www.mql5.com/ru/code/8724
 
xrust:

在单片机中的标签。


你是说在一个单弦机中?

当然,这很好,但你的表格里没有很多长长的数字,所以它很容易读。

 
Meat:


你的意思是在一个单一的范围内?

这很好,但你没有一排有很多长数字的表格,所以它相当容易阅读。

也许吧,我不知道,我从来没有给自己设定过这样的任务。拥有终端作为一个相当好的工具,以图形和图表的形式显示各种图形信息,在其中建立和分析大量的文本信息?- 为什么当你有Excel的时候......。 当然,这只是我的拙见 :)
 
jartmailru:
另一方面,我想知道你是否已经遇到了
前30%的条目通常会从日志中丢失,之后的条目会有选择地丢失。
日志中有所有的行,是终端在有选择地显示它们。如果你打开这些文件本身,它们都在那里。
 
MetaDriver:

// 你能为Unicode做一个DLL吗? 我将真诚地表示感谢。

给你。增加了LogW、SelectW等功能,但没有测试--有问题请联系。
如果你愿意为第五次制作活页夹,请寄给我:-)。
.
肉类

Jartmailru,你知道在EA代码中直接创建输出窗口而不使用DLL是否现实?所有的WinApi功能都可以使用。 唯一的麻烦可能只有在传递一个同时包含变量和指针的结构时。

如果你做了一些扭曲的事情,也许就有可能了。我不扭捏:-)。
在C++中,一个MT旁边的窗口需要一个单独的接口线程。
如果是一个单一的窗口,这是很微不足道的。
.
顺便说一下...这不是一个事实,标签......你将能够对准
列的内容到合适的程度。
.
PapaYozh:
日志上有所有的行,是终端有选择地显示它们。如果你打开这些文件本身,它们都在那里。
我不介意 :-)。
日志(在日志中搜索图形中的点--正确的位置被显示出来)。
.
附加的文件:
out.zip  123 kb
 

好吧,我已经为多行字体做了一个标签!:)耶!:)当然,我不得不在WinAPI函数上大费周章,但这是值得的。它不仅对评论有用,而且对标签也有用。这个想法是,我们可以得到任何字体的任何字符串的尺寸,单位是像素。然后你可以按照你的意愿将它们列成表格,可以是左边、右边,也可以是中间。 对于Comment来说,制表时自然会有空格,所以结果并不完美,误差在1-2个像素内,但原则上没什么。对于标签来说,一切都要简单得多。

这里有一个例子,显示Comment中的标签。 这里指定了Tahoma,8,因为注释是以这种字体输出的。

#import "Gdi32.dll"
  int CreateFontA(int nHeight,int nWidth,int nEscapement,int nOrientation,int fnWeight,int fdwItalic,int fdwUnderline,
                  int fdwStrikeOut,int fdwCharSet,int fdwOutputPrecision,int fdwClipPrecision,int fdwQuality,
                  int fdwPitchAndFamily,string lpszFace);
  int SelectObject(int hdc,int hgdiobj);
  bool DeleteObject(int hObject);
  int GetDeviceCaps(int hdc,int nIndex);
  bool GetTextExtentPoint32A(int hdc,string lpString,int cbString,int lpSize[]);
  
#import "user32.dll"
  int GetDC(int hWnd); 
  int ReleaseDC(int hWnd,int hDC);
  
//+------------------------------------------------------------------+
int start()
{
  #define DEFAULT_CHARSET 1
  #define OUT_DEFAULT_PRECIS 0
  #define CLIP_DEFAULT_PRECIS 0
  #define DEFAULT_QUALITY 0
  #define DEFAULT_PITCH 0
  #define FF_MODERN 48
  int hWnd=WindowHandle(Symbol(),Period());
  int DC=GetDC(hWnd);
  int dpi=GetDeviceCaps(DC,88);  //88=LOGPIXELSX
  string Font="Tahoma";
  int fontsize=8;
  int fontheight=MathRound(fontsize*dpi/72.0);
  int hFont=CreateFontA(fontheight,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_MODERN,Font); 
  SelectObject(DC,hFont);
  
  string StringArray[]={"Один","Два","Три","Четыре","Пять","Шесть","Семь","Восемь","Девять","Десять","Одиннадцать","Двенадцать"};
  int arraysize=ArraySize(StringArray);
  int tabpixels=100;  // размер табуляции в пикселях
  int size[2];
  GetTextExtentPoint32A(DC," ",1,size); // получаем размер пробела
  int spacesize=size[0];
  if (spacesize==0) { Alert("spacesize=0"); return(0); }
  string text="\n";
  int rowsize=0;
  int alignmode=0; // 0- по левому краю, 1- по правому краю
  
  for (int i=0; i<arraysize; i++)
  { 
    int column=i%4;
    string str=StringArray[i];
    GetTextExtentPoint32A(DC,str,StringLen(str),size);  // получаем размер строки
    int spacecount=MathRound((tabpixels*(column+1)-size[0]-rowsize)*1.0/spacesize);
    for (int s=0; s<spacecount; s++)
      if (alignmode==0)
        str=str+" ";
       else
        str=" "+str;
    rowsize+=size[0]+spacesize*spacecount;
    text=text+str;
    if (column==3 || i==arraysize-1)
    { 
      text=text+"\n";
      rowsize=0;
      if (i<arraysize-1) continue;
      if (alignmode==1) break;
      alignmode++;
      text=text+"\n\n";
      i=-1;
    }
  }   
  Comment(text);
  ReleaseDC(hWnd,DC);
  DeleteObject(hFont);
  return(0);
}

 
你真是懒得很 :-)
 
Meat:

下面是一个例子,显示了Comment中的标签。 这里设置的字体是Tahoma,8,因为注释是以这种字体输出的。


+重新制作任何文本的输出,而不仅仅是一个行数组的输出

+把它作为一个单独的函数CommentTab

+ 添加了一个TabStop值的数组和一个默认的Tab大小(如GDI函数中)。

文本和结果的例子

//------------------------------------------------------------------    start
int start()
{
  string txt="\n";
  txt=txt+"Ticket\tOpen Time\tType\tSize\tItem\tPrice\tS / L\tT / P\tClose Time\tPrice\tCommission\tTaxes\tSwap\tProfit"+"\n";
  txt=txt+"524567\t28.06.2011 15:02\tbuy\t0.35\teurusd.vpe\t1.43380\t1.43390\t0.00000\t29.06.2011 2:39\t1.43383\t-3.50\t0.00\t0.56\t0.73"+"\n";
  txt=txt+"523492\t28.06.2011 15:02\tbuy\t0.70\teurusd.vpe\t1.43397\t1.43407\t1.47115\t28.06.2011 18:17\t1.43407\t-7.00\t0.00\t0.00\t4.88"+"\n";
  txt=txt+"523494\t28.06.2011 15:02\tbuy\t0.70\teurusd.vpe\t1.43397\t1.43407\t0.00000\t28.06.2011 18:17\t1.43407\t-7.00\t0.00\t0.00\t4.88"+"\n";
  txt=txt+"523498\t28.06.2011 15:02\tbuy\t0.35\teurusd.vpe\t1.43380\t1.43390\t0.00000\t28.06.2011 17:00\t1.43675\t-3.50\t0.00\t0.00\t71.86"+"\n";
  txt=txt+"522650\t27.06.2011 14:50\tbuy\t0.80\teurusd.vpe\t1.42240\t1.42371\t1.43687\t28.06.2011 15:19\t1.43693\t-8.00\t0.00\t1.28\t808.95"+"\n";
  
  int tab[]={10, 22, 10, 10, 15, 12, 12, 12, 22, 12, 20, 10, 10}; // размеры в пробелах
       
  CommentTab(txt, tab, 30); // вызвали преобразование и вывод по табуляции
}