C++ Builder Snippets  

TrayIcon-Funktionalität in BCB-Anwendungen implementieren:
 
Jeder Windows-Anwender kennt die anklickbaren Symbole im rechten Bereich der Taskleste, die besonders gerne von den im Hintergrund laufenden Programmen (Virenscanner, Uhr, Lautstärkeregelung, Grafikkarten-Utilities, PGP etc.) benutzt werden um dem Anwender Status-Informationen grafisch anzuzeigen und/oder den Zugrif auf Programmfunktionen und -Einstellungen zu ermöglichen.

SP (AKA Sven) hat sich mit der Implementierung dieser Funktionalität beschäftigt und seinen Code zur Veröffentlichung auf diesen Seiten freigegeben. Vielen Dank !



Originalcode von SP AKA Sven:

Hier mal ein Beispiel für eine TrayIcon Anwendung. Programmiert mit dem BCB 1 Standard

Verwendete Komponenten: TPopupMenu "PopupMenu1"

Projekt1.cpp

//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {
    Application->Initialize();
    //--------------------------------------
    //Damit das Formualr nicht angezeit wird
    //--------------------------------------
    ShowWindow(Application->Handle,SW_HIDE);
    Application->ShowMainForm = false;
    //--------------------------------------
    Application->CreateForm(__classid(TForm1), &Form1);
    Application->Run();
  }
  catch (Exception &exception)
  {
    Application->ShowException(&exception);
  }
  return 0;
}
//---------------------------------------------------------------------------

Unit1.h

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
#include <vcl\Menus.hpp>
//---------------------------------------------------------------------------
#define WM_TRAYICON_MELDUNG  (WM_USER + 1001)
class TForm1 : public TForm
{
  __published:    // IDE-verwaltete Komponenten
    TPopupMenu *PopupMenu1;
    TMenuItem *Aus1;
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall Aus1Click(TObject *Sender);
  private:        // Benutzer-Deklarationen
  public:         // Benutzer-Deklarationen
    __fastcall TForm1(TComponent* Owner);

    Graphics::TIcon *TrayIcon;
    void __fastcall WM_TRAYICON(TMessage &Msg);
    void __fastcall Icon_Entfernen();
    void __fastcall Icon_Einfuegen();
  BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_TRAYICON_MELDUNG,TMessage,WM_TRAYICON)
  END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cpp

//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <shellapi.h>
//---------------------------------------------------------------------------
//TrayIcon Einstellungen
//---------------------------------------------------------------------------
const int   IDC_TRAY1             = 1005;

// Wird angezeigt wenn man mit der Maus über das Symbol geht
const char *TrayIcon_Hint_Meldung = "TrayIcon Programm";

//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
  // Hier wird das Programmsymbol geladen
  TrayIcon = new Graphics::TIcon;
  TrayIcon->Handle=LoadImage(HInstance, "MAINICON", IMAGE_ICON, 0,0, 0);
  // Jetzt wird der Icon in die Taskleiste geschoben
  Icon_Einfuegen();
}

//---------------------------------------------------------------------------
void __fastcall TForm1::WM_TRAYICON(TMessage &Msg)
{
  // Das hier ist die Message Routine die ausgelöst wird wenn man auf
  // den Icon klickt.
  //Welche Maustaste benutzt wurde ist im Msg mit übergeben.
  switch(Msg.LParam)
  {
    case WM_RBUTTONUP:
      //Das hier wird ausgelöst wenn die rechte Maustaste gedrückt wurde.
      //Es wird das PopUp Menu über dem Icon (Maus Position) geöffnet.
      POINT MausPosition;
      GetCursorPos(&MausPosition);
      SetForegroundWindow(Handle);
      PopupMenu1->Popup(MausPosition.x,MausPosition.y);
      PostMessage(Handle, WM_NULL, 0,0);
      break;
    case WM_LBUTTONDBLCLK:
      //Das hier wird ausgelöst wenn die linke Maustaste zwo mal,also
      //nen Doppelklick, gedrückt wurde.
      //Jetzt wird das Formular gezeigt.
      Visible = true;
      ShowWindow(Application->Handle, SW_SHOW);
      break;
  }
}

//-------------------------------------------------------
void __fastcall TForm1::Icon_Einfuegen()
{
  // Hier wird der Icon in die Taskleite gepackt.
  NOTIFYICONDATA TrayIcon_Handle;
  TrayIcon_Handle.cbSize = sizeof(NOTIFYICONDATA);
  TrayIcon_Handle.uID    = IDC_TRAY1;
  TrayIcon_Handle.hWnd   = Handle;
  TrayIcon_Handle.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
  TrayIcon_Handle.uCallbackMessage = WM_TRAYICON_MELDUNG;
  lstrcpy(TrayIcon_Handle.szTip, TrayIcon_Hint_Meldung);
  TrayIcon_Handle.hIcon  = TrayIcon->Handle;
  Shell_NotifyIcon(NIM_ADD,&TrayIcon_Handle);
}

//-------------------------------------------------------
void __fastcall TForm1::Icon_Entfernen()
{
  // Hier wird der Icon wieder entfernt
  NOTIFYICONDATA TrayIcon_Handle;
  TrayIcon_Handle.cbSize = sizeof(NOTIFYICONDATA);
  TrayIcon_Handle.uID    = IDC_TRAY1;
  TrayIcon_Handle.hWnd   = Handle;
  TrayIcon_Handle.hIcon  = TrayIcon->Handle;
  Shell_NotifyIcon(NIM_DELETE,&TrayIcon_Handle);
}

//-------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if(!Application->Terminated)
  {
    ShowWindow(Application->Handle, SW_HIDE);
    Visible = false;
    Action = caNone;
  }
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Aus1Click(TObject *Sender) //Aus dem PopUp Menu
{
  Icon_Entfernen();
  Application->Terminate();
}
//---------------------------------------------------------------------------

Hinweis: seit der BCB Version 3.0 liefert Borland ebenfalls ein TrayIcon-Beispielprojekt mit. Es befindet sich im Verzeichnis $BCB\Examples\Apps\TrayIcon\.


© '99-2001 by S. Kreutzmann