Author: Copyright � 2011, Victor Niclolaev aka Vinin
0 Views
0 Downloads
0 Favorites
sCalc
//+------------------------------------------------------------------+
//|                                                        #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