Borland C++ Builder VCL FAQ - Как ограничить перемещение курсора заданной областью?

ОГЛАВЛЕНИЕ


Как ограничить перемещение курсора заданной областью?

Иногда вам может потребоваться органичение перемещения курсора мыши заданой прямоугольной областью. Рассмотрим, как это делается, на примере формы (Form1), а далее вы сможете переделать данный код так, как вам необходимо.

Добавьте в заголовочный файл формы в секцию private два следующих объявления:
TCursor FCursor;
bool FFlag;
А в cpp-файле напишите три следующих обработчика:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
  {
    if(FFlag)
      {
        if(Mouse->CursorPos.x <= (Left + 50))
          SetCursorPos((Left + 50), Mouse->CursorPos.y);

        if(Mouse->CursorPos.x >= (Left + Width - 50))
          SetCursorPos((Left + Width - 50), Mouse->CursorPos.y);

        if(Mouse->CursorPos.y <= (Top + 50))
          SetCursorPos(Mouse->CursorPos.x, (Top + 50));

        if(Mouse->CursorPos.y >= (Top + Height - 50))
          SetCursorPos(Mouse->CursorPos.x, (Top + Height - 50));
      }
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
  {
    FFlag = true;
    FCursor = Cursor;
    Screen->Cursor = crDrag;
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
  {
    FFlag = false;
    Screen->Cursor = FCursor;
  }
//---------------------------------------------------------------------------
Теперь область перемещения курсора внутри формы при удерживаемой нажатой кнопке мыши будет на 50 пикселей меньше относительно каждой из границ формы, то есть, вы не сможете переместить курсор при нажатой кнопке мыше к краю формы ближе, чем на 50 пикселей.