AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Balloon-Tipps für TNA-Programme

Ein Thema von MathiasSimmack · begonnen am 5. Jul 2002
Antwort Antwort
MathiasSimmack
(Gast)

n/a Beiträge
 
#1

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
Antwort Antwort

Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz