Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

Хм, а как запуздырить иконку в StatusBar?   Найти похожие ветки 

 
Kolan ©   (2008-01-16 14:45) [0]

Пробовал так:
procedure TMainForm.DrawCalendarIconInStatusBar(AStatusBar: TStatusBar;
 AImageList: TImageList; AImageIndex: Integer);
begin
 if Assigned(AStatusBar) and Assigned(AImageList) then
 begin
   AImageList.Draw(AStatusBar.Canvas, 2, 2, AImageIndex);
 end;
end;

не видно ничего&#133


 
Palladin ©   (2008-01-16 15:11) [1]

дык рисование то нужно делать на tstatusbar.ondrawpanel и ей (панели) еще ко всему прочему нужно выставить Style:=psOwnerDraw


 
Kolan ©   (2008-01-16 15:13) [2]

угу, шас попробую&#133


 
Kolan ©   (2008-01-16 15:21) [3]

Так:
procedure TMainForm.DrawIconOnStatusBar(AStatusBar: TStatusBar;
 AImageList: TImageList; AImageIndex: Integer; AnOffset: TPoint);
begin
 if Assigned(AStatusBar) and Assigned(AImageList) then
 begin
   AImageList.Draw(AStatusBar.Canvas, AnOffset.X, AnOffset.Y, AImageIndex);
 end;
end;

procedure TMainForm.StatusBarDrawPanel(StatusBar: TStatusBar;
 Panel: TStatusPanel; const Rect: TRect);
begin
 DrawIconOnStatusBar(StatusBar, MainMenuImageList, 13, Point(4, 4));
 StatusBar.Canvas.TextOut(Rect.Left+4+16, Rect.Top+3, Panel.Text);
end;


Не видно иконки :(


 
Palladin ©   (2008-01-16 15:29) [4]

ну млин... у меня все рисует... и что значит поинт(4,4) тебе Рект передается для рисования... индекс панели тоже учитывай, тебе Панел передается, а может и картинки то с таким номером нет


 
ПостОвый терминатор ©   (2008-01-16 15:37) [5]

procedure TForm1.FormCreate(Sender: TObject);
begin
with Image1 do
 begin
   Parent := StatusBar1;
   Top := 5;
   Left := 2;
 end;
end;


 
Kolan ©   (2008-01-16 15:45) [6]

> тебе Рект передается для рисования

Забыл. :Работает :) А клик по этой панели поймать низя? В инспекторе у нее вообще нет событий&#133


 
Palladin ©   (2008-01-16 15:46) [7]


> [5] ПостОвый терминатор ©   (16.01.08 15:37)

казалось бы причем тут image1


> [6] Kolan ©   (16.01.08 15:45)

по панели нельзя... придется ловить по статусбару и немножечко считать...


 
Kolan ©   (2008-01-16 15:59) [8]

> немножечко считать&#133

procedure TMainForm.StatusBarDblClick(Sender: TObject);
var
 CursorPos: TPoint;
begin
 if Sender is TStatusBar then
   with Sender as TStatusBar do
   begin
     if GetCursorPos(CursorPos) then
     begin
       if (Panels.Count >= 2)
         and ((CursorPos.X > Panels[0].Width) and (CursorPos.X < Panels[0].Width + Panels[1].Width ))
       then
         CreatePeriodAction.Execute;
     end;
   end;
end;


Как-то так? Толкьо блин с координатами не пойму как правильно разобраться&#133


 
Palladin ©   (2008-01-16 16:03) [9]

procedure TForm1.StatusBar1Click(Sender: TObject);
Var
p:TPoint;
i:Integer;
x:Integer;
begin
p:=StatusBar1.ScreenToClient(Mouse.CursorPos);
x:=0;
For i:=0 to StatusBar1.Panels.Count-1 Do
 Begin
  Inc(x,StatusBar1.Panels[i].Width);
  If x>p.X Then
   Begin
    ShowMessage("подомной панель с индексом "+IntToStr(i));
    Exit;
   End;
 End;
ShowMessage("панели где то рядом, целься лучше");
end;


 
ПостОвый терминатор ©   (2008-01-16 16:07) [10]


> Palladin ©   (16.01.08 15:46) [7]
>
> > [5] ПостОвый терминатор ©   (16.01.08 15:37)
>
> казалось бы причем тут image1

Просто мне показалось, что это довольно простое решение отвечающее

> Хм, а как запуздырить иконку в StatusBar?

Ведь о функциональности этой иконки автор умалчивает.
А на TImage можно повесить практически любые события ...


 
Palladin ©   (2008-01-16 16:09) [11]


> [10] ПостОвый терминатор ©   (16.01.08 16:07)

если внимательно приглядишься, афтар поступил несоизмеримо гораздо более разумно нежели плодить кучу TImage, а обвешивание иконок событиями - несколько строчек кода на соотвествующие события TStatusBar


 
ПостОвый терминатор ©   (2008-01-16 16:11) [12]


> Palladin ©   (16.01.08 16:09) [11]

Возможно


 
Kolan ©   (2008-01-16 16:26) [13]

Благодарю, круто.  :)
procedure TMainForm.StatusBarDblClick(Sender: TObject);
begin
 if Sender is TStatusBar then
 begin
   if GetPanelIndexAtCursor(Sender as TStatusBar) = 1 then
     ChooseCurrentPeriodAction.Execute;
 end;    
end;

function TMainForm.GetPanelIndexAtCursor(AStatusBar: TStatusBar): Integer;
var
 I: Integer;
 CursorPos: TPoint;
 X: Integer;
begin
 Result := &#151;1;
 if Assigned(AStatusBar) then
 begin
   CursorPos := AStatusBar.ScreenToClient(Mouse.CursorPos);
   X := 0;
   for I := 0 to AStatusBar.Panels.Count &#151; 1 do
   begin
     X := X + AStatusBar.Panels[I].Width;
     if X > CursorPos.X then
     begin
       Result := I;
       Exit;
     end;
   end;
 end;
end;


 
Palladin ©   (2008-01-16 16:32) [14]

if Sender is TStatusBar then
begin
 if GetPanelIndexAtCursor(Sender as TStatusBar) = 1 then ChooseCurrentPeriodAction.Execute;
end;    

as зря, приведением типов будет быстрее и абсолютно правомерно, бо ты уже проверил используя is

здесь это конечно не критично, но просто на будущее, если планируется частый частый вызов подобной конструкции


 
Kolan ©   (2008-01-16 16:38) [15]

>
> здесь это конечно не критично, но просто на будущее, если
> планируется частый частый вызов подобной конструкции

ок. Запомню, незнал что быстрее.

А где стандартная процедура подставляет смещение для текста, вот эти циферки:
StatusBar.Canvas.TextOut(Rect.Left+5+MainMenuImageList.Width, Rect.Top+3, Panel.Text);

Я щас растянул бар, и моя надпись уже не на одном уровне со стандартно нарисованной. Видимо стандартная вычисляет как-то, но не найду как.



Страницы: 1 вся ветка

Текущий архив: 2008.02.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
1-1193959547
яблочго
2007-11-02 02:25
2008.02.10
Движение точки по окружности


15-1200053321
Darvin
2008-01-11 15:08
2008.02.10
Долгая инсталляция в висте с включенным UAC


15-1200021355
Slider007
2008-01-11 06:15
2008.02.10
С днем рождения ! 11 января 2008 пятница


3-1191002264
Dik59
2007-09-28 21:57
2008.02.10
Коды завершения


2-1200310863
КуХ
2008-01-14 14:41
2008.02.10
Кодировка