//+------------------------------------------------------------------+
//| 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