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

Вниз

Можно ли узнать координаты иконки в трее?   Найти похожие ветки 

 
Denis ©   (2005-07-14 13:22) [0]

Приветствую всех. Вопрос в теме...
Если можно, то какие функции нужно использовать?

Вообще задача - открывать форму с сообщением (в виде выноски) возле трея так, чтобы выноска всегда указывала на иконку приложения.


 
Игорь Шевченко ©   (2005-07-14 13:23) [1]

Нельзя, AFAIK


 
Slym ©   (2005-07-14 14:58) [2]

Зы типа БалонТип? Тебе никакого окна создавать не надо и координаты не нужны:

type
 TNotifyIconDataV5 =record
   cbSize: DWORD;
   hWnd: HWND;
   uID: UINT;
   uFlags: UINT;
   uCallbackMessage: UINT;
   hIcon: HICON;
   szTip: array [0..MAXCHAR] of AnsiChar;
   dwState: DWORD;
   dwStateMask: DWORD;
   szInfo: array [0..MAXBYTE] of AnsiChar;
   uTimeoutVersion:UINT;
   szInfoTitle: array [0..63] of AnsiChar;
   dwInfoFlags: DWORD;
 end;

const
 //uFlags
 NIF_INFO         = $00000010;

var NID:TNotifyIconDataV5;
begin
 NID.uFlags:=NID.uFlags or NIF_INFO;
 Move(PChar(Title)^,NID.szInfoTitle,Min(Length(Title),SizeOf(NID.szInfoTitle)));
 Move(PChar(Msg)^,NID.szInfo,Min(Length(Msg),SizeOf(NID.szInfo)));
 NID.uTimeoutVersion:=TimeOut* 1000;
 NID.dwInfoFlags:=InfoFlag;
 Shell_NotifyIcon(NIM_MODIFY,@NID);
end;


 
Пифагор   (2005-07-14 20:22) [3]

2 Игорь Шевченко ©   (14.07.05 13:23) [1]
Можно с помощью циркуля и линейки, в принципе можно обойтись и без циркуля


 
DVM ©   (2005-07-15 11:53) [4]

Под win95/98 практически невозможно, под Win2000/xp возможно, но там это и не нужно, т.к. есть возможность создавать такие выноски с пом БалонТайпов или на основе их.


 
Alexander Panov ©   (2005-07-15 12:37) [5]

Slym ©   (14.07.05 14:58) [2]
DVM ©   (15.07.05 11:53) [4]

А кто сказал, что автору нужно узнавать координаты иконки, созданной в своей программе?


 
Slym ©   (2005-07-15 13:59) [6]

Удалено модератором
Примечание: Хочешь поговорить, тогда в чат


 
Alexander Panov ©   (2005-07-15 16:30) [7]

Slym ©   (15.07.05 13:59) [6]
Ты отвечаещь на вопрос или хамищЪ отвечающим?


В чем дело?
Хочешь поговорить об этом?


 
Alexander Panov ©   (2005-07-15 16:32) [8]

Slym ©   (15.07.05 13:59) [6]
Согласен... Если ставить вопрос так: "Как програмно узнать координаты моей рожи на этой фотке" - то никак...


1. Про рожи на фотографии вопроса не было.

Slym ©   (15.07.05 13:59) [6]
Хотя системы распознования образов никто не отменял


Это к чему? Будем прикручивать FineReader?


 
DVM ©   (2005-07-17 17:10) [9]


> Alexander Panov ©   (15.07.05 12:37) [5]
> Slym ©   (14.07.05 14:58) [2]
> DVM ©   (15.07.05 11:53) [4]
>
> А кто сказал, что автору нужно узнавать координаты иконки,
> созданной в своей программе?

Я вообще то не про свою программу.


 
Denis ©   (2005-07-19 10:13) [10]

Добрался наконец сюда)
2 Slym: я читал о таких выносках в статьях DelphiWorld, но непонятно было, можно ли к ним прикрутить обработчики событий.
Потому и остановился на форме в виде выноски - если ее закрыть кнопкой приложение дальше переходит в режим ожидания, а двойной щелчок по ней раскрывает окно программы  с обновленными данными.
насколько я понял  БалонТайпы позволяют просто показать какой-то текст.


 
DVM ©   (2005-07-19 10:17) [11]


> насколько я понял  БалонТайпы позволяют просто показать
> какой-то текст.

Неправильно ты понял. Там могут быть кнопки и прочее.


 
Denis ©   (2005-07-19 12:16) [12]

2 DVM ©
Можешь подсказать где взять информацию о работе с ними?


 
DVM ©   (2005-07-19 15:13) [13]

как ни банально msdn


 
Slym ©   (2005-07-20 04:44) [14]

unit TrayIcon;

interface
uses windows,ShellAPI,messages,Classes,Graphics,Controls,SysUtils,Menus;

type
 TNotifyIconDataV5 =record
   cbSize: DWORD;
   hWnd: HWND;
   uID: UINT;
   uFlags: UINT;
   uCallbackMessage: UINT;
   hIcon: HICON;
   szTip: array [0..MAXCHAR] of AnsiChar;
   dwState: DWORD;
   dwStateMask: DWORD;
   szInfo: array [0..MAXBYTE] of AnsiChar;
   uTimeoutVersion:UINT;
   szInfoTitle: array [0..63] of AnsiChar;
   dwInfoFlags: DWORD;
 end;

const
 //uFlags
 NIF_STATE        = $00000008;
 NIF_INFO         = $00000010;
 NIF_GUID         = $00000020;

 //dwInfoFlags
 NIIF_NONE = $00000000;
 NIIF_INFO = $00000001;
 NIIF_WARNING = $00000002;
 NIIF_ERROR = $00000003;
 //NIIF_USER =

const
 WM_TOOLTRAYICON = WM_USER+1;
type
 TMouseEvent = procedure(Sender: TObject; Button: TMouseButton) of object;

 TTrayIcon=class(TComponent)
 private
   FHwnd:Longint;
   FIcon:TIcon;
   FToolTip:String;
   FVisible: boolean;
   FPopupMenu:TPopupMenu;
   FOnMouseDown: TMouseEvent;
   FOnMouseMove: TNotifyEvent;
   FOnMouseUp: TMouseEvent;
   FOnDblClick: TMouseEvent;

   procedure MessageProc(var Message: TMessage);
   procedure SetVisible(const Value: boolean);
   procedure SetToolTip(Value:String);
   procedure SetIcon(AIcon:TIcon);
   function IsIconStored: Boolean;
   procedure SetPopupMenu(const Value:TPopupMenu);
 protected
   procedure PrepareData(var NotifyIconData:TNotifyIconDataV5);virtual;
   procedure OnIconChange(Sender:TObject);
   procedure Notification(AComponent: TComponent; Operation: TOperation);override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   procedure Show;
   procedure Hide;
   procedure ShowBallonTip(const Title,Msg:string;InfoFlag:integer=NIIF_INFO;TimeOut:integer=10);
 published
   property Icon:TIcon read FIcon write SetIcon stored IsIconStored;
   property ToolTip:String read FToolTip write SetToolTip stored true;
   property Visible:boolean read FVisible write SetVisible stored true;
   property PopupMenu:TPopupMenu read FPopupMenu write SetPopupMenu;
   property OnDblClick: TMouseEvent read FOnDblClick write FOnDblClick;
   property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
   property OnMouseMove: TNotifyEvent read FOnMouseMove write FOnMouseMove;
   property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp ;
 end;

procedure Register;

implementation

{ TTrayIcon }

constructor TTrayIcon.Create(AOwner: TComponent);
begin
 FIcon:=TIcon.Create;
 fIcon.OnChange:=OnIconChange;
 FHwnd:=AllocateHwnd(MessageProc);
 inherited;
end;

destructor TTrayIcon.Destroy;
begin
 Hide;
 DeallocateHWnd(FHwnd);
 FIcon.Free;
 inherited;
end;

function Min(A,B:integer):integer;
begin
 if A<=B then
   result:=A
 else
   result:=B;
end;

procedure TTrayIcon.PrepareData(var NotifyIconData:TNotifyIconDataV5);
begin
 FillChar(NotifyIconData,SizeOf(NotifyIconData),#0);
 NotifyIconData.cbSize:=SizeOf(NotifyIconData);
 NotifyIconData.uID:=integer(self);
 NotifyIconData.hWnd:=FHwnd;
 NotifyIconData.uCallbackMessage:=WM_TOOLTRAYICON;
 NotifyIconData.uFlags:=NIF_MESSAGE;
end;

procedure TTrayIcon.Show;
var NID:TNotifyIconDataV5;
begin
 if csDesigning in ComponentState then
 begin
   FVisible:=true;
   exit;
 end;
 if FVisible then exit;

 PrepareData(NID);
 if not FIcon.Empty then
 begin
   NID.hIcon:=FIcon.Handle;
   NID.uFlags:=NID.uFlags or NIF_ICON;
 end;
 if Length(FToolTip)>0 then
 begin
   Move(PChar(FToolTip)^,NID.szTip,Min(Length(FToolTip),SizeOf(NID.szTip)));
   NID.uFlags:=NID.uFlags or NIF_TIP;
 end;
 FVisible:=Shell_NotifyIcon(NIM_ADD,@NID);
end;

procedure TTrayIcon.Hide;
var NID:TNotifyIconDataV5;
begin
 if not FVisible then exit;
 PrepareData(NID);
 Shell_NotifyIcon(NIM_DELETE,@NID);
 FVisible:=false;
end;

procedure TTrayIcon.ShowBallonTip(const Title,Msg:string;InfoFlag:integer=NIIF_INFO;TimeOut:integer=10);
var NID:TNotifyIconDataV5;
begin
 if not FVisible then exit;
 PrepareData(NID);
 NID.uFlags:=NID.uFlags or NIF_INFO;
 Move(PChar(Title)^,NID.szInfoTitle,Min(Length(Title),SizeOf(NID.szInfoTitle)));
 Move(PChar(Msg)^,NID.szInfo,Min(Length(Msg),SizeOf(NID.szInfo)));
 NID.uTimeoutVersion:=TimeOut* 1000;
 NID.dwInfoFlags:=InfoFlag;
 Shell_NotifyIcon(NIM_MODIFY,@NID);
end;

procedure TTrayIcon.MessageProc(var Message: TMessage);
var CurPos:TPoint;
begin
 if Message.Msg<>WM_TOOLTRAYICON then exit;
 case Message.LParam of
   WM_MOUSEMOVE      : if assigned(FOnMouseMove) then FOnMouseMove(self);
   WM_LBUTTONDOWN    : if assigned(FOnMouseDown) then FOnMouseDown(self,mbLeft);
   WM_LBUTTONUP      : if assigned(FOnMouseUp) then FOnMouseUp(self,mbLeft);
   WM_LBUTTONDBLCLK  : if assigned(OnDblClick) then OnDblClick(self,mbLeft);
   WM_RBUTTONDOWN    :
     begin
       if assigned(FOnMouseDown) then
         FOnMouseDown(self,mbRight);
       If Assigned(FPopupMenu) then
       begin
         GetCursorPos(CurPos);
         FPopupMenu.Popup(CurPos.x,CurPos.y);
         PostMessage(FHWND,WM_USER,0,0);
       end;
     end;
   WM_RBUTTONUP      : if assigned(FOnMouseUp) then FOnMouseUp(self,mbRight);
   WM_RBUTTONDBLCLK  : if assigned(OnDblClick) then OnDblClick(self,mbRight);
   WM_MBUTTONDOWN    : if assigned(FOnMouseDown) then FOnMouseDown(self,mbMiddle);
   WM_MBUTTONUP      : if assigned(FOnMouseUp) then FOnMouseUp(self,mbMiddle);
   WM_MBUTTONDBLCLK  : if assigned(OnDblClick) then OnDblClick(self,mbMiddle);
 end;
end;

procedure TTrayIcon.OnIconChange(Sender: TObject);
var NID:TNotifyIconDataV5;
begin
 if not FVisible then exit;
 PrepareData(NID);
 NID.uFlags:=NID.uFlags or NIF_ICON;
 NID.hIcon:=FIcon.Handle;
 Shell_NotifyIcon(NIM_MODIFY,@NID);
end;

procedure TTrayIcon.SetToolTip(Value: String);
var NID:TNotifyIconDataV5;
begin
 FToolTip:=Value;
 if not FVisible then exit;


 
Slym ©   (2005-07-20 04:44) [15]

 PrepareData(NID);
 NID.uFlags:=NID.uFlags or NIF_TIP;
 if Length(FToolTip)>0 then
   Move(PChar(FToolTip)^,NID.szTip,Min(Length(FToolTip),SizeOf(NID.szTip)));
 Shell_NotifyIcon(NIM_MODIFY,@NID);
end;

procedure TTrayIcon.SetIcon(AIcon: TIcon);
begin
 FIcon.Assign(AIcon);
end;

procedure TTrayIcon.SetVisible(const Value: boolean);
begin
 if Value then
   Show
 else
   Hide;
end;

function TTrayIcon.IsIconStored: Boolean;
begin
 Result := Icon.Handle <> 0;
end;

procedure TTrayIcon.Notification(AComponent: TComponent; Operation: TOperation);
begin
 inherited Notification(AComponent,Operation);
 If (Operation=opRemove) and (AComponent=PopupMenu) then PopupMenu:=nil;
end;

procedure TTrayIcon.SetPopupMenu(const Value: TPopupMenu);
begin
 FPopupMenu:=Value;
 If Value<>nil then Value.FreeNotification(self);
end;

procedure Register;
begin
 RegisterComponents("Samples", [TTrayIcon]);
end;

end.


 
Джо ©   (2005-07-20 05:07) [16]


> [14] Slym ©   (20.07.05 04:44)

Новые лисапеды появились?



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

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

Наверх




Память: 0.52 MB
Время: 0.042 c
5-1095460856
Чайник
2004-09-18 02:40
2005.09.04
Не понял! Цвета палитры виндовс (типа clBtnShadow и т.д)


2-1071249455
iWantToKnow
2003-12-12 20:17
2005.09.04
Вопросы по тематике :)))


2-1065376913
Оля85
2003-10-05 22:01
2005.09.04
Как вычислить значение функции


14-1123732274
Думкин
2005-08-11 07:51
2005.09.04
11 августа. С днем рождения.


14-1122646602
TUser
2005-07-29 18:16
2005.09.04
Басаев на TV