//+------------------------------------------------------------------+
//| #Calc.mq4 |
//| Copyright © 2011, Victor Niclolaev aka Vinin |
//| vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Victor Niclolaev aka Vinin"
#property link "vinin@mail.ru"
//#property show_inputs
//extern int Delta=3;
#import "user32.dll"
bool GetCursorPos(int& Pos[2]);
bool GetWindowRect(int hWnd,int& Pos[4]);
int GetForegroundWindow();
int GetActiveWindow();
bool GetAsyncKeyState(int nVirtKey);
//+------------------------------------------------------------------+
#import "IdleLib.dll"
int GetLastKeyWP();
int GetLastMouseWP();
int IdleLibInit();
int IdleLibUnInit();
string GetActiveWndName();
#import
#define KEYEVENTF_EXTENDEDKEY 0x0001
#define KEYEVENTF_KEYUP 0x0002
#define VK_0 48
#define VK_1 49
#define VK_2 50
#define VK_3 51
#define VK_4 52
#define VK_5 53
#define VK_6 54
#define VK_7 55
#define VK_8 56
#define VK_9 57
#define VK_A 65
#define VK_B 66
#define VK_C 67
#define VK_D 68
#define VK_E 69
#define VK_F 70
#define VK_G 71
#define VK_H 72
#define VK_I 73
#define VK_J 74
#define VK_K 75
#define VK_L 76
#define VK_M 77
#define VK_N 78
#define VK_O 79
#define VK_P 80
#define VK_Q 81
#define VK_R 82
#define VK_S 83
#define VK_T 84
#define VK_U 85
#define VK_V 86
#define VK_W 87
#define VK_X 88
#define VK_Y 89
#define VK_Z 90
#define VK_LBUTTON 1 //Left mouse button
#define VK_RBUTTON 2 //Right mouse button
#define VK_CANCEL 3 //Control-break processing
#define VK_MBUTTON 4 //Middle mouse button (three-button mouse)
#define VK_BACK 8 //BACKSPACE key
#define VK_TAB 9 //TAB key
#define VK_CLEAR 12 //CLEAR key
#define VK_RETURN 13 //ENTER key
#define VK_SHIFT 16 //SHIFT key
#define VK_CONTROL 17 //CTRL key
#define VK_MENU 18 //ALT key
#define VK_PAUSE 19 //PAUSE key
#define VK_CAPITAL 20 //CAPS LOCK key
#define VK_ESCAPE 27 //ESC key
#define VK_SPACE 32 //SPACEBAR
#define VK_PRIOR 33 //PAGE UP key
#define VK_NEXT 34 //PAGE DOWN key
#define VK_END 35 //END key
#define VK_HOME 36 //HOME key
#define VK_LEFT 37 //LEFT ARROW key
#define VK_UP 38 //UP ARROW key
#define VK_RIGHT 39 //RIGHT ARROW key
#define VK_DOWN 40 //DOWN ARROW key
#define VK_PRINT 42 //PRINT key
#define VK_SNAPSHOT 44 //PRINT SCREEN key
#define VK_INSERT 45 //INS key
#define VK_DELETE 46 //DEL key
#define VK_HELP 47 //HELP key
#define VK_LWIN 91 //Left Windows key (Microsoft® Natural® keyboard)
#define VK_RWIN 92 //Right Windows key (Natural keyboard)
#define VK_APPS 93 //Applications key (Natural keyboard)
#define VK_SLEEP 95 //Computer Sleep key
#define VK_NUMPAD0 96 //Numeric keypad 0 key
#define VK_NUMPAD1 97 //Numeric keypad 1 key
#define VK_NUMPAD2 98 //Numeric keypad 2 key
#define VK_NUMPAD3 99 //Numeric keypad 3 key
#define VK_NUMPAD4 100 //Numeric keypad 4 key
#define VK_NUMPAD5 101 //Numeric keypad 5 key
#define VK_NUMPAD6 102 //Numeric keypad 6 key
#define VK_NUMPAD7 103 //Numeric keypad 7 key
#define VK_NUMPAD8 104 //Numeric keypad 8 key
#define VK_NUMPAD9 105 //Numeric keypad 9 key
#define VK_MULTIPLY 106 //Multiply key
#define VK_ADD 107 //Add key
#define VK_SEPARATOR 108 //Separator key
#define VK_SUBTRACT 109 //Subtract key
#define VK_DECIMAL 110 //Decimal key
#define VK_DIVIDE 111 //Divide key
#define VK_F1 112 //F1 key
#define VK_F2 113 //F2 key
#define VK_F3 114 //F3 key
#define VK_F4 115 //F4 key
#define VK_F5 116 //F5 key
#define VK_F6 117 //F6 key
#define VK_F7 118 //F7 key
#define VK_F8 119 //F8 key
#define VK_F9 120 //F9 key
#define VK_F10 121 //F10 key
#define VK_F11 122 //F11 key
#define VK_F12 123 //F12 key
#define VK_F13 124 //F13 key
#define VK_NUMLOCK 144 //NUM LOCK key
#define VK_SCROLL 145 //SCROLL LOCK key
#define VK_LSHIFT 160 //Left SHIFT key
#define VK_RSHIFT 161 //Right SHIFT key
#define VK_LCONTROL 162 //Left CONTROL key
#define VK_RCONTROL 163 //Right CONTROL key
#define VK_LMENU 164 //Left MENU key
#define VK_RMENU 165 //Right MENU key
int CalcParam[][6];
string CalcText[][2];
color CalcColor[]={Silver, WhiteSmoke, Gray, Black};
color InfoColor[]={Black, WhiteSmoke, Gray, Lime};
int Size=10;
int X0=100;
int Y0=100;
int Width=135;
int Height=155;
int hwnd;
string Name;
int init(){
ObjectsDeleteAll();
Comment("");
ArrayResize(CalcParam,19);
ArrayResize(CalcText,19);
Name="Calc";
CalcParam[ 0,0]=100; CalcParam[ 0,1]=100; CalcParam[ 0,2]=135; CalcParam[ 0,3]=150; CalcParam[ 0,4]=0; CalcParam[ 0,5]=1; CalcText[ 0,0]=Name ; CalcText[ 0,1]="" ;
CalcParam[ 1,0]= 5; CalcParam[ 1,1]= 20; CalcParam[ 1,2]=125; CalcParam[ 1,3]= 20; CalcParam[ 1,4]=1; CalcParam[ 1,5]=2; CalcText[ 1,0]=Name+"I" ; CalcText[ 1,1]="" ;
CalcParam[ 2,0]= 5; CalcParam[ 2,1]=120; CalcParam[ 2,2]= 20; CalcParam[ 2,3]= 20; CalcParam[ 2,4]=2; CalcParam[ 2,5]=0; CalcText[ 2,0]=Name+"B0"; CalcText[ 2,1]="0";
CalcParam[ 3,0]= 5; CalcParam[ 3,1]= 95; CalcParam[ 3,2]= 20; CalcParam[ 3,3]= 20; CalcParam[ 3,4]=2; CalcParam[ 3,5]=0; CalcText[ 3,0]=Name+"B1"; CalcText[ 3,1]="1";
CalcParam[ 4,0]= 30; CalcParam[ 4,1]= 95; CalcParam[ 4,2]= 20; CalcParam[ 4,3]= 20; CalcParam[ 4,4]=2; CalcParam[ 4,5]=0; CalcText[ 4,0]=Name+"B2"; CalcText[ 4,1]="2";
CalcParam[ 5,0]= 55; CalcParam[ 5,1]= 95; CalcParam[ 5,2]= 20; CalcParam[ 5,3]= 20; CalcParam[ 5,4]=2; CalcParam[ 5,5]=0; CalcText[ 5,0]=Name+"B3"; CalcText[ 5,1]="3";
CalcParam[ 6,0]= 5; CalcParam[ 6,1]= 70; CalcParam[ 6,2]= 20; CalcParam[ 6,3]= 20; CalcParam[ 6,4]=2; CalcParam[ 6,5]=0; CalcText[ 6,0]=Name+"B4"; CalcText[ 6,1]="4";
CalcParam[ 7,0]= 30; CalcParam[ 7,1]= 70; CalcParam[ 7,2]= 20; CalcParam[ 7,3]= 20; CalcParam[ 7,4]=2; CalcParam[ 7,5]=0; CalcText[ 7,0]=Name+"B5"; CalcText[ 7,1]="5";
CalcParam[ 8,0]= 55; CalcParam[ 8,1]= 70; CalcParam[ 8,2]= 20; CalcParam[ 8,3]= 20; CalcParam[ 8,4]=2; CalcParam[ 8,5]=0; CalcText[ 8,0]=Name+"B6"; CalcText[ 8,1]="6";
CalcParam[ 9,0]= 5; CalcParam[ 9,1]= 45; CalcParam[ 9,2]= 20; CalcParam[ 9,3]= 20; CalcParam[ 9,4]=2; CalcParam[ 9,5]=0; CalcText[ 9,0]=Name+"B7"; CalcText[ 9,1]="7";
CalcParam[10,0]= 30; CalcParam[10,1]= 45; CalcParam[10,2]= 20; CalcParam[10,3]= 20; CalcParam[10,4]=2; CalcParam[10,5]=0; CalcText[10,0]=Name+"B8"; CalcText[10,1]="8";
CalcParam[11,0]= 55; CalcParam[11,1]= 45; CalcParam[11,2]= 20; CalcParam[11,3]= 20; CalcParam[11,4]=2; CalcParam[11,5]=0; CalcText[11,0]=Name+"B9"; CalcText[11,1]="9";
CalcParam[12,0]= 30; CalcParam[12,1]=120; CalcParam[12,2]= 20; CalcParam[12,3]= 20; CalcParam[12,4]=2; CalcParam[12,5]=0; CalcText[12,0]=Name+"BA"; CalcText[12,1]=".";
CalcParam[13,0]= 80; CalcParam[13,1]= 95; CalcParam[13,2]= 20; CalcParam[13,3]= 50; CalcParam[13,4]=2; CalcParam[13,5]=0; CalcText[13,0]=Name+"BB"; CalcText[13,1]="=";
CalcParam[14,0]=105; CalcParam[14,1]= 95; CalcParam[14,2]= 20; CalcParam[14,3]= 50; CalcParam[14,4]=2; CalcParam[14,5]=0; CalcText[14,0]=Name+"BC"; CalcText[14,1]="C";
CalcParam[15,0]= 80; CalcParam[15,1]= 70; CalcParam[15,2]= 20; CalcParam[15,3]= 20; CalcParam[15,4]=2; CalcParam[15,5]=0; CalcText[15,0]=Name+"BD"; CalcText[15,1]="+";
CalcParam[16,0]=105; CalcParam[16,1]= 70; CalcParam[16,2]= 20; CalcParam[16,3]= 20; CalcParam[16,4]=2; CalcParam[16,5]=0; CalcText[16,0]=Name+"BE"; CalcText[16,1]="-";
CalcParam[17,0]= 80; CalcParam[17,1]= 45; CalcParam[17,2]= 20; CalcParam[17,3]= 20; CalcParam[17,4]=2; CalcParam[17,5]=0; CalcText[17,0]=Name+"BF"; CalcText[17,1]="/";
CalcParam[18,0]=105; CalcParam[18,1]= 45; CalcParam[18,2]= 20; CalcParam[18,3]= 20; CalcParam[18,4]=2; CalcParam[18,5]=0; CalcText[18,0]=Name+"BG"; CalcText[18,1]="*";
return(0);
}
int deinit(){
Comment("");
CalcDelete();
return(0);
}
int start(){
int iCoords[2],iCoordsPrev[2];
hwnd=WindowHandle(Symbol(),Period());
int ActiveWindow=GetActiveWindow();
Name="Calc";
CalcRedRaw();
double num1=0,num2=0,num;
bool bPoint=false;
double mnum=0.1;
int oper;
while (!IsStopped()) {
if (ActiveWindow==GetActiveWindow()){
int X0=CalcParam[ 0][0];
int Y0=CalcParam[ 0][1];
int Width=CalcParam[ 0][2];
int Height=CalcParam[ 0][3];
GetAsyncKeyState(VK_LBUTTON);
CursorPos(iCoords);
for (int i=2;i<19;i++) CalcParam[i,5]=0;
if ( (iCoords[0]>=X0 && iCoords[0]<=X0+Width) && (iCoords[1]>=Y0 && iCoords[1]<=Y0+Height) ) {
for (i=2;i<19;i++) CalcParam[i,5]=1;
CalcRedRaw();
if (GetAsyncKeyState(VK_LBUTTON)) {
bool bkey=false;
for (i=2;i<19;i++) {
int X1=X0+CalcParam[i][0];
int X2=X1+CalcParam[i][2];
int Y1=Y0+CalcParam[i][1];
int Y2=Y1+CalcParam[i][3];
if ( (iCoords[0]>=X1 && iCoords[0]<=X2) && (iCoords[1]>=Y1 && iCoords[1]<=Y2) ) {
CalcParam[i,5]=2;
bkey=true;
if (i<12) {
if (!bPoint) {
num=num*10.0+(i-2);
} else {
num=num+(i-2)*mnum;
mnum*=0.1;
}
} else if (i==12) {
bPoint=true;
} else if (i==13) {
num2=num;
bPoint=false;
switch (oper){
case 1: num=num1+num2; break;
case 2: num=num1-num2; break;
case 3: if (num2!=0)
num=num1/num2;
break;
case 4: num=num1*num2;
}
} else if (i==14) {
bPoint=false;
num=0;
} else if (i>14) {
bPoint=false;
num1=num;
num=0;
oper=i-14;
}
CalcText[1,1]=DoubleToStr(num,8);
CalcRedRaw();
}
}
if (!bkey) {
while (GetAsyncKeyState(VK_LBUTTON)) {
iCoordsPrev[0]=iCoords[0];
iCoordsPrev[1]=iCoords[1];
CursorPos(iCoords);
CalcParam[0][0]+=(iCoords[0]-iCoordsPrev[0]);
CalcParam[0][1]+=(iCoords[1]-iCoordsPrev[1]);
CalcRedRaw();
}
}
}
}
CalcRedRaw();
}
RefreshRates();
Sleep(100);
}
}
void CalcRedRaw(){
int X0=CalcParam[ 0][0];
int Y0=CalcParam[ 0][1];
int Width=CalcParam[ 0][2];
int Height=CalcParam[ 0][3];
SetBackGround(CalcText[ 0,0], CalcText[ 0,1], X0, Y0, Width, Height, CalcColor, CalcParam[ 0,5]);
SetBackGround(CalcText[ 1,0], CalcText[ 1,1], X0+CalcParam[ 1,0], Y0+CalcParam[ 1,1], 125, 20, InfoColor, CalcParam[ 1,5]);
for (int i=2;i<19;i++)
SetBackGround(CalcText[i,0], CalcText[i,1], X0+CalcParam[i,0], Y0+CalcParam[i,1],CalcParam[i,2], CalcParam[i,3], CalcColor, CalcParam[ i,5]);
}
void CalcDelete(){
int X0=CalcParam[ 0][0];
int Y0=CalcParam[ 0][1];
int Width=CalcParam[ 0][2];
int Height=CalcParam[ 0][3];
DelBackGround(CalcText[0,0], X0, Y0, Width, Height);
for (int i=1;i<19;i++)
DelBackGround(CalcText[i,0], X0+CalcParam[i,0], Y0+CalcParam[i,1], CalcParam[i,2],CalcParam[i,3]);
}
void SetBackGround(string Name, string Text, int X0, int Y0, int Width, int Height, color CL[],int Status=0){
int Delta=3;
string txt=StringSetChar("",0,103), NameObject;
int CountX, CountY;
double DeltaX, DeltaY, X, Y;
int i, j;
CountX=(Width-Delta-2)/(Size+Delta);
if ((Width-Delta-2) % (Size+Delta) !=0) CountX++;
if (CountX<1) CountX=1;
DeltaX=((Width-Delta-2)/CountX);
CountY=(Height-Delta-2)/(Size+Delta);
if ((Height-Delta-2) % (Size+Delta) !=0) CountY++;
if (CountY<1) CountY=1;
DeltaY=((Height-Delta-2)/CountY);
color CL0=CL[0],
CL1=CL[0],
CL2=CL[0],
CL3=CL[3];
switch (Status) {
case 1:
CL1=CL[1];
CL2=CL[2];
break;
case 2:
CL1=CL[2];
CL2=CL[1];
break;
default:
CL1=CL[0];
CL2=CL[0];
break;
}
// Âåðõíÿÿ è íèæíÿÿ òåíü
X=X0+1;
Y=Y0;
Y=Y0+DeltaY*(CountY-1)+2;
for (i=0;i<CountX;i++) {
NameObject=Name+".0."+i+"."+0;
DrawObject(NameObject, txt, Size, "Webdings", X,Y0,CL1, false, 0);
NameObject=Name+".1."+i+"."+0;
DrawObject(NameObject, txt, Size, "Webdings", X,Y,CL2, false, 0);
X+=DeltaX;
}
// Ëåâàÿ è Ïðàâàÿ òåíü
X=X0+DeltaX*(CountX-1)+2;
Y=Y0+1;
for (j=0;j<CountY;j++) {
NameObject=Name+".2."+0+"."+j;
DrawObject(NameObject, txt, Size, "Webdings", X0,Y,CL2, false, 0);
NameObject=Name+".3."+0+"."+j;
DrawObject(NameObject, txt, Size, "Webdings", X,Y,CL1, false, 0);
Y+=DeltaY;
}
X=X0+1;
Y=Y0+1;
for (i=0;i<CountX;i++) {
Y=Y0+1;
for (j=0;j<CountY;j++) {
NameObject=Name+".4."+i+"."+j;
DrawObject(NameObject, txt, Size, "Webdings", X,Y,CL0, false, 0);
Y+=DeltaY;
}
X+=DeltaX;
}
if (StringLen(Text)>0) {
X=X0+(Width-StringLen(Text)*Size*0.8)/2.0+1;
Y=Y0+(Height-Size)/2.0+2;
NameObject=StringConcatenate(Name,".5");
DrawObject(NameObject, Text, Size, "Roman", X,Y,CL3, false, 0);
}
}
void DelBackGround(string Name, int X0, int Y0, int Width, int Height){
int Delta=3;
string NameObject;
int CountX, CountY;
int i, j;
CountX=(Width-Delta-2)/(Size+Delta);
if ((Width-Delta-2) % (Size+Delta) !=0) CountX++;
if (CountX<1) CountX=1;
CountY=(Height-Delta-2)/(Size+Delta);
if ((Height-Delta-2) % (Size+Delta) !=0) CountY++;
if (CountY<1) CountY=1;
// Âåðõíÿÿ è íèæíÿÿ òåíü
for (i=0;i<CountX;i++) {
NameObject=Name+".0."+i+"."+0;
if (ObjectFind(NameObject)!=-1) ObjectDelete(NameObject);
NameObject=Name+".1."+i+"."+0;
if (ObjectFind(NameObject)!=-1) ObjectDelete(NameObject);
}
// Ëåâàÿ è Ïðàâàÿ òåíü
for (j=0;j<CountY;j++) {
NameObject=Name+".2."+0+"."+j;
if (ObjectFind(NameObject)!=-1) ObjectDelete(NameObject);
NameObject=Name+".3."+0+"."+j;
if (ObjectFind(NameObject)!=-1) ObjectDelete(NameObject);
}
for (i=0;i<CountX;i++) {
for (j=0;j<CountY;j++) {
NameObject=Name+".4."+i+"."+j;
if (ObjectFind(NameObject)!=-1) ObjectDelete(NameObject);
}
}
NameObject=StringConcatenate(Name,".5");
if (ObjectFind(NameObject)!=-1) ObjectDelete(NameObject);
}
void DrawObject(string Name, string Text, int Size, string Font, int X, int Y, color CLR, bool bBack=false,int Angle=0){
if (ObjectFind(Name)==-1) ObjectCreate(Name, OBJ_LABEL, 0, 0,0,0,0);
ObjectSet(Name, OBJPROP_CORNER, 0 );
ObjectSet(Name, OBJPROP_XDISTANCE, X );
ObjectSet(Name, OBJPROP_YDISTANCE, Y );
ObjectSet(Name, OBJPROP_BACK, bBack );
ObjectSet(Name, OBJPROP_ANGLE, Angle );
ObjectSetText(Name,Text, Size, Font, CLR );
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CursorPos(int &pos[]){
int i,x,y,sz;
int mPos[2];
int rect[4];
int prom[4];
hwnd=WindowHandle(Symbol(),Period());
GetWindowRect(hwnd,rect);
GetCursorPos(mPos);
pos[0] =-rect[0]+mPos[0];
pos[1] =-rect[1]+mPos[1];
}
Comments