Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизMOuseMove и ширина понели на StatusBar Найти похожие ветки
← →
AAsdr (2012-07-12 11:15) [0]Здравсвуйте!
У меня есть StstusBar внизу формы. Данный StatusBar разделяется на четыре части (панельки). Каждая из панелек содержит собственную информацию. Мне необходимо узнать когда пользователь навел мышь на панельки 1, 2, 3 или 4. У этих панелек в Statusbar нет собственного события OnMouseMove - оно есть только у StstusBar в целом.
Я попытался сравнить координату X события mouseMove StstusBar с Width первой панели и если X>Width то это означает, что пользователь перевел курсор на вторую ппнельку и т.д..
Но что-то не срабатывает, программа показывает мне что курсор уже перешел на вторую панельку, хотя я еще нахожусь в середине первой. По ходу X и width меряются в разных единицах измерения и необходим перевод из одной в другую. Не подскажите - как это сделать?
← →
brother © (2012-07-12 11:18) [1]имхо, ты не учитываешь толшину бордюра...
← →
AAsdr (2012-07-12 11:18) [2]Что за бордюр?
← →
brother © (2012-07-12 11:20) [3]смотри:
|----|---|-----|
Где:
| - бордюр
-x- - ширины панелей...
← →
brother © (2012-07-12 11:21) [4]> ширины
*ширина О_о
← →
brother © (2012-07-12 11:21) [5]> толшину
*толщину О_о ппц.
← →
brother © (2012-07-12 11:22) [6]> По ходу X и width меряются в разных единицах измерения
нет, везде в пикселах! ;)
← →
brother © (2012-07-12 11:34) [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;
← →
AV © (2012-07-12 11:35) [8]там немного, не так же, что
> курсор уже перешел на вторую панельку, хотя я еще нахожусь
> в середине первой
практически, работает правильно. До пиксела смотреть никто не станет :)
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;
← →
Омлет © (2012-07-12 11:44) [9]
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;
← →
brother © (2012-07-12 11:47) [10]> StatusBar1.Perform(SB_GETRECT, i, integer(@r));
догадывался, что подобное можно реализовать)
← →
AAsdr (2012-07-12 11:53) [11]Спасибо всем за помощь!
У меня на самом деле не совсем классический StatusBar а от DevExpress. У них это к сожалению не срабатывает
← →
brother © (2012-07-12 11:58) [12]блин, с этого и надо было начинать!
← →
Омлет © (2012-07-12 11:59) [13]> от DevExpress.
Там поди есть CalcHitInfo.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.077 c