![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Что за бордюр?