Форум — Ответы     (  К темам )
 ?  job_andrey: Как сделать "ручку-хваталку" для окна? (27-02-2003 15:57:19)
Можно ли каким-нить несложным билдеровским способом сотворить "ручку-хваталку" для окна. Т.е., допустим, что у меня в окне есть какой-нить простой элемент, например Image. Я хочу схватить мышой за него и dragить его вместе с окном.
 Andrew (27-02-2003 19:38:00)
Вот не совсем билдеровским, но думать не надо :)

void __fastcall TfrmMain::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
const int SC_DRAGMOVE = 0xF012;//
if(WindowState!=wsMaximized) { //Проверка, чтобы не таскать распахнутое
ReleaseCapture(); //
Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
} //if(WindowState!=wsMaximized)
}

А если хочется чисто билдеровским :))), то:

bool bMove = false; //Признак операции перемещения
TPoint StartPos; //Опорная точка

void __fastcall TfrmMain::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{ //
if (Button == mbLeft) { //Если нажата левая кнопка, то
StartPos = Point(X, Y); //Запоминаем позицию курсора
bMove = true; //Взводим Признак режима перемещения
} //if (Button == mbLeft)
} //
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{ //
if (bMove) { //Если в режиме перемещения, то
Left += X — StartPos.x; //Сдвинуть по горизонтали
Top += Y — StartPos.y; //Сдвинуть по вертикали
StartPos = Point(X, Y); //Запомнить новую позицию
} //if (bMove)
//Чтобы уменьшить колич перемещений можно менять сразу все координату через //BoundsRect

} //
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{ //
if (bMove) //
StartPos = Point(0, 0); //Отменить режим
} //
//---------------------------------------------------------------------------
 Andrew (27-02-2003 19:38:57)
Немного промахнулся ...

void __fastcall TfrmMain::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{ //
if (bMove) //
bMove = false; //Отменить режим
} //
//---------------------------------------------------------------------------
 Владимир (01-03-2003 16:36:21)
Как схватить окно за любой элемент и таскать его — это уже есть в этом форуме Вот нашел
// таскаем форму за форму (вместо формы поместите этот код например
// в TLabel и будете таскать за TLabel и т.д.)
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
const int SC_DRAGMOVE = 0xF012;
if(WindowState!=wsMaximized)
{
ReleaseCapture();
Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
}
}