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

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

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


Kolan ©   (2008-01-16 14:45:00) 

Пробовал так:
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;

не видно ничего…


Kolan   (2008-01-16 16:38:00) [1]

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

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

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

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


Palladin   (2008-01-16 16:32:00) [2]

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

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

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


Kolan   (2008-01-16 16:26:00) [3]

Благодарю, круто.  :)
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 := —1;
 if Assigned(AStatusBar) then
 begin
   CursorPos := AStatusBar.ScreenToClient(Mouse.CursorPos);
   X := 0;
   for I := 0 to AStatusBar.Panels.Count — 1 do
   begin
     X := X + AStatusBar.Panels[I].Width;
     if X > CursorPos.X then
     begin
       Result := I;
       Exit;
     end;
   end;
 end;
end;


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


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

Возможно


Palladin   (2008-01-16 16:09:00) [5]


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

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


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


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

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

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

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


Palladin   (2008-01-16 16:03:00) [7]

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;


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

> немножечко считать…

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;


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


Palladin   (2008-01-16 15:46:00) [9]


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

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


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

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


Kolan   (2008-01-16 15:45:00) [10]

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

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


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

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


Palladin   (2008-01-16 15:29:00) [12]

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


Kolan   (2008-01-16 15:21:00) [13]

Так:
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;


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


Kolan   (2008-01-16 15:13:00) [14]

угу, шас попробую…


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

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


Наверх

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