Текущий архив: 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.5 MB
Время: 0.011 c