![]() |
Balloon-Tipps für TNA-Programme
Für die neuen Balloon-Tooltipps von TNA-Icons müssen wir zunächst die "TNotifyIconData"-Struktur erweitern. Das ist IMHO auch bei Delphi6 erforderlich. Die Ansi- und Unicode-Versionen (zu finden in der "ShellAPi.pas") sollten nach den Ergänzungen so aussehen:
Code:
Als neue Konstanten haben wir die folgenden Definitionen:
[b]type[/b]
_NOTIFYICONDATAA = [b]record[/b] cbSize: DWORD; Wnd: HWND; uID: UINT; uFlags: UINT; uCallbackMessage: UINT; hIcon: HICON; szTip: [b]array[/b] [0..127] [b]of[/b] AnsiChar; dwState: DWORD; dwStateMask: DWORD; szInfo: [b]array[/b][0..255][b]of[/b] AnsiChar; [b]case[/b] integer [b]of[/b] 0: (uTimeout: UINT); 1: (uVersion: UINT; szInfoTitle: [b]array[/b][0..63][b]of[/b] AnsiChar; dwInfoFlags: DWORD; guidItem : TGuid; ) [b]end[/b]; _NOTIFYICONDATAW = [b]record[/b] cbSize: DWORD; Wnd: HWND; uID: UINT; uFlags: UINT; uCallbackMessage: UINT; hIcon: HICON; szTip: [b]array[/b] [0..127] [b]of[/b] WideChar; dwState: DWORD; dwStateMask: DWORD; szInfo: [b]array[/b][0..255][b]of[/b] WideChar; [b]case[/b] integer [b]of[/b] 0: (uTimeout: UINT); 1: (uVersion: UINT; szInfoTitle: [b]array[/b][0..63][b]of[/b] WideChar; dwInfoFlags: DWORD; guidItem : TGuid; ) [b]end[/b];
Code:
Die zuletzt definierten Konstanten helfen uns, das TNA-Programm so zu gestalten, dass wir immer die korrekte Strukturgröße benutzen. Dazu nehmen wir einfach die Funktion "DllGetVersion", die u.a. von der SHELL32.DLL exportiert wird. Dafür gibt´s diese Mini-Unit:
[b]const[/b]
[color=#000080][i]{$EXTERNALSYM NIN_SELECT}[/i][/color] NIN_SELECT = WM_USER + 0; [color=#000080][i]{$EXTERNALSYM NINF_KEY}[/i][/color] NINF_KEY = $01; [color=#000080][i]{$EXTERNALSYM NIN_KEYSELECT}[/i][/color] NIN_KEYSELECT = NIN_SELECT [b]or[/b] NINF_KEY; [color=#000080][i]{$EXTERNALSYM NIN_BALLOONSHOW}[/i][/color] NIN_BALLOONSHOW = WM_USER + 2; [color=#000080][i]{$EXTERNALSYM NIN_BALLOONHIDE}[/i][/color] NIN_BALLOONHIDE = WM_USER + 3; [color=#000080][i]{$EXTERNALSYM NIN_BALLOONTIMEOUT}[/i][/color] NIN_BALLOONTIMEOUT = WM_USER + 4; [color=#000080][i]{$EXTERNALSYM NIN_BALLOONUSERCLICK}[/i][/color] NIN_BALLOONUSERCLICK = WM_USER + 5; [color=#000080][i]{$EXTERNALSYM NIM_SETFOCUS}[/i][/color] NIM_SETFOCUS = $00000003; [color=#000080][i]{$EXTERNALSYM NIM_SETVERSION}[/i][/color] NIM_SETVERSION = $00000004; [color=#000080][i]{$EXTERNALSYM NOTIFYICON_VERSION}[/i][/color] NOTIFYICON_VERSION = 3; [color=#000080][i]{$EXTERNALSYM NIF_STATE}[/i][/color] NIF_STATE = $00000008; [color=#000080][i]{$EXTERNALSYM NIF_INFO}[/i][/color] NIF_INFO = $00000010; [color=#000080][i]{$EXTERNALSYM NIF_GUID}[/i][/color] NIF_GUID = $00000020; [color=#000080][i]{$EXTERNALSYM NIS_HIDDEN}[/i][/color] NIS_HIDDEN = $00000001; [color=#000080][i]{$EXTERNALSYM NIS_SHAREDICON}[/i][/color] NIS_SHAREDICON = $00000002; [color=#000080][i]// says this is the source of a shared icon // Notify Icon Infotip flags {$EXTERNALSYM NIIF_NONE}[/i][/color] NIIF_NONE = $00000000; [color=#000080][i]// icon flags are mutualy exclusive // and take only the lowest 2 bits {$EXTERNALSYM NIIF_INFO}[/i][/color] NIIF_INFO = $00000001; [color=#000080][i]{$EXTERNALSYM NIIF_WARNING}[/i][/color] NIIF_WARNING = $00000002; [color=#000080][i]{$EXTERNALSYM NIIF_ERROR}[/i][/color] NIIF_ERROR = $00000003; [color=#000080][i]{$EXTERNALSYM NIIF_ICON_MASK}[/i][/color] NIIF_ICON_MASK = $0000000F; [color=#000080][i]{$EXTERNALSYM NIIF_NOSOUND}[/i][/color] NIIF_NOSOUND = $00000010; [b]const[/b] [color=#000080][i]{$EXTERNALSYM NOTIFYICONDATAA_V1_SIZE}[/i][/color] NOTIFYICONDATAA_V1_SIZE = 88; [color=#000080][i]{$EXTERNALSYM NOTIFYICONDATAW_V1_SIZE}[/i][/color] NOTIFYICONDATAW_V1_SIZE = 152; [color=#000080][i]{$EXTERNALSYM NOTIFYICONDATA_V1_SIZE}[/i][/color] NOTIFYICONDATA_V1_SIZE = NOTIFYICONDATAA_V1_SIZE; [color=#000080][i]{$EXTERNALSYM NOTIFYICONDATAA_V2_SIZE}[/i][/color] NOTIFYICONDATAA_V2_SIZE = sizeof(NOTIFYICONDATAA) - (sizeof(TGUID)); [color=#000080][i]{$EXTERNALSYM NOTIFYICONDATAW_V2_SIZE}[/i][/color] NOTIFYICONDATAW_V2_SIZE = sizeof(NOTIFYICONDATAW) - (sizeof(TGUID)); [color=#000080][i]{$EXTERNALSYM NOTIFYICONDATA_V2_SIZE}[/i][/color] NOTIFYICONDATA_V2_SIZE = NOTIFYICONDATAA_V2_SIZE;
Code:
Und so sieht´s dann im Programm aus:
[b]unit[/b] DllVersion;
[b]interface[/b] [b]uses[/b] Windows; [b]type[/b] [color=#000080][i]{$EXTERNALSYM _DLLVERSIONINFO}[/i][/color] _DLLVERSIONINFO = [b]packed[/b] [b]record[/b] cbSize, dwMajorVersion, dwMinorVersion, dwBuildNumber, dwPlatformID : dword; [b]end[/b]; TDllVersionInfo = _DLLVERSIONINFO; [color=#000080][i]{$EXTERNALSYM _DLLVERSIONINFO2}[/i][/color] _DLLVERSIONINFO2 = [b]packed[/b] [b]record[/b] info1 : _DLLVERSIONINFO; dwFlags : dword; ul1Version : ULONG; [b]end[/b]; TDllVersionInfo2 = _DLLVERSIONINFO2; [b]type[/b] TDllGetVersion = [b]function[/b](pdvi: POINTER): HRESULT; [b]stdcall[/b]; [b]var[/b] DllGetVersion : TDllGetVersion; [b]implementation[/b] [b]end[/b].
Code:
Wenn wir auf das Erscheinen oder Verschwinden des Balloon-Tipps reagieren wollen, dann müssen wir die neuen NIN_???-Nachrichten heranziehen, die als "LPARAM" an unsere TNA-Nachricht weitergereicht werden. Die TNA-Nachricht ist die, die die meisten so deklarieren:
[b]uses[/b]
DllVersion; [b]var[/b] shell32_ver : dword = 400; [color=#000080][i]// Standardversion 4.0 der "shell32.dll"[/i][/color] dll : DWORD = 0; ver : TDllVersionInfo; [color=#000080][i]{ ... } // Version der "shell32.dll" herausfinden[/i][/color] dll := LoadLibrary('shell32.dll'); [b]if[/b](dll <> 0) [b]then[/b] [b]begin[/b] DllGetVersion := GetProcAddress(dll,'DllGetVersion'); [b]if[/b](@DllGetVersion <> [b]nil[/b]) [b]then[/b] [b]begin[/b] fillchar(ver,sizeof(TDllVersionInfo),0); ver.cbSize := sizeof(TDllVersionInfo); [b]if[/b](DllGetVersion(@ver) = NOERROR) [b]then[/b] shell32_ver := (ver.dwMajorVersion * 100) + ver.dwMinorVersion; [b]end[/b]; FreeLibrary(dll); [b]end[/b]; [color=#000080][i]// abhängig von der "shell32.dll" die Strukturgröße setzen![/i][/color] [b]if[/b](shell32_ver = 600) [b]then[/b] NID.cbSize := sizeof(TNotifyIconData) [b]else[/b] [b]if[/b](shell32_ver >= 500) [b]then[/b] NID.cbSize := NOTIFYICONDATA_V2_SIZE [b]else[/b] NID.cbSize := NOTIFYICONDATA_V1_SIZE; [color=#000080][i]// Balloon-Tipps nur ab "shell32.dll" Version 5.0[/i][/color] [b]if[/b](shell32_ver >= 500) [b]then[/b] [b]begin[/b] NID.uFlags := NID.uFlags [b]or[/b] NIF_INFO; NID.szInfo := 'Ein Beispiel für einen neuen Balloon-Tipp,' + #13#10 + 'der auch mehrzeilig sein kann.'; NID.szInfoTitle := 'Taskbar-Demo'; NID.dwInfoFlags := NIIF_INFO; [b]end[/b]; Shell_NotifyIcon(NIM_ADD,@NID); [color=#000080][i]{ ... }[/i][/color]
Code:
Die Auswertung der neuen NIN_???-Nachrichten sieht dann z.B. so aus:
[b]const[/b]
WM_TRAYMSG = WM_USER + 10; [i]{ ... }[/i] NID.uCallbackMessage := WM_TRAYMSG;
Code:
In den "Win32-API-Tutorials für Delphi" werdet ihr (sobald sie online sind) das komplette Beispiel inkl. TNA-Tutorial finden.
[b]case[/b] uMsg [b]of[/b]
WM_TRAYMSG: [b]case[/b] lp [b]of[/b] NIN_BALLOONSHOW: MessageBox(0,'I see the balloon! :o)',szClassname, MB_OK [b]or[/b] MB_ICONINFORMATION); NIN_BALLOONHIDE: MessageBox(0,'It´s gone ... :o(',szClassname, MB_OK [b]or[/b] MB_ICONINFORMATION); [b]end[/b]; [b]end[/b]; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz