Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > как проще получить индекс панели в StatusBar


Автор: 2508 20.5.2007, 05:57
Есть ли более простой способ узнать индекс панели в статус баре непосредственно по клику мышки без пересчета ХУ и Width панелей по MouseDown?

Автор: Klin 20.5.2007, 11:32
А какой панели вы говорите? Компонент какой? Уточните.

Автор: Partizan 20.5.2007, 11:46
Klin, о статус баре речь видимо.... там же полосу статусбара можно разделить на несколько частей и у каждой будет свой индекс...

Автор: 2508 20.5.2007, 16:37
 см. картинку

Автор: Klin 20.5.2007, 17:14
Сорри, не увидел, что компонент в названии темы указан. Старый стал. smile ИМХО такой функции нет, StatusBar - изначально служит для вывода информации. Используйте другой компонент (например ToolBar) или просто напишите функцию для OnClick.

Автор: 2508 20.5.2007, 17:27
Мнр нравится, когда клик по статус бару позволяет переключать контекст или вызывать меню...
Для тех кому /то тоже нравится привожу код.
Код

//---------------------------------------------------------------------------
void __fastcall TForm1::StatusBar1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  int i = 0, x = 0;
  while (i < StatusBar1->Panels->Count - 1) {
    x += StatusBar1->Panels->Items[i]->Width;
    if (x > X) break;
    i++;
  }
  ShowMessage(IntToStr(i));
}
//---------------------------------------------------------------------------

Просто очень не хотелось бы использовать MouseDown, а на OnClick не знаю как...

Автор: Klin 20.5.2007, 20:38
Цитата(2508 @  20.5.2007,  18:27 Найти цитируемый пост)
а на OnClick не знаю как...

Практически также, используется функция GetCursorPos.

Код

TPoint mouse;
GetCursorPos(&mouse);
iny X = mouse.x , Y = mouse.y - StatusBar1->Top;
...


Примерно так.

Автор: 2508 20.5.2007, 20:58
Не вижу чем это решение лучше...

Автор: Klin 20.5.2007, 23:29
Ни чем smile, но вы же сами для OnClick просили, а если серьезно, то можно поиграться smile
Код


void __fastcall TForm1::MyClick(TObject *Sender)
{
 ShowMessage(((TPaintBox*)Sender)->Name);  // вместо этого - ваши действия
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
const count = 3; // Количество панель в статусе (непомню, как свойство компонента в константу запихнуть)
TPaintBox *Box[count];
 for (int i=0; i<count; i++) {
  Box[i] = new TPaintBox (StatusBar1);
  Box[i]->Name = "Box" + IntToStr(i+1);
  Box[i]->Left = 0;
  for (int n = 0; n<i; n++)
   Box[i]->Left+= StatusBar1->Panels->Items[i]->Width;
  if (StatusBar1->Panels->Count-1 != i)
   Box[i]->Width = StatusBar1->Panels->Items[i]->Width;
  else Box[i]->Width = this->Width - Box[i]->Left;
  Box[i]->Parent = StatusBar1;
  Box[i]->OnClick = MyClick;
 }
}
//---------------------------------------------------------------------------


Только в h файле незабудь прописать:

Код

        void __fastcall MyClick(TObject *Sender);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)