Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MOuseMove и ширина понели на StatusBar [D2005, XP]


AAsdr ©   (2012-07-12 11:15:00) 

Здравсвуйте!
У меня есть StstusBar внизу формы. Данный StatusBar разделяется на четыре части (панельки). Каждая из панелек содержит собственную информацию. Мне необходимо узнать когда пользователь навел мышь на панельки 1, 2, 3 или 4. У этих панелек в Statusbar нет собственного события OnMouseMove - оно есть только у StstusBar  в целом.

Я попытался сравнить координату X события mouseMove  StstusBar с Width первой панели и если X>Width  то это означает, что пользователь перевел курсор на вторую ппнельку и т.д..
Но что-то не срабатывает, программа показывает мне что курсор уже перешел на вторую панельку, хотя я еще нахожусь в середине первой. По ходу X  и width меряются в разных единицах измерения и необходим перевод из одной в другую. Не подскажите - как это сделать?


Омлет   (2012-07-12 11:59:00) [1]

> от  DevExpress.

Там поди есть CalcHitInfo.


brother   (2012-07-12 11:58:00) [2]

блин, с этого и надо было начинать!


AAsdr   (2012-07-12 11:53:00) [3]

Спасибо всем за помощь!
У меня на самом деле не совсем классический StatusBar а от  DevExpress. У них это к сожалению не срабатывает


brother   (2012-07-12 11:47:00) [4]

>   StatusBar1.Perform(SB_GETRECT, i, integer(@r));

догадывался, что подобное можно реализовать)


Омлет   (2012-07-12 11:44:00) [5]

uses CommCtrl;

procedure TMainForm.StatusBar1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 i: integer;
 r: TRect;
begin
 for i := 0 to StatusBar1.Panels.Count - 1 do
 begin
   StatusBar1.Perform(SB_GETRECT, i, integer(@r));
   if PtInRect(r, Point(x, y)) then
     Caption := IntToStr(i)
 end;
end;


AV   (2012-07-12 11:35:00) [6]

там немного, не так же, что

> курсор уже перешел на вторую панельку, хотя я еще нахожусь
> в середине первой


практически, работает правильно. До пиксела смотреть никто не станет :)
procedure TForm1.sb1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 i: Integer;
 n: Integer;
begin
 n := 0;
 for i := 0 to sb1.Panels.Count - 1 do
 begin
   n := n + sb1.Panels[i].Width;// + sb1.BorderWidth;
   if n > x then
   begin
     sb1.Panels[i].Text :=  Format('x=%d, y=%d, N=%d', [X,Y,i]);
     Exit;
   end;
 end;
end;


brother   (2012-07-12 11:34:00) [7]

нет, эт я чет тупанул, все работает как надо:
procedure TForm1.StatusBar1MouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
begin
 caption:= IntToStr(x);

 if x<= StatusBar1.Panels[0].Width then label1.Caption:='0'
 else
 if x<= StatusBar1.Panels[0].Width + StatusBar1.Panels[1].Width then label1.Caption:='1'
 else
 label1.Caption:='2'
end;


brother   (2012-07-12 11:22:00) [8]

> По ходу X  и width меряются в разных единицах измерения

нет, везде в пикселах! ;)


brother   (2012-07-12 11:21:00) [9]

> ширины

*ширина О_о


brother   (2012-07-12 11:21:00) [10]

> толшину

*толщину О_о ппц.


brother   (2012-07-12 11:20:00) [11]

смотри:
|----|---|-----|
Где:
|     - бордюр
-x-   - ширины панелей...


brother   (2012-07-12 11:18:00) [12]

имхо, ты не учитываешь толшину бордюра...


AAsdr   (2012-07-12 11:18:00) [13]

Что за бордюр?


Наверх

Титульная страница Поиск, карта сайта Написать письмо