전문가의 말: MQL에서 마우스 스크롤 값을 얻는 방법은 무엇입니까? [다섯 번째 포럼에서 다시 게시] - 페이지 7

 
Artyom Trishkin :

무엇이 그를 도울 것입니까? 당신의 영예는? 당신은 해결책을 보여주지 않았습니다. 당신은 자신을 보여주었습니다. 그러나 이것은 매우, 매우 기대됩니다.

왜요? 약간의 사고 과정과 모든 사람이 솔루션을 찾을 수 있습니다. 나는 그것을 찾을 수있는 힌트를 주었다. 탐색할 방향. 결국, 모든 것을 은색 접시에 담는 것은 흥미롭지 않습니다. )) 필요한 경우 사람을 돕고 결정을 내릴 수 있습니다. 하지만 당신은 나와 논쟁하고 싶어하는 것 같습니다.)
 
Vitaly Muzichenko :

그게 뭔가요?

당신은 잘못된 경향이 있습니다. 먼저 나에게 무언가를 외친 다음(예: "당신의 코드는 슬래그입니다", "necroposter") 문제에 대한 해결책을 묻고 토론합니다. 그러니 스스로 생각하십시오.

아니면 내가 그것을 받을 자격이 있는 사람들을 도울 때까지 기다리십시오.

 
Artyom Trishkin :

무엇이 그를 도울 것입니까? 당신의 영예는? 당신은 해결책을 보여주지 않았습니다. 당신은 자신을 보여주었습니다. 그러나 이것은 매우, 매우 기대됩니다.

당신은 놀랍게도 부주의합니다.

봐, 내가 답장한 게시물의 맨 아래에 어떤 사람이 그에게 아이디어를 "밀어 줘"라고 묻는다. 그는 준비된 해결책을 요구하지 않습니다. 여기 내가 밀어 붙이려고 한 것이 있습니다. 이제 당신의 개입이 얼마나 부적절하고 우스꽝스러운지 이해합니까? 그것은 쓸데없는 홍수 외에는 아무 것도 수반하지 않습니다. 실제로 의사 소통하는 것이 좋습니다. 자신과 다른 사람들에게 더 많은 혜택을 제공합니다.

 
Реter Konow :

당신은 잘못된 경향이 있습니다. 먼저 나에게 무언가를 외친 다음(예: "당신의 코드는 슬래그입니다", "necroposter") 문제에 대한 해결책을 묻고 토론합니다. 그러니 스스로 생각하십시오.

아니면 내가 그것을 받을 자격이 있는 사람들을 도울 때까지 기다리십시오.

나는 묻지 않고 사실을 말했다.

 
Vitaly Muzichenko :

나는 묻지 않고 사실을 말했다.

무슨 사실?
 

여기 양식 뒤에 있는 많은 사람들이 내용을 보지 못합니다. 그들은 아이디어와 그것을 구현할 능력이 없으면 형식의 엄격함이 양질의 콘텐츠를 낳지 않는다는 것을 이해할 수 없습니다.

본질은 여러 형태의 화신을 가질 수 있으며 편협한 사람만이 표현의 언어로 판단할 수 있습니다.

 
Vitaly Muzichenko :

나는 묻지 않고 사실을 말했다.

저도 사실을 말씀드립니다.

당신의 "제품"은 평범하고 어리석은 시도입니다.

이런 쓰레기는 오랜만에 본다!


솔직한 비판을 마음으로 받아들이지 마십시오. :)

 
Реter Konow :
왜요? 약간의 사고 과정과 모든 사람이 해결책을 찾을 수 있습니다. 나는 그것을 찾을 수있는 힌트를 주었다. 탐색할 방향. 결국, 모든 것을 은색 접시에 담는 것은 흥미롭지 않습니다. )) 필요한 경우 사람을 돕고 결정을 내릴 수 있습니다. 하지만 당신은 나와 논쟁하고 싶어하는 것 같습니다.)

이봐 피터!
MQL을 사용하여 마우스 휠로 스크롤하는 실제적인 실용적인 솔루션이 있다고 말하고 싶습니까? 그리고 키보드 화살표나 마우스 키가 아닌 염소가 이해하는 것입니다. 물론 CHARTEVENT_CHART_CHANGE 이벤트를 사용하여 키를 누르지 않은 경우 휠을 사용하여 차트가 스크롤된다는 사실을 설정할 수 있습니다. 이 이벤트는 새로운 막대 가 도착하거나 수직 규모의 변화로 이어지는 급격한 가격 변화와 함께 발생할 수 있습니다. 또한 이 방법을 사용하면 예를 들어 차트가 가장 왼쪽 또는 오른쪽 위치에 도달했을 때, 차트가 스크롤되지 않도록 하는 방법과 같은 휠 스크롤 이벤트를 항상 가져오는 것은 불가능합니다. 아마도 ChartNavigate 기능을 사용하여 차트를 뒤로 이동하는 것을 의미하지만 이것은 또한 매우 비뚤어진 구현이 될 것이며 마우스 휠을 스크롤하는 것 외에 차트를 변경하는 다른 모든 이유를 올바르게 필터링하는 것은 거의 불가능합니다. 내 생각에 이것은 MT를 해킹하거나 문서화되지 않은 명령 및(또는) 이벤트를 알아야만 수행할 수 있습니다. 일반적으로 나는 당신이 그러한 구현의 예를 가지고 있다고 믿지 않습니다.

그런데 이상한 힌트가 있습니다. 실질적으로 "마우스 휠을 통해 스크롤링 이벤트를 얻는 방법"이라는 질문에 " 스크롤링 이벤트와 그래프를 이동하는 기능을 사용하십시오. "라는 대답을 제공합니다.

어쩌면 내가 틀렸을 수도 있습니다. 그리고 당신은 정말로 예를 가지고 있습니다. 그렇다면 당신은 나쁜 사람입니다! )) 그렇다면 적어도 코드가 아닌 ex4(ex5) 파일을 삭제하십시오.

 
Nikolai Semko :

이봐 피터!
MQL을 사용하여 마우스 휠로 스크롤하는 실제적인 실용적인 솔루션이 있다고 말하고 싶습니까? 그리고 키보드 화살표나 마우스 키가 아닌 염소가 이해하는 것입니다. 물론 CHARTEVENT_CHART_CHANGE 이벤트를 사용하여 키를 누르지 않은 경우 휠을 사용하여 차트가 스크롤된다는 사실을 설정할 수 있습니다. 이 이벤트는 새로운 막대 가 도착하거나 수직 규모의 변화로 이어지는 급격한 가격 변화와 함께 발생할 수 있습니다. 또한 이 방법을 사용하면 예를 들어 차트가 가장 왼쪽 또는 오른쪽 위치에 도달했을 때, 차트가 스크롤되지 않도록 하는 방법과 같은 휠 스크롤 이벤트를 항상 가져오는 것은 불가능합니다. 아마도 ChartNavigate 기능을 사용하여 차트를 뒤로 이동하는 것을 의미하지만 이것은 또한 매우 비뚤어진 구현이 될 것이며 마우스 휠을 스크롤하는 것 외에 차트를 변경하는 다른 모든 이유를 올바르게 필터링하는 것은 거의 불가능합니다. 내 생각에 이것은 MT를 해킹하거나 문서화되지 않은 명령 및(또는) 이벤트를 알아야만 수행할 수 있습니다. 일반적으로 나는 당신이 그러한 구현의 예를 가지고 있다고 믿지 않습니다.

그런데 이상한 힌트가 있습니다. 실질적으로 "마우스 휠을 통해 스크롤링 이벤트를 얻는 방법"이라는 질문에 " 스크롤링 이벤트와 그래프를 이동하는 기능을 사용하십시오. "라는 대답을 제공합니다.

어쩌면 내가 틀렸을 수도 있습니다. 그리고 당신은 정말로 예를 가지고 있습니다. 그렇다면 당신은 나쁜 사람입니다! )) 그렇다면 적어도 코드가 아닌 ex4(ex5) 파일을 삭제하십시오.

안녕 니콜라이!

믿거나 말거나 해결 방법은 매우 간단합니다. 15-20줄의 코드가 필요합니다. 사실, 스크롤 메커니즘 구현의 세부 사항인 뉘앙스가 있습니다. 내 구현은 표준 구현과 약간 다릅니다. 메커니즘은 개체가 아니라 캔버스를 스크롤합니다. Anatoly의 라이브러리에서 유사한 구현을 사용할 수 있습니다.

나는 정말로 바퀴로 스크롤하고 차트의 움직임에 "붙어"나는 에너지의 효과를 얻습니다. 그래프는 물론 비틀거리지만 항상 원래 위치로 돌아갑니다. 이것이 바로 그래프 시프트 기능입니다. 또한 mql 함수에서 차트 이동의 방향을 얻습니다. 따라서 아무 것도 해킹할 필요가 없습니다.) MQ는 거의 모든 작업의 구현을 위해 가능한 한 가장 광범위한 기능을 제공하려고 했습니다. 심지어 놀랍습니다. 아마도 그들 자신은 개발자에게 열려 있는 모든 가능성을 알지 못했을 것입니다.)

 
Nikolai Semko :

일반적으로 나는 당신이 그러한 구현의 예를 가지고 있다고 믿지 않습니다.

그런데 이상한 힌트가 있습니다. 실질적으로 "마우스 휠을 통해 스크롤링 이벤트를 얻는 방법"이라는 질문에 " 스크롤링 이벤트와 그래프를 이동하는 기능을 사용하십시오. "라는 대답을 제공합니다.

어쩌면 내가 틀렸을 수도 있습니다. 그리고 당신은 정말로 예를 가지고 있습니다. 그렇다면 당신은 나쁜 사람입니다! )) 그렇다면 적어도 코드가 아닌 ex4(ex5) 파일을 삭제하십시오.

여기에 그러한 상황이 있습니다. 내가 응답한 사람은 휠 스크롤 메커니즘을 구현하는 방법에 대한 아이디어를 알려달라고 요청했습니다. 나는 그에게 암시했다. 지역의 악의를 품은 사람들은 즉시 흥분하여 내가 자랑거리와 다른 말도 안되는 소리를 한다고 비난하기 시작했습니다.

그들의 입장에서는 내가 해결책을 제시하면 내 제품을 광고하거나 그냥 과시하고, 그렇지 않으면 모두를 속이고 아무 것도 가질 수 없습니다.

코드를 배치할 수 있지만 먼저 스크롤 메커니즘 구현과 분리되고 두 번째로 러시아어로 분리됩니다. 그러나 스크롤 메커니즘에 맞게 조정할 수 있습니다. 나는 ex4를 게시할 수 없습니다. 왜냐하면 그것이 작동하는 통합 그래픽 환경에서 단일 메커니즘을 "끌어낼" 수 없기 때문입니다.

가장 좋은 선택은 결정을 일반적인 용어로 전달하는 것이지만, 아무것도 증명할 목적이 아니라 우정을 기반으로 합니다.

그래서:

CHARTEVENT_CHART_CHANGE 이벤트는 무엇보다도 커서가 차트 위에 있는 경우 마우스 휠 이동 이벤트에서 생성됩니다. 그래프 이동 옵션을 활성화해야 합니다. 따라서 그래프를 이동하여 바퀴를 돌린 시점을 정확히 알 수 있습니다. 맞춤형 이벤트를 생성할 수 있습니다. 예: "SCROLLER_EVENT".

다음으로 우리의 임무는 변위의 방향을 결정하는 것입니다. 이를 위해 ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR ); 각 "SCROLLER_EVENT" 이벤트에서 우리는 첫 번째 보이는 막대의 수를 얻고 그것이 우리가 기록한 이전 막대의 수보다 크거나 작은지 결정합니다. 많으면 한 방향으로, 적으면 반대 방향으로 이동하십시오. 동시에 차트도 스크롤되어 맨 끝에 놓일 수 있습니다. 이를 방지하기 위해 ChartNavigate 함수를 사용하여 위치를 수정하고 차트를 원래 위치로 설정합니다. 이 호출을 통해 CHARTEVENT_CHART_CHANGE 이벤트도 생성하고 스크롤이 중단됩니다. 따라서 차트 위치 수정 시 CHARTEVENT_CHART_CHANGE 이벤트를 건너뛰고 이에 반응하지 않아야 합니다. 이렇게 하려면 플래그 시스템을 사용해야 합니다.

내 코드는 다음과 같습니다.

 //=====================================================================================================================================    
 if (id == CHARTEVENT_CHART_CHANGE && !n)
   {
     if (СОБЫТИЕ_ИНТЕРФЕЙСА != _SCROLLER_EVENT)
      {
       СОБЫТИЕ_ИНТЕРФЕЙСА = _SCROLLER_EVENT; 
      } 
     //------------------------------------  
     if (!Номер_первого_бара){ ChartNavigate ( 0 , CHART_END ,- 100 ); Номер_первого_бара = ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR );}
    //------------------------------------     
    Номер_этого_бара = ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR );
     //------------------------------------
     int Основание_выпадающего_списка = КАНВАС - 1 ;
     int Ползунок_                    = КАНВАС + 4 ;
     int Вертикальная_полоса          = КАНВАС + 2 ;
     //------------------------------------
     if (Номер_этого_бара > Номер_первого_бара)
      {
       Прокрутка_вниз = 1 ;
       Прокрутка_вверх = 0 ;
       Сдвиг = 25 ;
       n = 1 ;
      }
     if (Номер_этого_бара  < Номер_первого_бара) 
      {
       Прокрутка_вниз = 0 ;
       Прокрутка_вверх = 1 ;
       Сдвиг = - 25 ;
       n = 1 ;
      } //Alert(__FUNCTION__," Номер_первого_бара   ",Номер_первого_бара,"  Номер_этого_бара  ",Номер_этого_бара);  
     //------------------------------------
     if (КАТЕГОРИЯ_КАНВАСА_ОБЪЕКТА == _SCROLL_BAR_CANVAS && !G_CORE[ОКНО][Вертикальная_полоса][_OBJECT_HIDE])
      {
       int Поле_обзора = G_CORE[ОКНО][КАНВАС][_VIEW_SQUARE];
       //Элемент которому принадлежит сам канвас.
       int Элемент_прокручиваемого_канваса =  G_CORE[ОКНО][КАНВАС][_MAIN_ELEMENT];
       //Канвас элемента, которому принадлежит прокручиваемый канвас.
       int Канвас_того_элемента = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_DROWING_CANVAS];
       int Группа_элемента_прокручиваемого_канваса = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_OBJECT_GROUP];

       //------------------------------------
       G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] -= Сдвиг;
       //------------------------------------
       if (G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] > G_CORE[ОКНО][Поле_обзора][_Y])
        {          
         G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = G_CORE[ОКНО][Поле_обзора][_Y];
        } 
       if ((G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] + G_CORE[ОКНО][КАНВАС][_Y_SIZE]) < (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]))
         {
          G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]) - G_CORE[ОКНО][КАНВАС][_Y_SIZE];
         }
       //------------------------------------  
       G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] = G_CORE[ОКНО][Поле_обзора][_Y] - G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y];  
       //------------------------------------
       ObjectSetInteger ( 0 ,G_CORE[ОКНО][КАНВАС][_NAME], OBJPROP_YOFFSET ,G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]);
       //------------------------------------ 
       G_CORE[ОКНО][Ползунок_][_Y] = G_CORE[ОКНО][Вертикальная_полоса][_Y] + (( double )G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] / (( double )G_CORE[ОКНО][Ползунок_][_V_SCROLL_BAR_HANDLE_STEP] / 10000 ));
       //------------------------------------ 
       if (Группа_элемента_прокручиваемого_канваса == VIEW_BOX)
         {
          Нарисовать_элемент(ОКНО,Канвас_того_элемента,Элемент_прокручиваемого_канваса);
         } 
       //------------------------------------
       if (Группа_элемента_прокручиваемого_канваса == DROP_LIST)
         {
          Нарисовать_элемент(ОКНО,Поле_обзора,Элемент_прокручиваемого_канваса);
         } 
      }    
  }
//------------------------------------------------------
if (qw){n = 0 ; qw = 0 ;} 
if (n == 1 ){ ChartNavigate ( 0 , CHART_END ,- 100 );  qw = 1 ;} 
//------------------------------------------------------
//Alert(__FUNCTION__,"  Прокрутка_вниз  ",Прокрутка_вниз,"  Прокрутка_вверх  ",Прокрутка_вверх);
//=====================================================================================================================================   



추가됨:

일정 변경의 다른 이유는 물론 시스템에 오류가 발생할 수 있습니다. 그러나 이러한 오류는 너무 작아서 주의를 기울일 가치가 거의 없습니다. 음, 새 막대는 캔버스를 몇 픽셀 이동합니다... 무섭지 않습니다. 그리고 이때 커서만 스크롤 캔버스 위에 있는 경우입니다.

물론 구현은 교착 상태에서 탈출구를 찾으려는 시도입니다. 휠로 스크롤할 가능성이 완전히 없기 때문에 이것은 가장 간단하고 "기본" 솔루션입니다. 완전한 솔루션을 얻기 위해 이미 서비스 데스크에 연락했습니다 . 글쎄, 여부는 개발자에게 달려 있습니다.