Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 

Balloon-Tipps für TNA-Programme

  Alt 5. Jul 2002, 21:10
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:
[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];
Als neue Konstanten haben wir die folgenden Definitionen:
Code:
[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;
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:
Code:
[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].
Und so sieht´s dann im Programm aus:
Code:
[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]
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:
Code:
[b]const[/b]
  WM_TRAYMSG = WM_USER + 10;

[i]{ ... }[/i]

NID.uCallbackMessage := WM_TRAYMSG;
Die Auswertung der neuen NIN_???-Nachrichten sieht dann z.B. so aus:
Code:
[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];
In den "Win32-API-Tutorials für Delphi" werdet ihr (sobald sie online sind) das komplette Beispiel inkl. TNA-Tutorial finden.
  Mit Zitat antworten Zitat