|
MathiasSimmack
(Gast)
n/a Beiträge |
#1
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]; |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |