Пятница - 23.04.2021 - 07:44:18
2642
0
   В одной из программ использовал компонент TabControl. Этом компонент используется для отображения вкладок. В отличии от PageControl он не имеет страниц. Захотелось сделать так, чтобы вкладки можно было перемещать с места на место с помощью мыши (Drag&Drop) как, например, в веброузере «Опера». Поискав в интернете, так ничего и не нашел. Нашел было код на Delphi, но он мне не понравился. Решил поупражняться сам и, знаете, получилось. Оказалось все предельно просто. Среда программирования C++Builder 6.

6. Перемещение вкладок TabControl (Drag&Drop).

 
//--------------объвляем индекс вкладки в файле *.h----------------------------
int indtab;


//----------  файл *.срр---------------
int __fastcall TFMain::ItemAtPos(HWND TabControlHandle, int X, int Y)
{
 TTCHitTestInfo HitTestInfo;
 int HitIndex;

 HitTestInfo.pt.x= X;
 HitTestInfo.pt.y= Y;
 HitTestInfo.flags= 0;
 HitIndex = SendMessage(TabControlHandle, TCM_HITTEST, 0, long(&HitTestInfo));
 return HitIndex;
}
//---------------------------------------------------------------------------
void __fastcall TFMain::TabControl1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
 indtab=ItemAtPos(TabControl1->Handle,X,Y);
}
//---------------------------------------------------------------------------
void __fastcall TFMain::TabControl1DragOver(TObject *Sender,
      TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
 Accept=Sender->ClassNameIs("TTabControl");
}
//---------------------------------------------------------------------------
void __fastcall TFMain::TabControl1DragDrop(TObject *Sender,
      TObject *Source, int X, int Y)
{
 TTabControl *pTabcontr=(TTabControl *)Sender;

 POINT p;
 p.x=X;
 p.y=Y;
 int tabpos=pTabcontr->IndexOfTabAt(p.x,p.y);
 pTabcontr->Tabs->Move(indtab,tabpos);
}
//---------------------------------------------------------------------------
void __fastcall TFMain::TabControl1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
 TabControl1->BeginDrag(0);
}
//---------------------------------------------------------------------------