Borland C++ Builder VCL FAQ - Как ограничить перемещение курсора заданной областью?
ОГЛАВЛЕНИЕ
Страница 79 из 96
Как ограничить перемещение курсора заданной областью?
Иногда вам может потребоваться органичение перемещения курсора мыши заданой прямоугольной областью. Рассмотрим, как это делается, на примере формы (Form1), а далее вы сможете переделать данный код так, как вам необходимо.Добавьте в заголовочный файл формы в секцию private два следующих объявления:
TCursor FCursor;А в cpp-файле напишите три следующих обработчика:
bool FFlag;
//---------------------------------------------------------------------------Теперь область перемещения курсора внутри формы при удерживаемой нажатой кнопке мыши будет на 50 пикселей меньше относительно каждой из границ формы, то есть, вы не сможете переместить курсор при нажатой кнопке мыше к краю формы ближе, чем на 50 пикселей.
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;
}
//---------------------------------------------------------------------------