ExpertWindowResize

Author: Copyright � 2012, Nav.Alexey
0 Views
0 Downloads
0 Favorites
ExpertWindowResize
//+------------------------------------------------------------------+
//|                                           ExpertWindowResize.mq4 | v.1.3
//|                                    Copyright © 2012,  Nav.Alexey | 
//|                                                alemail@yandex.ru |  
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Nav.Alexey "
#property link      "alemail@yandex.ru"

extern int    VisibleRows    = 25;
extern double WidthRatio     = 1.3;

int    Pause = 30;

#define LVM_GETITEMCOUNT     4100   
#define LVM_GETITEMRECT      4110
#define LVM_GETCOLUMNWIDTH   4125
#define LVM_SETCOLUMNWIDTH   4126
#define LVM_GETHEADER        4127
#define LVM_GETTOPINDEX      4135
#define RDW_INVALIDATE          1
#define HDM_GETITEMCOUNT     4608
#define GA_PARENT               1

#import "user32.dll"
  int   GetWindowThreadProcessId(int hWnd,int lpdwProcessId[]);
  int   FindWindowExA(int hwndParent,int hwndChildAfter,string lpClassName,string lpWindowName);
  int   SendMessageW(int hWnd,int Msg,int wParam,int lParam[]);   // èñïîëüçóåì äëÿ ïåðåäà÷è óêàçàòåëÿ
  bool  GetWindowRect(int hWnd,int lpRect[]);
  bool  GetClientRect(int hWnd,int lpRect[]);
  int   GetDlgItem(int hDlg,int nIDDlgItem);
  int   GetDlgCtrlID(int hCtrl);
  bool  RedrawWindow(int hWnd,int lprcUpdate,int hrgnUpdate,int flags);
  int   GetParent(int hWnd);
  int   GetAncestor(int hwnd,int gaFlags);
  int   GetForegroundWindow();
  int   GetAsyncKeyState(int vKey);
  bool  ScreenToClient(int hWnd,int lpPoint[]);
  
#import "kernel32.dll"
  int   GetCurrentProcessId();
  
#include <WinUser32.mqh>

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  start();
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
  CheckForPressedF7();
  while(!IsStopped())
  {
    if (CheckForPressedF7()==true) { Print("Ýêñïåðò îñòàíîâëåí"); break; }
    ResizeExpertsParametersWindow(VisibleRows, WidthRatio);
    Sleep(Pause);
  }
  return(0);
}

//---------------------------------------------------------------------------------

bool ResizeExpertsParametersWindow(double VisibleParamCount, double WidthRatio)
{
  string null;
  static int hMainDlg, hMainDlgLast, hParam;
  if (hMainDlg==0)
    if (!FindExpertDlgWindow(hMainDlg,hParam)) return(0);  
   
  int hListView= FindWindowExA(hParam,0,"SysListView32",null);
  if (hListView==0) { hMainDlg=0; return(0); }  
  
  static int DefaultSizeX, DefaultSizeY;
  static int NewSizeX[2], NewSizeY[2];
  static int hLastActiveDlg;
  if (hMainDlg!=hMainDlgLast)
  { 
    DefaultSizeX=0;  DefaultSizeY=0; 
    ArrayInitialize(NewSizeX,0);  ArrayInitialize(NewSizeY,0);
    hLastActiveDlg=0;
  }
  hMainDlgLast=hMainDlg;
  
  if (DefaultSizeX>0) 
    CheckDraggingColumnSplit(hListView);  // Ïðîâåðÿåì ñìåìåùåíèå ðàçäåëèòåëÿ ñòîáöîâ. Åñëè îí ïåðåì¸ù¸í, òî èçìåíÿåì øèðèíó ñîñåäíèõ ñòîëáöîâ
  
  int hActiveDlg= FindWindowExA(hMainDlg,0,"#32770",null);
  if (hActiveDlg==hLastActiveDlg) return(0);
  int list=0;
  if (hActiveDlg!=hParam)
  {
    int listview= FindWindowExA(hActiveDlg,0,"SysListView32",null);
    if (listview==0) return(0);
    if (GetDlgCtrlID(listview)==0x424) { hListView=listview;  list=1;  WidthRatio=1;  }  // ñïèñîê öâåòîâ èíäèêàòîðà
  }
  int dlgrect[4];  
  if (!GetWindowRect(hMainDlg,dlgrect)) return(0);
  int sizex= dlgrect[2]-dlgrect[0];
  int sizey= dlgrect[3]-dlgrect[1];
  
  if (DefaultSizeX==0)
  { 
    DefaultSizeX=sizex;
    DefaultSizeY=sizey;
  }
  
  int addpixelsX, addpixelsY;
  
  if (NewSizeX[list]==0)
  {
    if (!GetListViewResizeShift(hListView, VisibleParamCount, WidthRatio, addpixelsX, addpixelsY)) return(0);
    NewSizeX[list]= DefaultSizeX+ addpixelsX;
    NewSizeY[list]= DefaultSizeY+ addpixelsY;
  }

  if (IsWindowVisible(hListView)==true)
  {
    addpixelsX= NewSizeX[list]-sizex;
    addpixelsY= NewSizeY[list]-sizey;
  }
  else
  {
    addpixelsX= DefaultSizeX-sizex;
    addpixelsY= DefaultSizeY-sizey;
  } 
  
  hLastActiveDlg= hActiveDlg;
  
  if (addpixelsX==0 && addpixelsY==0) return(0);
  
  int hTab= GetDlgItem(hMainDlg,0x3020);  // TabControl
  // èçìåíÿåì ðàçìåðû âñåõ îêîí
  WindowSizeChange(hActiveDlg, addpixelsX, addpixelsY);
  WindowSizeChange(hTab, addpixelsX, addpixelsY);  
  WindowSizeChange(hMainDlg, addpixelsX, addpixelsY);
  
  int hTray= FindWindowA("Shell_TrayWnd",null);
  if (hTray>0)  
  { // ïðîâåðÿåì, çàõîäèò ëè ãðàíèöà îêíà â îáëàñòü ñèñòåìíîãî òðåÿ, è ïåðåìåùàåì îêíî ïðè íåîáõîäèìîñòè
    int trayrect[4];
    GetWindowRect(hMainDlg, dlgrect);
    GetWindowRect(hTray, trayrect);
    if (dlgrect[3] > trayrect[1])
      WindowPosChange(hMainDlg, 0, -MathMin(dlgrect[3]-trayrect[1], dlgrect[1]));
  }
  
  int hparent=hMainDlg;
  int h=0;
  while(true)   // ïåðåìåùàåì êíîïêè
  {
    h= FindWindowExA(hparent,h,"Button",null);
    if (h==0)
      if (hparent==hMainDlg) { hparent=hParam; continue; }
       else break;
       
    int addx=0;
    switch(GetDlgCtrlID(h)) { case 0xFAB: case 0xFAC: case 0xFAD: case 0xFAE:  addx=addpixelsX; } //if (textbuf=="&Çàãðóçèòü" || textbuf=="&Ñîõðàíèòü")  
    WindowPosChange(h,addx,addpixelsY);
  }
  RedrawWindow(hMainDlg, 0, 0, RDW_INVALIDATE);
  Sleep(200);
  
  return(0);
}

//--------------------------------------------------------------------------

bool GetListViewResizeShift(int hListView, double VisibleParamCount, double WidthRatio, int& AddPixelsX, int& AddPixelsY)
{  
  int itemscount= SendMessageA(hListView, LVM_GETITEMCOUNT, 0,0);
  if (itemscount==0) return(0);
  int topindex= SendMessageA(hListView, LVM_GETTOPINDEX, 0,0);
  int itemrect[4]={0};
  if (!SendMessageW(hListView, LVM_GETITEMRECT, topindex, itemrect)) return(0);
  int itemheight= itemrect[3]-itemrect[1]; // âûñîòà ÿ÷åéêè
  int item_y0 = itemrect[1]; // âåðõíÿÿ êîîðäèíàòà ïåðâîé ÿ÷åéêè
  
  int listrect[4];
  GetClientRect(hListView,listrect);
  int listwidth= listrect[2]-listrect[0];
  int listheight= listrect[3]-listrect[1];
  
  double currentmaxvisiblecount = (listheight-item_y0)/itemheight;
  
  VisibleParamCount = MathMax(VisibleParamCount,currentmaxvisiblecount);
   
  if (VisibleParamCount >= itemscount)
    VisibleParamCount= MathMax(itemscount+0.5,currentmaxvisiblecount);
  
  AddPixelsX= listwidth*(WidthRatio-1);
  AddPixelsY= MathMax((VisibleParamCount-currentmaxvisiblecount)*itemheight,0);
    
  string null;
  int header= FindWindowExA(hListView,0,"SysHeader32",null);
  int columnscount= SendMessageA(header, HDM_GETITEMCOUNT, 0,0);
  if (columnscount==5) // çíà÷èò ýòî ïàðàìåòðû òåñòèðóåìîãî ñîâåòíèêà, ïîýòîìó èçìåíÿåì òîëüêî øèðèíó ïåðâîãî ñòîëáöà
  { 
    int colwidth0= SendMessageA(hListView, LVM_GETCOLUMNWIDTH, 0,0);
    if (colwidth0<50) return(0);
    AddPixelsX= colwidth0*(WidthRatio-1); 
  }
  WindowSizeChange(hListView, AddPixelsX, AddPixelsY);
  if (columnscount==5 && AddPixelsX>0)
  { // Èçìåíÿåì ðàçìåðû âñåõ ñòîëáöîâ
    Sleep(200);
    colwidth0 += AddPixelsX;
    SendMessageA(hListView, LVM_SETCOLUMNWIDTH, 0, colwidth0);
    GetClientRect(hListView, listrect);
    listwidth= listrect[2]-listrect[0];
    for (int col=1; col<5; col++)
      SendMessageA(hListView, LVM_SETCOLUMNWIDTH, col, (listwidth-colwidth0)/4);
    
    CheckDraggingColumnSplit(0);
  }
  return(true);
}

//-----------------------------------------------------------------------------

bool FindExpertDlgWindow(int& hmain, int& hparam)
{  
  string null;
  int CurrentProcessId= GetCurrentProcessId();
  int h=0;
  while(true)  // Èùåì îêíî ïàðàìåòðîâ ýêñïåðòà
  {
	 h= FindWindowExA(0,h,"#32770",null);
	 if (h==0) return(0);
	 int processId[1];
	 GetWindowThreadProcessId(h,processId);
	 if (processId[0]!=CurrentProcessId) continue;
	 //hParam= FindWindowExA(h,0,"#32770","Âõîäíûå ïàðàìåòðû"); //if (hParam==0) hParam= FindWindowExA(h,0,"#32770","Inputs"); //if (hParam==0) hParam= FindWindowExA(h,0,"#32770","Input Parameters");
	 if (GetDlgItem(h,0x3020)>0) if (GetDlgItem(h,1)>0) if (GetDlgItem(h,2)>0) if (GetDlgItem(h,0x3021)>0) if (GetDlgItem(h,9)>0)  // ""[SysTabControl32], "ÎÊ"[Button], "Îòìåíà"[Button], "Ñáðîñ"[Button], "Ñïðàâêà"[Button]
	   for (int hh=0; ; )
	   {
	     hh= FindWindowExA(h, hh, "#32770", null);
	     if (hh==0) return(0);
	     if (GetDlgItem(hh,0x567)==0) if (GetDlgItem(hh,0x54D)==0) continue; //return(true);  // FindWindowExA(hh,0,"ListView32",null);
	     hmain=h; hparam=hh;
	     return(true);
	   }    
  }
}

//------------------------------------------

void CheckDraggingColumnSplit(int hListView)   // ïðîâåðêà ïåðåòàñêèâàíèÿ ðàçäåëèòåëÿ êîëîíîê
{ 
  static int columnlastwidth[5];
  static int lastlistview=0;
  static int columns=0;

  if (hListView!=lastlistview)
  { 
    string null;
    int header= FindWindowExA(hListView, 0, "SysHeader32", null);
    columns= SendMessageA(header, HDM_GETITEMCOUNT, 0, 0);
  }
  int columnwidth[5];
  for (int i=0; i<columns; i++)  columnwidth[i]= SendMessageA(hListView, LVM_GETCOLUMNWIDTH, i, 0);
  
  if (lastlistview!=hListView) { ArrayCopy(columnlastwidth, columnwidth);  lastlistview= hListView; }
  
  if (GetAncestor(hListView,2) != GetForegroundWindow()) return;
  if (GetAsyncKeyState(0x01)&32768 >0)   // VK_LBUTTON   (íàæàòà ëåâàÿ êíîïêà ìûøè)
    for (i=0; i<columns; i++)      
      if (columnwidth[i]!=columnlastwidth[i]) 
      { 
        int listrect[4];
        GetClientRect(hListView,listrect);
        int listwidth= listrect[2]-listrect[0];
        double sumcolumnswidth=0;
        for (int j=0; j<columns; j++) sumcolumnswidth += columnwidth[j];
        if (sumcolumnswidth==columnwidth[i]) return;
        double ratio= 1 - (sumcolumnswidth-listwidth)/(sumcolumnswidth-columnwidth[i]);
        for (j=0; j<columns; j++)
          if (j!=i) columnlastwidth[j]= columnwidth[j]*ratio;
               else columnlastwidth[j]= columnwidth[j];
        break;  
      }
  for (i=0; i<columns; i++)
    if (columnwidth[i]!=columnlastwidth[i])
      SendMessageA(hListView, LVM_SETCOLUMNWIDTH, i, columnlastwidth[i]);
  return;
}   

//--------------------------------------------------------------
bool WindowPosChange(int hwnd,int addx,int addy)
{ 
  return( WindowPosAndSizeChange(hwnd,addx,addy,0,0) );
}
//--------------------------------------------------------------

bool WindowSizeChange(int hwnd,int addwidth,int addheight)
{
  return( WindowPosAndSizeChange(hwnd,0,0,addwidth,addheight) );
}
//----------------------------------------------------

bool WindowPosAndSizeChange(int hwnd, int addx, int addy, int addwidth, int addheight)
{
  int windowrect[4];
  GetWindowRect(hwnd,windowrect);
  int hparent= GetAncestor(hwnd,GA_PARENT);
  int width= windowrect[2]-windowrect[0]+addwidth;
  int height= windowrect[3]-windowrect[1]+addheight;
  ScreenToClient(hparent,windowrect);
  int x= windowrect[0]+addx;
  int y= windowrect[1]+addy;
  return( MoveWindow(hwnd,x,y,width,height,true) );
}

//+-------------- Ïðîâåðêà íàæàòèÿ F7 ----------------------------------------------------+

bool CheckForPressedF7()
{      
  static bool IsWindowActive=0;
  int h=GetParent(WindowHandle(Symbol(),Period()));
  if (GetParent(GetParent(h))!=GetForegroundWindow())  { IsWindowActive=0; return(0); }
  if (GetWindow(h,GW_HWNDFIRST)!=h) { IsWindowActive=0; return(0); }
  if (!IsWindowActive) GetAsyncKeyState(118);
  IsWindowActive=true;
  if (GetAsyncKeyState(118)!=0) { IsWindowActive=0; return(true); }
  return(0);
}

Comments